示例#1
0
    // Update is called once per frame
    void Update()
    {
        FollowTracker();

        ai_drive.CheckForSkid();
        ai_drive.CalculateEngineSound();
    }
示例#2
0
    // Update is called once per frame
    void Update()
    {
        Vector3 localTarget      = drive.gameObject.transform.InverseTransformDirection(target);
        float   distanceToTarget = Vector3.Distance(target, drive.gameObject.transform.position);

        float targetAngle = Mathf.Atan2(localTarget.x, localTarget.z) * Mathf.Rad2Deg;

        float steer = Mathf.Clamp(targetAngle * steeringSensitivity, -1, 1) * Mathf.Sign(drive.currentSpeed);
        float accel = 0.5f;
        float brake = 0;

        if (distanceToTarget < 5)
        {
            brake = 0.8f; accel = 0.1f;
        }

        drive.Go(accel, steer, brake);

        if (distanceToTarget < 2) //threshold, make larger if car starts to circle waypoint
        {
            currentWayPoint++;
            if (currentWayPoint >= circuit.Waypoints.Length)
            {
                currentWayPoint = 0;
            }
            target = circuit.Waypoints[currentWayPoint].transform.position;
        }

        drive.CheckForSkid();
        drive.CalculateEngineSound();
    }
示例#3
0
    // Update is called once per frame
    void Update()
    {
        if (cpManager == null)
        {
            cpManager = m_drive.rb.gameObject.GetComponent <CheckpointManager>();
        }

        if (cpManager.lap >= RaceMonitor.totalLaps + 1)
        {
            m_drive.highAccelSound.mute = true;
            m_drive.skidSound.mute      = true;
            m_drive.CarMove(0, finishSteer, 0.5f);
            return;
        }

        float vertical   = Input.GetAxis("Vertical");   //Keyboard Input
        float horizontal = Input.GetAxis("Horizontal"); //Keyboard Input
        float brake      = Input.GetAxis("Jump");       //Keyboard Input

        if (m_drive.rb.velocity.magnitude > 1 || !RaceMonitor.racing)
        {
            lastTimeMoving = Time.time;
        }

        /*RaycastHit hit;
         * if(Physics.Raycast(m_drive.rb.gameObject.transform.position,-Vector3.up,out hit,10))
         * {
         *  if(hit.collider.gameObject.tag == "Road")
         *  {
         *      lastPosition = m_drive.rb.gameObject.transform.position;
         *      lastRotation = m_drive.rb.gameObject.transform.rotation;
         *  }
         * }*/

        if (Time.time > (lastTimeMoving + 4) || m_drive.rb.gameObject.transform.position.y < -5)
        {
            m_drive.rb.gameObject.transform.position = cpManager.lastCP.transform.position + Vector3.up * 2;
            m_drive.rb.gameObject.transform.rotation = cpManager.lastCP.transform.rotation;

            //m_drive.rb.gameObject.transform.position = lastPosition;
            //m_drive.rb.gameObject.transform.rotation = lastRotation;
            m_drive.rb.gameObject.layer         = 8;
            this.GetComponent <Ghost>().enabled = true;
            Invoke("ResetLayer", 3);
        }

        if (!RaceMonitor.racing)
        {
            vertical = 0;
        }

        m_drive.CarMove(vertical, horizontal, brake);
        m_drive.CheckForSkid();
        m_drive.CalculateEngineSound();
    }
示例#4
0
    // Update is called once per frame
    void Update()
    {
        float a = Input.GetAxis("Vertical");
        float s = Input.GetAxis("Horizontal");
        float b = Input.GetAxis("Jump");

        ds.Go(a, s, b);

        ds.CheckForSkid();
        ds.CalculateEngineSound();
    }
    void Update()
    {
        if (cpm == null)
        {
            cpm = ds.rb.GetComponent <CheckpointManager>();
        }

        if (cpm.lap == RaceMonitor.totalLaps + 1)
        {
            ds.highAccel.Stop();
            ds.Go(0.0f, finishSteer, 0.0f);
        }

        float a = Input.GetAxis("Vertical");
        float s = Input.GetAxis("Horizontal");
        float b = Input.GetAxis("Jump");

        if (ds.rb.velocity.magnitude > 1.0f || !RaceMonitor.racing)
        {
            lastTimeMoving = Time.time;
        }

        RaycastHit hit;

        if (Physics.Raycast(ds.rb.gameObject.transform.position, -Vector3.up, out hit, 10))
        {
            if (hit.collider.gameObject.tag == "road")
            {
                lastPosition = ds.rb.gameObject.transform.position;
                lastRotation = ds.rb.gameObject.transform.rotation;
            }
        }

        if (Time.time > lastTimeMoving + 4 || ds.rb.gameObject.transform.position.y < -5.0f)
        {
            ds.rb.gameObject.transform.position = cpm.lastCP.transform.position + Vector3.up * 2;
            ds.rb.gameObject.transform.rotation = cpm.lastCP.transform.rotation;
            ds.rb.gameObject.layer = 8;
            this.GetComponent <Ghost>().enabled = true;
            Invoke("ResetLayer", 3);
        }

        if (!RaceMonitor.racing)
        {
            a = 0.0f;
        }
        ds.Go(a, s, b);

        ds.CheckForSkid();
        ds.CalculateEngineSound();
    }
示例#6
0
    // Update is called once per frame
    void Update()
    {
        Vector3 localTarget     = ds.rb.gameObject.transform.InverseTransformPoint(target);
        Vector3 nextLocalTarget = ds.rb.gameObject.transform.InverseTransformPoint(nextTarget);

        float distanceToTarget = Vector3.Distance(target, ds.rb.gameObject.transform.position);

        float targetAngle     = Mathf.Atan2(localTarget.x, localTarget.z) * Mathf.Rad2Deg;
        float nextTargetAngle = Mathf.Atan2(nextLocalTarget.x, nextLocalTarget.z) * Mathf.Rad2Deg;

        float steer = Mathf.Clamp(targetAngle * steeringSensitivity, -1, 1) * Mathf.Sign(ds.currentSpeed);

        float distanceFactor = distanceToTarget / totalDistanceToTarget;
        float speedFactor    = ds.currentSpeed / ds.maxSpeed;

        float accel = 1f;
        float brake = Mathf.Lerp((-1 - Mathf.Abs(nextTargetAngle)) * brakingSensitivity, 1 + speedFactor, 1 - distanceFactor);

        Debug.Log("Brake: " + brake + " Accel: " + accel + " Speed: " + ds.rb.velocity.magnitude);

        // if(distanceToTarget < 5) { brake = 0.7f; accel = 0.3f; }

        ds.Go(accel, steer, brake);

        if (distanceToTarget < 4) // threshold, make larger if car starts to circle waypoint
        {
            currentWP++;
            if (currentWP >= circuit.waypoints.Length)
            {
                currentWP = 0;
            }
            target                = circuit.waypoints[currentWP].transform.position;
            nextTarget            = circuit.waypoints[currentWP + 1].transform.position;
            totalDistanceToTarget = Vector3.Distance(target, ds.rb.gameObject.transform.position);
        }

        ds.CheckForSkid();
        ds.CalculateEngineSound();
    }
示例#7
0
    // Update is called once per frame
    void Update()
    {
        if (cpm == null)
        {
            cpm = ds.rb.GetComponent <CheckpointManager>();
        }

        // Player stopping at lap finish
        if (cpm.lap == RaceMonitor.totalLaps + 1)
        {
            ds.highAccel.Stop();
            ds.Go(0, finishSteer, 0f);
            return;
        }

        float a = Input.GetAxis("Vertical");
        float s = Input.GetAxis("Horizontal");
        float b = Input.GetAxis("Jump");

        if (ds.rb.velocity.magnitude > 1 || !RaceMonitor.racing)
        {
            lastTimeMoving = Time.time;
        }

        RaycastHit hit;
        Vector3    downwards = transform.TransformDirection(-Vector3.up);

        if (Physics.Raycast(ds.rb.transform.position, downwards, out hit, 10f))
        {
            //Debug.DrawRay(rb.transform.position, downwards * 10, Color.yellow);
            //Debug.LogWarning("tag  : " + hit.collider.tag);

            string colliderTag = hit.collider.tag;

            if (colliderTag == "road")
            {
                //capture last road positions
                lastPosition = ds.rb.gameObject.transform.position;
                lastRotation = ds.rb.gameObject.transform.rotation;
            }
        }

        // reset car if stuck for 4 seconds
        if (Time.time > lastTimeMoving + 4 || ds.rb.gameObject.transform.position.y < -5f || ds.rb.gameObject.transform.position.y > 25f)
        {
            ds.rb.gameObject.transform.position = cpm.lastCp.transform.position + Vector3.up * 2;
            ds.rb.gameObject.transform.rotation = cpm.lastCp.transform.rotation;

            ds.rb.gameObject.layer = 8;
            this.GetComponent <Ghost>().enabled = true;
            Invoke(nameof(ResetLayer), 3f);
        }


        // this stop car movement and steering during the countdown
        if (!RaceMonitor.racing)
        {
            a = 0;
            s = 0;
            b = 0;
        }

        ds.Go(a, s, b);

        ds.CheckForSkid();
        ds.CalculateEngineSound();
    }
示例#8
0
    // Update is called once per frame
    void Update()
    {
        if (!RaceMonitor.racing)
        {
            lastTimeMoving = Time.time;
            return;
        }

        if (cpm == null)
        {
            cpm = ds.rb.GetComponent <CheckpointManager>();
        }

        if (cpm.lap == RaceMonitor.totalLaps + 1)
        {
            ds.highAccel.Stop();
            ds.Go(0, finishSteer, 0);
            return;
        }

        ProgressTracker();
        Vector3 localTarget;
        float   targetAngle;

        if (ds.rb.velocity.magnitude > 1)
        {
            lastTimeMoving = Time.time;
        }

        if (Time.time > lastTimeMoving + 4 || ds.rb.gameObject.transform.position.y < -5 || ds.rb.gameObject.transform.position.y > 10)
        {
            ds.rb.gameObject.transform.position = cpm.lastCP.transform.position;
            ds.rb.gameObject.transform.rotation = cpm.lastCP.transform.rotation;
            tracker.transform.position          = cpm.lastCP.transform.position;
            ds.rb.gameObject.layer = 8;
            this.GetComponent <Ghost>().enabled = true;
            Invoke("ResetLayer", 3);
        }

        if (Time.time < ds.rb.GetComponent <AvoidDetector>().avoidTime)
        {
            localTarget = tracker.transform.right * ds.rb.GetComponent <AvoidDetector>().avoidPath;
        }
        else
        {
            localTarget = ds.rb.gameObject.transform.InverseTransformPoint(tracker.transform.position);
        }
        targetAngle = Mathf.Atan2(localTarget.x, localTarget.z) * Mathf.Rad2Deg;

        float steer = Mathf.Clamp(targetAngle * steeringSensitivity, -1, 1) * Mathf.Sign(ds.CurrentSpeed);

        float speedFactor = ds.CurrentSpeed / ds.maxSpeed;

        float corner       = Mathf.Clamp(Mathf.Abs(targetAngle), 0, 90);
        float cornerFactor = corner / 90.0f;

        float brake = 0;

        if (corner > 10 && speedFactor > 0.1f)
        {
            brake = Mathf.Lerp(0, 1 + speedFactor * brakingSensitivity, cornerFactor);
        }

        float accel = 1f;

        if (corner > 20 && speedFactor > 0.2f)
        {
            accel = Mathf.Lerp(0, 1 * accellerationSensitivity, 1 - cornerFactor);
        }

        float prevTorque = ds.torque;

        if (speedFactor < 0.3f && ds.rb.gameObject.transform.forward.y > 0.1f)
        {
            ds.torque *= 3.0f;
            accel      = 1f;
            brake      = 0;
        }

        ds.Go(accel, steer, brake);

        ds.CheckForSkid();
        ds.CalculateEngineSound();

        ds.torque = prevTorque;
    }
示例#9
0
    // Update is called once per frame
    void Update()
    {
        if (!RaceMonitor.racing)
        {
            lastTimeMoving = Time.time;
            return;
        }

        if (cpm == null)
        {
            cpm = ds.rb.GetComponent <CheckpointManager>();
        }

        // Ai stopping at finish end
        if (cpm.lap == RaceMonitor.totalLaps + 1)
        {
            ds.highAccel.Stop();
            ds.Go(0, finishSteer, 0f);
            return;
        }


        ProgressTracker();

        Vector3 localTarget;

        float targetAngle;


        if (ds.rb.velocity.magnitude > 1)
        {
            lastTimeMoving = Time.time;
        }

        if (Time.time > lastTimeMoving + 4 || ds.rb.gameObject.transform.position.y < -5f || ds.rb.gameObject.transform.position.y > 25f)
        {
            ds.rb.transform.position            = cpm.lastCp.transform.position + Vector3.up * 2 + new Vector3(Random.Range(-8, 8), 0, 0);
            ds.rb.transform.rotation            = cpm.lastCp.transform.rotation;
            tracker.transform.position          = cpm.lastCp.transform.position;
            ds.rb.gameObject.layer              = 8;
            this.GetComponent <Ghost>().enabled = true;
            Invoke("ResetLayer", 3);
        }

        if (Time.time < ds.rb.GetComponent <AvoidDetector>().avoidTime)
        {
            localTarget = tracker.transform.right * ds.rb.GetComponent <AvoidDetector>().avoidPath;
        }
        else
        {
            localTarget = ds.rb.gameObject.transform.InverseTransformPoint(tracker.transform.position);
        }


        targetAngle = Mathf.Atan2(localTarget.x, localTarget.z) * Mathf.Rad2Deg;


        float steer = Mathf.Clamp(targetAngle * steeringSensitivity, -1, 1) * Mathf.Sign(ds.currentSpeed);

        float speedFactor = ds.currentSpeed / ds.maxSpeed;

        float corner = Mathf.Clamp(Mathf.Abs(targetAngle), 0, 90);

        //Debug.LogWarning("name " + gameObject.name +" corner angle: " + corner);
        float cornerFactor = corner / 90.0f;



        float brake = 0f;
        float accel = 1f;

        if (corner > 5 && speedFactor > 0.3f)
        {
            brake = Mathf.Lerp(0, 1 + (speedFactor * speedFactor) * (brakingSensitivity * 5), (2 * cornerFactor * cornerFactor * cornerFactor));
        }

        if (corner > 9 && speedFactor > 0.3f)
        {
            brake = Mathf.Lerp(0.4f, 1 + (speedFactor * speedFactor) * (brakingSensitivity * 5), (2 * cornerFactor * cornerFactor * cornerFactor));
        }

        if (corner > 12 && speedFactor > 0.3f)
        {
            brake = Mathf.Lerp(0.6f, 1 + (speedFactor * speedFactor) * (brakingSensitivity * brakingSensitivity * 5), 1 - (2 * cornerFactor * cornerFactor * cornerFactor));
        }

        if (corner > 15 && speedFactor > 0.3f)
        {
            brake = Mathf.Lerp(0.7f, 1 + (speedFactor * speedFactor) * (brakingSensitivity * brakingSensitivity * 5), 1 - (2 * cornerFactor * cornerFactor));
        }

        // tight cornering
        if (cornerFactor == 1 && speedFactor > 0.1f)
        {
            brake = 1f;
            accel = 0.1f;
        }

        float prevTorque = ds.torque;

        // uphill helper
        if (speedFactor < 0.3f && ds.rb.gameObject.transform.forward.y > 0.1f)
        {
            ds.torque *= 3.0f;
            accel      = 1f;
            brake      = 0f;
        }

        // downhill AI
        if (speedFactor < 0.3f && ds.rb.gameObject.transform.forward.y < -0.35f || target.y < -0.35f)
        {
            accel = 0.2f;
            brake = 0.9f;
        }

        if (gameObject.name == "GoldJeep")
        {
            Debug.Log(gameObject.name + " corner factor = " + cornerFactor);
            //Debug.LogWarning("brake " + brake + " SF " + speedFactor * brakingSensitivity);
        }

        //Debug.LogWarning(gameObject.name + " brake: " + brake + " accel: " + accel);



        ds.Go(accel, steer, brake);

        ds.CheckForSkid();
        ds.CalculateEngineSound();

        ds.torque = prevTorque;
    }
示例#10
0
    void Update()
    {
        ProgressTracker();
        Vector3 localTarget     = ds.rb.gameObject.transform.InverseTransformPoint(target);
        Vector3 nextLocalTarget = ds.rb.gameObject.transform.InverseTransformPoint(nextTarget);

        float distanceToTarget = Vector3.Distance(target, ds.rb.gameObject.transform.position);

        float targetAngle     = Mathf.Atan2(localTarget.x, localTarget.z) * Mathf.Rad2Deg;
        float nextTargetAngle = Mathf.Atan2(nextLocalTarget.x, nextLocalTarget.z) * Mathf.Rad2Deg;

        float steer = Mathf.Clamp(targetAngle * steeringSensitivity, -1, 1) * Mathf.Sign(ds.currentSpeed);

        float distanceFactor = distanceToTarget / totalDistanceToTarget;
        float speedFactor    = ds.currentSpeed / ds.maxSpeed;

        float accel = Mathf.Lerp(accelSensitivity, 1f, distanceFactor);
        float brake = Mathf.Lerp((-1 - Mathf.Abs(nextTargetAngle)) * brakingSensitivity, 1 + speedFactor, 1 - distanceFactor);

        if (Mathf.Abs(nextTargetAngle) > 20)
        {
            brake += 0.8f;
            accel -= 0.8f;
        }

        if (isJump)
        {
            accel = 1f;
            brake = 0f;
            Debug.Log("Jump");
        }

        //if(distanceToTarget < 5) { brake = 1.2f; accel = 0.1f; }
        Debug.Log("Brake: " + brake + " Accel:" + accel + " Speed: " + ds.rb.velocity.magnitude + " distanceFactor: " + distanceFactor);

        ds.Go(accel, steer, brake);

        if (distanceToTarget < 4) //threshold, make larger if car starts to circle waypoint
        {
            currentWP++;
            if (currentWP >= circuit.waypoints.Length)
            {
                currentWP = 0;
            }
            target = circuit.waypoints[currentWP].transform.position;
            if (currentWP == circuit.waypoints.Length - 1)
            {
                nextTarget = circuit.waypoints[0].transform.position;
            }
            else
            {
                nextTarget = circuit.waypoints[currentWP + 1].transform.position;
            }

            totalDistanceToTarget = Vector3.Distance(target, ds.rb.gameObject.transform.position);

            if (ds.rb.gameObject.transform.InverseTransformPoint(target).y > 5)
            {
                isJump = true;
            }
            else
            {
                isJump = false;
            }
        }

        ds.CheckForSkid();
        ds.CalculateEngineSound();
    }
示例#11
0
    void Update()
    {
        if (wpReady)
        {
            Vector3 localTarget      = ds.rb.gameObject.transform.InverseTransformPoint(target);
            Vector3 nextLocalTarget  = ds.rb.gameObject.transform.InverseTransformPoint(nextTarget);
            float   distanceToTarget = Vector3.Distance(target, ds.rb.gameObject.transform.position); // Her frame'de target'a olan uzaklık yeniden hesaplanıyor

            float targetAngle     = Mathf.Atan2(localTarget.x, localTarget.z) * Mathf.Rad2Deg;
            float nextTargetAngle = Mathf.Atan2(nextLocalTarget.x, nextLocalTarget.z) * Mathf.Rad2Deg; // Dönüş gerektiren yerlerde daha çok fren yapmak için kullanıyoruz

            float steer = Mathf.Clamp(targetAngle * steeringSensitivity, -1, 1) * Mathf.Sign(ds.currentSpeed);

            float distanceFactor = distanceToTarget / totalDistanceToTarget; // İki waypoint arası mesafeyi aracın sonraki waypointe'e olan uzaklığına bölerek yüzde hesaplıyoruz
            float speedFactor    = ds.currentSpeed / ds.maxSpeed;            // hızımıza göre frene basma oranımızı ayarlamak için kullanıyoruz

            //float accel = 1f;
            float accel = Mathf.Lerp(accelSensitivity, 1, distanceFactor);
            // Orjinal kod açıyı kullanıyor ancak ben kullanmadım ayrıca orjinal breakinSesitivity = 1
            //float brake = Mathf.Lerp((-1 -Mathf.Abs(nextTargetAngle) * brakingSensitivity) ,1+speedFactor, 1 - distanceFactor); // waypoint'e yaklaştıkça ve viraj açısı arttıkça frene basma ölçüsünü arttırıyoruz
            float brake = Mathf.Lerp((-1 * brakingSensitivity), 1 + speedFactor, 1 - distanceFactor); // waypoint'e yaklaştıkça ve viraj açısı arttıkça frene basma ölçüsünü arttırıyoruz


            if (Mathf.Abs(nextTargetAngle) > 20)
            {
                brake += 0.8f;
                accel -= 0.8f;
            }

            if (isJump)
            {
                accel = 1;
                brake = 0;
                Debug.Log("Jump");
            }

            // Debug.Log("Brake: "+ brake+ " Accel: "+ accel + " Speed: "+ ds.rb.velocity.magnitude);

            //if(distanceToTarget< 5)
            //{
            //    brake = 0.8f;
            //    accel = 0.1f;
            //}

            ds.Go(accel, steer, brake);

            if (distanceToTarget < 4) // Threshhol make large if car starts to circle waypoint
            {
                currentWP++;
                if (currentWP >= circuit.waypoints.Length)
                {
                    currentWP = 0;
                }
                target = circuit.waypoints[currentWP].transform.position;
                if (currentWP == circuit.waypoints.Length - 1)
                {
                    nextTarget = circuit.waypoints[0].transform.position;
                }
                else
                {
                    nextTarget = circuit.waypoints[currentWP + 1].transform.position;
                }
                totalDistanceToTarget = Vector3.Distance(target, ds.rb.gameObject.transform.position); // Sonraki waypoint için yüzde hesaplamak için kullanacağız her waypoint'i geçince yeniden hesaplanıyor

                if (ds.rb.gameObject.transform.InverseTransformPoint(target).y > 5)
                {
                    isJump = true;
                }
                else
                {
                    isJump = false;
                }
            }
            ds.CheckForSkid();
            ds.CalculateEngineSound();
        }
    }