Example #1
0
    public void InitializeTarget()
    {
        if (target)
        {
            //if target is a vehicle
            targetBody = (Rigidbody)F.GetTopmostParentComponent <Rigidbody>(target);

            //if target is a waypoint
            targetWaypoint = target.GetComponent <VehicleWaypoint>();
            if (targetWaypoint)
            {
                prevSpeed = targetWaypoint.speed;
            }
        }
    }
Example #2
0
    public void InitializeTarget()
    {
        if (target)
        {
            //if target is a vehicle
            targetBody = (Rigidbody)F.GetTopmostParentComponent<Rigidbody>(target);

            //if target is a waypoint
            targetWaypoint = target.GetComponent<VehicleWaypoint>();
            if (targetWaypoint)
            {
                prevSpeed = targetWaypoint.speed;
            }
        }
    }
Example #3
0
	void FixedUpdate()
	{
		if (target)
		{
			if (target != targetPrev)
			{
				InitializeTarget();
			}

			targetPrev = target;

			//Is the target a waypoint?
			targetIsWaypoint = target.GetComponent<VehicleWaypoint>();
			//Can I see the target?
			targetVisible = !Physics.Linecast(tr.position, target.position, viewBlockMask);

			if (targetVisible || targetIsWaypoint)
			{
				targetPoint = targetBody ? target.position + targetBody.velocity : target.position;
			}

			if (targetIsWaypoint)
			{
				//if vehicle is close enough to target waypoint, switch to the next one
				if ((tr.position - target.position).sqrMagnitude <= targetWaypoint.radius * targetWaypoint.radius)
				{
					target = targetWaypoint.nextPoint.transform;
					targetWaypoint = targetWaypoint.nextPoint;
					prevSpeed = speed;
					speed = Mathf.Clamp01(targetWaypoint.speed * initialSpeed);
					brakeTime = prevSpeed / speed;

					if (brakeTime <= 1)
					{
						brakeTime = 0;
					}
				}
			}
			else
			{
				speed = initialSpeed;
			}

			brakeTime = Mathf.Max(0, brakeTime - Time.fixedDeltaTime);
			//Is the distance to the target less than the follow distance?
			close = (tr.position - target.position).sqrMagnitude <= Mathf.Pow(followDistance, 2) && !targetIsWaypoint;
			dirToTarget = (targetPoint - tr.position).normalized;
			lookDot = Vector3.Dot(vp.forwardDir, dirToTarget);
			steerDot = Vector3.Dot(vp.rightDir, dirToTarget);

			//Attempt to reverse if vehicle is stuck
			stoppedTime = Mathf.Abs(vp.localVelocity.z) < 1 && !close && vp.groundedWheels > 0 ? stoppedTime + Time.fixedDeltaTime : 0;

			if ((stoppedTime > stopTimeReverse || (vp.velMag < 1 && lookDot < 0) || (vp.velMag <= 20 && lookDot < -0.8)) && reverseTime == 0)
			{
				reverseTime = reverseAttemptTime;
				reverseAttempts ++;
			}

			//Reset if reversed too many times
			if (reverseAttempts > resetReverseCount && resetReverseCount >= 0)
			{
				StartCoroutine(ReverseReset());
			}

			reverseTime = Mathf.Max(0, reverseTime - Time.fixedDeltaTime);

			//Set vehicle inputs
			vp.SetAccel(!close && (lookDot > 0 || vp.localVelocity.z < 5) && vp.groundedWheels > 0 && reverseTime == 0 ? speed : 0);
			vp.SetBrake(reverseTime == 0 && brakeTime == 0 && !(close && vp.localVelocity.z > 0.1f) ? (lookDot < 0.5f && lookDot > 0 && vp.localVelocity.z > 10 ? 0.5f - lookDot : 0) : (brakeTime > 0 ? brakeTime * 0.2f : 1));
			vp.SetSteer(reverseTime == 0 ? Mathf.Abs(Mathf.Pow(steerDot, (tr.position - target.position).sqrMagnitude > 20 ? 1 : 2)) * Mathf.Sign(steerDot) : -Mathf.Sign(steerDot) * (close ? 0 : 1));
			vp.SetEbrake((close && vp.localVelocity.z <= 0.1f) || (lookDot <= 0 && vp.velMag > 20) ? 1 : 0);
		}

		rolledOverTime = va.rolledOver ? rolledOverTime + Time.fixedDeltaTime : 0;

		//Reset if stuck rolled over
		if (rolledOverTime > rollResetTime && rollResetTime >= 0)
		{
			StartCoroutine(ResetRotation());
		}
	}
Example #4
0
    void FixedUpdate()
    {
        if (target)
        {
            if (target != targetPrev)
            {
                InitializeTarget();
            }

            targetPrev = target;

            //Is the target a waypoint?
            targetIsWaypoint = target.GetComponent <VehicleWaypoint>();
            //Can I see the target?
            targetVisible = !Physics.Linecast(tr.position, target.position, viewBlockMask);

            if (targetVisible || targetIsWaypoint)
            {
                targetPoint = targetBody ? target.position + targetBody.velocity : target.position;
            }

            if (targetIsWaypoint)
            {
                //if vehicle is close enough to target waypoint, switch to the next one
                if ((tr.position - target.position).sqrMagnitude <= targetWaypoint.radius * targetWaypoint.radius)
                {
                    target         = targetWaypoint.nextPoint.transform;
                    targetWaypoint = targetWaypoint.nextPoint;
                    prevSpeed      = speed;
                    speed          = Mathf.Clamp01(targetWaypoint.speed * initialSpeed);
                    brakeTime      = prevSpeed / speed;

                    if (brakeTime <= 1)
                    {
                        brakeTime = 0;
                    }
                }
            }
            else
            {
                speed = initialSpeed;
            }

            brakeTime = Mathf.Max(0, brakeTime - Time.fixedDeltaTime);
            //Is the distance to the target less than the follow distance?
            close       = (tr.position - target.position).sqrMagnitude <= Mathf.Pow(followDistance, 2) && !targetIsWaypoint;
            dirToTarget = (targetPoint - tr.position).normalized;
            lookDot     = Vector3.Dot(vp.forwardDir, dirToTarget);
            steerDot    = Vector3.Dot(vp.rightDir, dirToTarget);

            //Attempt to reverse if vehicle is stuck
            stoppedTime = Mathf.Abs(vp.localVelocity.z) < 1 && !close && vp.groundedWheels > 0 ? stoppedTime + Time.fixedDeltaTime : 0;

            if ((stoppedTime > stopTimeReverse || (vp.velMag < 1 && lookDot < 0) || (vp.velMag <= 20 && lookDot < -0.8)) && reverseTime == 0)
            {
                reverseTime = reverseAttemptTime;
                reverseAttempts++;
            }

            //Reset if reversed too many times
            if (reverseAttempts > resetReverseCount && resetReverseCount >= 0)
            {
                StartCoroutine(ReverseReset());
            }

            reverseTime = Mathf.Max(0, reverseTime - Time.fixedDeltaTime);

            //Set vehicle inputs
            vp.SetAccel(!close && (lookDot > 0 || vp.localVelocity.z < 5) && vp.groundedWheels > 0 && reverseTime == 0 ? speed : 0);
            vp.SetBrake(reverseTime == 0 && brakeTime == 0 && !(close && vp.localVelocity.z > 0.1f) ? (lookDot < 0.5f && lookDot > 0 && vp.localVelocity.z > 10 ? 0.5f - lookDot : 0) : (brakeTime > 0 ? brakeTime * 0.2f : 1));
            vp.SetSteer(reverseTime == 0 ? Mathf.Abs(Mathf.Pow(steerDot, (tr.position - target.position).sqrMagnitude > 20 ? 1 : 2)) * Mathf.Sign(steerDot) : -Mathf.Sign(steerDot) * (close ? 0 : 1));
            vp.SetEbrake((close && vp.localVelocity.z <= 0.1f) || (lookDot <= 0 && vp.velMag > 20) ? 1 : 0);
        }

        rolledOverTime = va.rolledOver ? rolledOverTime + Time.fixedDeltaTime : 0;

        //Reset if stuck rolled over
        if (rolledOverTime > rollResetTime && rollResetTime >= 0)
        {
            StartCoroutine(ResetRotation());
        }
    }