上午,我做了关于Monster的自动寻路功能。
ok,先贴一下网上当下来,关于NavMeshAgent的属性和方法。
关于U3D内置的寻路组件主要分为两大个类,NavMesh和NavMeshAgent;前者用于设置寻路的网络,后者设置寻路的Object。在NavMesh对外公开的方法有:
Raycast 跟踪上NavMesh的两个点之间的射线。
CalculatePath 计算两点之间的路径和存储路径。
DistanceToEdge 找到最近从一个点的NavMesh NavMesh边缘。
SamplePosition 样品到指定点最接近的NavMesh。
SetLayerCost 设置成本超过一层上的所有代理类型的几何遍历。
GetLayerCost 取得成本超过一层上的所有代理类型的几何遍历。
GetNavMeshLayerFromName 返回一个已命名的层层指数。
此外它还继承了一些变量
name 对象的名称。
hideFlags 如果对象是隐藏的,由用户在现场或修改保存?
继承的函数
GetInstanceID 返回该对象的实例ID。
ToString 返回游戏对象的名称。
继承类的功能
operator bool 对象是否存在?
Instantiate 克隆原始的对象,并返回克隆 。
Destroy 删除一个游戏物体,组件或资产。
DestroyImmediate 立即销毁对象 obj 。强烈建议,而不是使用毁灭。
FindObjectsOfType 返回的所有活动加载的类型对象的列表类型 。
FindObjectOfType 返回的第一个活动类型加载的对象类型。
运算符== 比较如果两个对象指向同一个
运算符! 比较,如果两个对象是指不同的对象
DontDestroyOnLoad 使得对象的目标不会被破坏时自动装载一个新的场景。
在NavMesh对外公开的方法有:
变量
destination 导航朝目的地。
stoppingDistance 在这个距离内停止从目标位置。
velocity navmesh代理组件的当前速度。
nextPosition 路径上的下一个位置。
remainingDistance 当前路径上的剩余距离。
baseOffset 拥有游戏物体的相对垂直位移。
isOnOffMeshLink 代理目前定位上OffMeshLink。
autoTraverseOffMeshLink 自动运动到和关闭OffMeshLinks。
autoRepath 试图获取一个新的路径,如果现有的路径变为无效
hasPath 代理目前有一个路径。
pathPending 正在计算路径,但还没有准备好
isPathStale 当前路径陈旧。
pathStatus 查询当前路径的状态。
walkableMask 指定巫NavMesh层是差强人意(位域)。更改walkableMask将陈旧的路径(见isPathStale)
speed 最大移动速度。
angularSpeed 最高转速(deg / s的)。
acceleration 最大加速度
updatePosition 如果代理更新变换位置。
updateRotation 如果代理更新变换方向。
radius 代理半径。
height 代理的高度。
obstacleAvoidanceType 避免质量水平
功能
SetDestination 设置或更新的目标。这会触发一个新的路径计算。
ActivateCurrentOffMeshLink 启用或禁用当前链接。
GetCurrentOffMeshLinkData 提取当前的OffMeshLink状态。
GetCurrentOffMeshLinkGameObject 参考当前OffMeshLink的游戏对象。
CompleteOffMeshLink 终止电流OffMeshLink。
Move 当前位置应用相对运动。
Stop 停止代理的运动沿着目前的道路。
Resume 恢复运动沿着目前的道路。
ResetPath 清除当前路径。请注意,代理将开始寻找一条新的道路,直到SetDestination被称为。
SetPath 指定代理的路径。
DistanceToEdge 找到最近的NavMesh边缘。
Raycast 对一个目标位置的NavMesh的跟踪运动。不移动代理。
SamplePathPosition 采样沿着目前的道路位置。
SetLayerCost 设置为以上的层类型的几何遍历成本。
GetLayerCost 获取超过该层类型的几何遍历成本。
继承的成员
继承的变量
enabled 启用Behaviours更新,禁用Behaviours都没有。
transform 变换连接到这个游戏物体(null,如果是没有连接)。
rigidbody 刚性主体连接到这个游戏物体(null,如果是没有连接)。
camera 该相机连接到这个游戏物体(NULL,如果有没有附加) 。
light 这个游戏物体光连接(如果是没有连接的空) 。
animation 动画的连接到这个游戏物体(NULL,如果有没有附加) 。
constantForce ConstantForce连接到这个游戏物体(null,如果是没有连接)。
renderer 渲染器 连接到这个游戏物体(空;如果没有附加)。
audio AudioSource附加游戏物体(null,如果是没有连接)。
guiText GUIText连接到这个游戏物体(null,如果是没有连接)。
networkView NetworkView连接这个游戏物体 (只读)。(空;如果没有连接)
guiTexture GUITexture连接这个游戏物体 (只读)。(空;如果没有连接)
collider 对撞机的连接到这个游戏物体(空;如果没有附加)。
hingeJoint HingeJoint连接到这个游戏物体(null,如果是没有连接)。
particleEmitter ParticleEmitter连接到这个游戏物体(null,如果是没有连接)。
particleSystem ParticleSystem连接到这个游戏物体(null,如果是没有连接)。
GameObject 此组件连接到游戏的目标。始终是一个组件连接到一个游戏对象。
tag 这个游戏对象的标记。
name 对象的名称。
hideFlags 如果对象是隐藏的,由用户在现场或修改保存?
继承的函数
GetComponent 如果比赛的对象之一附着,空,如果它不返回类型的组件类型。
GetComponentInChildren 返回的类型的组件类型的游戏物体或任何其使用深度优先搜索的儿童 。
GetComponentsInChildren 返回类型的所有组件类型在游戏物体或任何其子女。
GetComponents 返回类型的所有组件类型的游戏物体。
CompareTag 这是游戏对象标签的标签吗 ?
SendMessageUpwards 调用命名方法methodName中每MonoBehaviour在这场比赛中对象的行为的每一个祖先
SendMessage函数 调用命名的方法methodName中每MonoBehaviour在这个游戏对象。
BroadcastMessage 调用命名的方法methodName中每MonoBehaviour在这场比赛中的对象或任何其子女。
GetInstanceID 返回该对象的实例ID。
ToString 返回游戏对象的名称。
继承类的功能
运算符BOOL 对象是否存在?
Instantiate 克隆原始的对象,并返回克隆 。
Destroy 删除一个游戏物体,组件或资产。
DestroyImmediate 立即销毁对象 obj 。强烈建议,而不是使用毁灭。
FindObjectsOfType 返回的所有活动加载的类型对象的列表类型 。
FindObjectOfType 返回的第一个活动类型加载的对象类型。
运算符== 比较如果两个对象指向同一个
寻路的教程:
http://blog.csdn.net/janeky/article/details/17457533
好了,下面是我自己写的代码
using UnityEngine;
using System.Collections;
/*
* Monster寻路代码
*/
public class Monster_Nav : MonoBehaviour
{
private NavMeshAgent agent;
private GameObject hero;
//目标点
private Vector3 targetPos;
//记录前一帧 的剩余距离
private float distance=0;
// Use this for initialization
void Start ()
{
agent = GetComponent<NavMeshAgent> ();
hero = GameObject.Find ("Sam");
}
// Update is called once per frame
void Update ()
{
targetPos = new Vector3 (hero.transform.position.x , transform.position.y, transform.position.z);
transform.LookAt (targetPos);
agent.SetDestination(targetPos);
//Debug.Log (agent.remainingDistance);
//播放动画,判断是否到达了目的地,播放空闲或者跑步动画
//由于设置定了 stopping distance为0.5 所以不能以剩余距离为0 来停止动画
//当前一帧剩余距离和此时剩余距离一样时说明monster已不再移动
if (agent.remainingDistance == distance)
{
animation.Play("wait");
}
else
{
distance=agent.remainingDistance;
animation.Play("walk");
}
}
}
拿走 不谢 哈哈