您的位置:首页 > 移动开发 > Unity3D

unity路径跟随的算法

2016-05-26 20:32 405 查看
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: