- 最后登录
- 2015-1-26
- 注册时间
- 2012-4-17
- 阅读权限
- 20
- 积分
- 358
- 纳金币
- 300
- 精华
- 0
|
我们上节课说道如何取得目标地点的坐标,和让我们的人物转向目标点。今天我们要实现让我们的人物走向目标点,
首先分析一下,我们要实现这个效果非常简单,当旋转完成后判断人物与目标点之间的距离,当距离大于我们设置的最小误差时,使物体朝前运动,当小于和等于最小误差时停止运动。
我们要用到的知识点就是判断两个点之间的距离,这个要用到Vector3 Distance (a : Vector3, b : Vector3) 返回a和b之间的距离
我们只需要的将a换成人物坐标将b换成我们的目标点坐标就OK了
代码如下:
using UnityEngine;
using System.Collections;
public class Pathfinding : MonoBehaviour {
//public Transform from;
public Transform to;
public float speed = 5F;
//游戏主角
private GameObject play;
RaycastHit hit;
//距离差值
float dist;
//角度差值
float angle;
void Start ()
{
play=GameObject.Find("person");
dist=0.5f;
}
// Use this for initialization
void Update ()
{
if(Input.GetMouseButtonDown(0))
{
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 100))
{
if(hit.collider.gameObject.name=="floor")
{
Debug.Log(hit.point);
to.transform.parent = null;
to.LookAt(hit.point);
//得到玩家至碰撞点的距离差值
dist=Vector3.Distance(play.transform.position, hit.point);
//得到角度差值
angle=Vector3.Angle(play.transform.forward,to.forward);
}
}
}
if(angle<2.0f&&dist>0.5f&&hit.collider.gameObject.name=="floor")
{
//实时得到玩家至碰撞点的距离差值
dist=Vector3.Distance(play.transform.position, hit.point);
to.transform.parent=play.transform;
to.transform.localPosition = new Vector3(0, 0, 0);
move();
}
else
play.transform.rotation = Quaternion.Slerp(play.transform.rotation, to.rotation, speed);
//实时得到角度差值
angle=Vector3.Angle(play.transform.forward,to.forward);
//play.transform.position = Vector3.Lerp(play.transform.position, hit.point, Time.time);
}
void move()
{
//玩家向前移动
play.transform.Translate(Vector3.forward * Time.deltaTime);
}
}
将代码附加到我们的主相机上,运行游戏。效果还不错吧。这样就实现了一个简单的鼠标自动寻路功能。
|
-
总评分: 纳金币 + 5
查看全部评分
|