void Update()
    {
        if (transform.position != destination)
        {
            Vector3 destinationDirection = destination - transform.position;
            destinationDirection.y = 0;

            float destinationDistance = destinationDirection.magnitude;

            movementSpeed = Random.Range(0.9f, 1f);

            if (destinationDistance >= stopDistance)
            {
                reachedDestination = false;
                Quaternion targetRotation = Quaternion.LookRotation(destinationDirection);
                transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
                transform.Translate(Vector3.forward * movementSpeed * Time.deltaTime);

                velocity   = (transform.position - lastPosition) / Time.deltaTime;
                velocity.y = 0;
                var velocityMagnitude = velocity.magnitude;
                velocity = velocity.normalized;
                var fwdDotProduct   = Vector3.Dot(transform.forward, velocity);
                var rightDotProduct = Vector3.Dot(transform.right, velocity);


                animator.SetFloat("MovementX", rightDotProduct);
                animator.SetFloat("MovementSpeed", -fwdDotProduct);
            }
            else
            {
                reachedDestination = true;
            }
        }
        else
        {
            reachedDestination = true;
        }

        if (isRagdoll)
        {
            knockDownTimer.Tick();
            Vector3 pos = this.transform.position;      //needs work, animator overrides character position after ragdoll

            if (knockDownTimer.ready)
            {
                isRagdoll        = false;
                animator.enabled = true;

                transform.position = pos;
                knockDownTimer.Reset();
            }
        }
    }
    private void Update()
    {
        if (playerObject != null && !exiting && !isDriving)
        {
            NavigateToVehicle();

            if (entering)
            {
                Debug.Log("enter timer start");
                animWaitTimer.Tick();

                if (animWaitTimer.ready)
                {
                    //move player object under vehicle
                    playerObject.transform.parent = chassis.transform;

                    StartCar();
                    isDriving = true;
                    playerInteraction.isDriving = true;
                    entering = false;
                    animWaitTimer.Reset();
                }
            }
        }
        else if (exiting)
        {
            exitWaitTimer.Tick();

            if (exitWaitTimer.ready)
            {
                exitWaitTimer.Reset();
                Debug.Log("exit timer ready");
                Disembark();
            }
        }

        if (isDriving && !entering && !exiting)
        {
            playerObject.transform.position = driverSeat.position;
            playerObject.transform.Rotate(transform.forward);
        }
    }
示例#3
0
    private void StallCheck()
    {
        var pos = transform.position;

        stallTimer.Tick();

        if (stallTimer.ready && currentSpeed < 5f && leadingVehicle == null)
        {
            stallReverseTimer.Tick();
            recoveryExpiredTimer.Tick();

            if (!recoveryCheck)
            {
                recoveryCheck = true;
                pos           = transform.position;
            }

            isBraking = false;
            //skipWaypointCounter++;
            wheelFL.motorTorque = -80;
            wheelFR.motorTorque = -80;
            targetSteerAngle    = randomSteerAngle;

            if (Vector3.Distance(pos, transform.position) > 3)
            {
                if (targetSteerAngle >= 1)
                {
                    targetSteerAngle -= 20f;
                }
                else if (targetSteerAngle <= -1)
                {
                    targetSteerAngle += 20f;
                }

                recoveryCheck = false;
                stallTimer.Reset();
                stallReverseTimer.Reset();
                recoveryExpiredTimer.Reset();
            }
            else if (recoveryExpiredTimer.ready)
            {
                recoveryCheck = false;
                stallTimer.Reset();
                stallReverseTimer.Reset();
                recoveryExpiredTimer.Reset();
            }

            if (stallReverseTimer.ready)
            {
                //reset all
                stallTimer.Reset();
                stallReverseTimer.Reset();
                recoveryExpiredTimer.Reset();
                randomSteerAngle = Random.Range(-45f, 45f);
            }

            /*
             * if (skipWaypointCounter == 2)
             * {
             *  if (currentNode == nodes.Count - 1)
             *  {
             *      skipWaypointCounter = 0;
             *      currentNode = 0;
             *  }
             *  else
             *  {
             *      skipWaypointCounter = 0;
             *      currentNode++;
             *  }
             * }
             */
        }
        else if (currentSpeed >= 30)
        {
            stallTimer.Reset();
            stallReverseTimer.Reset();
            recoveryExpiredTimer.Reset();
            recoveryCheck = false;
        }
    }