48 lines
1.6 KiB
C#
48 lines
1.6 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
public class Wander : Face
|
|
{
|
|
public float offset;
|
|
public float radius;
|
|
public float rate;
|
|
|
|
public override void Awake()
|
|
{
|
|
target = new GameObject();
|
|
target.transform.position = transform.position;
|
|
base.Awake();
|
|
}
|
|
|
|
public override Steering GetSteering()
|
|
{
|
|
Steering steering = new Steering();
|
|
float wanderOrientation = Random.Range(-1.0f, 1.0f) * rate;
|
|
float targetOrientation = wanderOrientation + agent.orientation;
|
|
|
|
// Вычисляем позицию цели для поворота
|
|
Vector3 orientationVec = GetOriAsVec(agent.orientation);
|
|
Vector3 targetPosition = (offset * orientationVec) + transform.position;
|
|
targetPosition = targetPosition + (GetOriAsVec(targetOrientation) * radius);
|
|
|
|
// Передаем позицию цели в Face для расчета поворота
|
|
targetAux.transform.position = targetPosition;
|
|
|
|
// Получаем только поворот от Face
|
|
steering = base.GetSteering();
|
|
|
|
// Добавляем постоянное движение вперед
|
|
steering.linear = agent.maxAccel * GetOriAsVec(agent.orientation);
|
|
|
|
return steering;
|
|
}
|
|
|
|
public Vector3 GetOriAsVec(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;
|
|
}
|
|
}
|