예제 #1
0
    void InitDefensiveness()
    {
        //decrease their top speed
        float topSpeed = baseTopSpeed;

        topSpeed -= GetModifier(topSpeed, defensiveness_);
        car_.SetMaxSpeed(topSpeed);

        if (vision_)
        {
            //make them look around more
            float lookAngle = baseLookAngle;
            lookAngle += GetModifier(lookAngle, defensiveness_);
            vision_.SetLookAngle(lookAngle);

            //make them look ahead more
            float visionDistance = baseVisionDistance;
            visionDistance += GetModifier(visionDistance, defensiveness_);
            vision_.SetVisionDistance(visionDistance);

            //make them stop more cautiously
            float stopping = baseStopping;
            stopping += GetModifier(stopping, defensiveness_);
            vision_.SetStoppingDistance(stopping);
        }

        if (error_)
        {
            //reduce the chance of distraction
            float distractionChance = baseDistractionChance;
            distractionChance -= GetModifier(distractionChance, defensiveness_);
            error_.SetDistractionChance(distractionChance);
        }

        if (purpose_)
        {
            //increase the chance of parking
            float parkChance = baseParkChance;
            parkChance += GetModifier(parkChance, inattentiveness_);
            purpose_.SetParkingChance(parkChance);
        }
    }
예제 #2
0
    void OnCollisionEnter(Collision collision)
    {
        GameObject other = collision.collider.gameObject;

        if (other.tag != "Ground")
        {
            GetComponent <AudioSource>().PlayOneShot(crashNoise_);
        }

        if (purpose_ && purpose_.enabled)
        {
            purpose_.SoundHorn();
        }

        if (tag == "Player")
        {
            return;
        }
        if (collision.relativeVelocity.magnitude > car_.GetMaxSpeed() * 0.25f)
        {
            car_.SetState(CarState.CS_CRASHED);
        }
        else
        {
            if (purpose_.enabled)
            {
                car_.MoveAwayFrom(other);
                purpose_.SetParkingChance(101.0f);
            }
        }
        if (other.tag == "Car" || other.tag == "Player")
        {
            //make sure only one car registers the event
            if (car_.DistanceToTarget() > other.GetComponent <Car>().DistanceToTarget())
            {
                eventSender_.SendEvent(TrafficEvent.TE_COLLISION);
            }
            if (error_)
            {
                car_.SetState(CarState.CS_MOVING, true);
            }
        }

        //prevent the car from locking up
        if (tag == "Player")
        {
            car_.Brake(0);
            car_.Accelerate(0);
            body_.velocity *= 0.1f;
        }
    }
예제 #3
0
    void Start()
    {
        vision_  = GetComponent <Vision>();
        error_   = GetComponent <Error>();
        purpose_ = GetComponent <Purpose>();
        car_     = GetComponent <Car>();

        if (random_)
        {
            aggression_      = Random.Range(0.0f, 1.0f);
            defensiveness_   = Random.Range(0.0f, 1.0f);
            inattentiveness_ = Random.Range(0.0f, 1.0f);

            if (purpose_)
            {
                purpose_.SetParkingChance(Random.Range(5, 50));
            }
        }
    }