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; } } }
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; } } }
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()); } }
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()); } }