Unity 2018 Artificial Intelligence Cookbook(Second Edition)
上QQ阅读APP看书,第一时间看更新

How to do it...

This recipe entails adding changes to our Agent class.

  1. Go to the Agent class.
  2. Add a member variable for storing the rigid body component's reference:
private Rigidbody aRigidBody; 
  1. Get the reference to the rigid body component in the Start function:
aRigidBody = GetComponent<Rigidbody>(); 
  1. Implement a function for transforming an orientation value to a vector:
public Vector3 OriToVec(float orientation) 
{ 
  Vector3 vector = Vector3.zero; 
  vector.x = Mathf.Sin(orientation * Mathf.Deg2Rad) * 1.0f; 
  vector.z = Mathf.Cos(orientation * Mathf.Deg2Rad) * 1.0f; 
  return vector.normalized; 
} 
  1. Add the following two lines at the beginning of the Update function:
public virtual void Update () 
{ 
  if (aRigidBody == null) 
    return; 
  // ... previous code 
  1. Define the FixedUpdate function:
public virtual void FixedUpdate() 
{ 
  if (aRigidBody == null) 
    return; 
  // next step 
} 
  1. Continue implementing the FixedUpdate function:
Vector3 displacement = velocity * Time.deltaTime; 
orientation += rotation * Time.deltaTime; 
if (orientation < 0.0f) 
  orientation += 360.0f; 
else if (orientation > 360.0f) 
  orientation -= 360.0f; 
// The ForceMode will depend on what you want to achieve 
// We are using VelocityChange for illustration purposes 
aRigidBody.AddForce(displacement, ForceMode.VelocityChange); 
Vector3 orientationVector = OriToVec(orientation); 
aRigidBody.rotation = Quaternion.LookRotation(orientationVector, Vector3.up);