先在场景中制作一个障碍物地图,我的是长这样的
图中红色方框的就是player(......),然后把障碍物的层设置为obstacles,下面是代码,没有注释,但是应该很容易看懂的
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour
{
public float speed = 20.0f;
public float mass = 5.0f;
public float force = 50.0f;
public float minDistanceToAvoid = 20.0f;
private float curSpeed;
private Vector3 targetPoint;
void Start()
{
mass = 5.0f;
targetPoint = Vector3.zero;
}
void Update()
{
RaycastHit hit;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Input .GetMouseButtonDown (0)&&Physics .Raycast (ray,out hit,100.0f))
{
targetPoint = hit.point;
}
Vector3 dir = (targetPoint - transform.position);
dir.Normalize();
AvoidObstacles(ref dir);
if(Vector3 .Distance (targetPoint ,transform .position )<3.0f)
{
return;
}
curSpeed = speed * Time.deltaTime;
var rot = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Lerp(transform.rotation, rot, 5.0f * Time.deltaTime);
transform.position += transform.forward * curSpeed;
}
public void AvoidObstacles(ref Vector3 dir)
{
RaycastHit hit;
int layerMask = 1 << 8;
if (Physics.Raycast(transform.position, transform.forward, out hit, minDistanceToAvoid, layerMask))
{
Vector3 hitNormal = hit.normal;
dir = transform.forward + hitNormal * force;
}
}
}
没有考虑最短路径的问题,以后有时间和经验了再改改