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

How to do it...

Thanks to our previous hard work, this recipe is a short one:

  1. Create the AvoidWall behavior derived from Seek:
using UnityEngine; 
using System.Collections; 
 
public class AvoidWall : Seek 
{ 
    // body 
} 
  1. Include the member variables for defining the safety margin and the length of the ray to cast:
public float avoidDistance; 
public float lookAhead; 
  1. Define the Awake function to set up the target:
public override void Awake() 
{ 
    base.Awake(); 
    target = new GameObject(); 
} 
  1. Define the GetSteering function required for future steps:
public override Steering GetSteering() 
{ 
    // body 
}

  1. Declare and set the variable needed for ray casting:
Steering steering = new Steering(); 
Vector3 position = transform.position; 
Vector3 rayVector = agent.velocity.normalized * lookAhead; 
Vector3 direction = rayVector; 
RaycastHit hit; 
  1. Cast the ray and make the proper calculations if a wall is hit:
if (Physics.Raycast(position, direction, out hit, lookAhead)) 
{ 
    position = hit.point + hit.normal * avoidDistance; 
    target.transform.position = position; 
    steering = base.GetSteering(); 
} 
return steering;