using UnityEngine;
using System.Collections;
public class EnemyMove : MonoBehaviour
{
public Transform[] EnemyMovePoints;
private float speed = 0.5f;
private float mass = 1.0f;
public bool isLoop = true;
private float Radius = 10.0f;
private float curSpeed;
private int curPointIndex;
private int pointsLenth;
private Vector3 targetPoint;
private Vector3 velocity;
private Vector3[] points;
public float Length
{
get { return points.Length; }
}
// Use this for initialization
void Start()
{
points = new Vector3[EnemyMovePoints.Length];
for (int i = 0; i < EnemyMovePoints.Length; i++)
{
points[i] = EnemyMovePoints[i].position;
}
pointsLenth = points.Length;
curPointIndex = 0;
velocity = transform.forward;
}
// Update is called once per frame
void Update()
{
curSpeed = speed + Time.deltaTime;
targetPoint = GetPoints(curPointIndex);
if (Vector3.Distance(transform.position, targetPoint) <= Radius)
{
if (curPointIndex <= pointsLenth - 1)
curPointIndex++;
else return;
}
if (curPointIndex >= pointsLenth)
{
}
else
{
if (curPointIndex == pointsLenth)
{
velocity += Steer(targetPoint, true);
}
else
velocity += Steer(targetPoint);
transform.position += velocity;
transform.rotation = Quaternion.LookRotation(velocity);
}
}
public Vector3 GetPoints(int index)
{
return points[index];
}
public Vector3 Steer(Vector3 target, bool isFinalPoint = false)
{
Vector3 desiredVelocity = (target - transform.position);
float dist = desiredVelocity.sqrMagnitude;
desiredVelocity.Normalize();
if (isFinalPoint && dist < 10.0f) desiredVelocity *= (curSpeed * (dist / 10.0f));
else desiredVelocity *= curSpeed;
Vector3 steeringForce = desiredVelocity - velocity;
Vector3 acceleration = steeringForce / mass;
return acceleration;
}
}
unity路径跟随的算法
最新推荐文章于 2025-03-21 11:52:04 发布