自动寻径
来源:互联网 发布:php无法加载控制器 编辑:程序博客网 时间:2024/04/29 06:33
在以下这些游戏中都会用到自动寻径!
MMO - - Massively Multiplayer Online,大型多人在线。
策略类或战略类(MMOSLG)
动作类(MMOACT)。
冒险类(MMOAVG)。
模拟类游戏(MMOSG)
运动类(MMOSPT)
赛车类(MMORCG)
角色扮演类(MMORPG)
现在的大部分mmo游戏都有了自动寻路功能。点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。使用Unity来开发手游,自动寻路可以有很多种实现方式。
一、我们下面要实现一个功能:
点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上“最短路径”。
接下来一步步完成:
①创建地形
②添加角色
③创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。
④选中地形,在Navigation窗口中,设置Navigation Static
⑤依次选中障碍物,在avigation窗口中,设置Navigation Static
⑥Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进程场景烘焙,就可以烘焙出寻路网格了
⑦为角色添加NavMeshAgent组件。Component->Navigation->Nav Mesh Agent
⑧为角色新增一个脚本PlayerController.cs,实现点击目标,自动寻路功能
地形效果图:
然后添加角色给它附一个脚本,就可以实现自动寻径了!
怪物身上的代码:
private NavMeshAgent agent;
private Animator anim;
void Start () {
agent = GetComponent<NavMeshAgent>(); //获取自动寻径组件
anim = GetComponent<Animator>(); //获取动画组件
}
void Update () {
RaycastHit hit;
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,out hit))
{
agent.SetDestination(hit.point);
}
}
if (agent.remainingDistance == 0)
{
AnimationToldle(); //调用下面那个静止不动效果的方法
}
else
{
AnimationTowalk(); //开始走动方法
}
}
public void AnimationToldle()
{
anim.SetFloat("idle", 1F);
anim.SetFloat("walk", 0.0F);
anim.SetFloat("run", 0F);
}
public void AnimationTowalk()
{
anim.SetFloat("idle", 0F);
anim.SetFloat("walk", 1F);
anim.SetFloat("run", 0F);
}
}
二、宠物跟随效果
在一个游戏当中,有很多主角旁边都会更随着一些宠物,这个效果怎么实现的呢?
看一下下面这段代码:
public Transform troll; //troll为主角
private NavMeshAgent agent;
void Start () {
agent = GetComponent<NavMeshAgent>();
}
void Update () {
if(troll!=null)
{
agent.destination = troll.position - new Vector3(2, 2, 2); //这是让宠物获取主角的位置,然后始终保持一段距离。
}
}
注意:宠物也要添加NavMeshAgent 组件。
三、Navmesh Obstacle
之前我们都是用固定的物体作为障碍物,然后烘焙场景,Unity还提供了动态的障碍物,任何一个GameObject都可以添加Navmesh Obstacle组件,变成一个障碍物。
具体步骤是Component-->Navigation-->Navmesh Obstacle.它有两个属性:半径和高度,可以设置跟你的物品差不多的体积大小。
效果图:
四、主角从高空下
1.设置Navigation里面Bake的Drop Height的值 //这个值一定要比主角距离地面的高度要大
2.勾选Navigation里面Object的OffMeshLink Generatic
3.点击Bake
五、寻路网格层的应用
1.把Navigation里面Bake的Drop Height的值设为0
2.取消勾选Navigation里面Object的OffMeshLink Generatic
3.点击Bake
4.在Navigation里面Layers创建两个Layers(LayersUpLayersDown)-->Bake
5.选中主角,设置主角属性(NavMesh Walkable:Default LayersUp或LayersDown)
物体上Nav Mesh Agent 组件的属性:
Radius 半径
Speed 速度,
Acceleration 加速度
Angular Speed 角速度
Stopping distance 制动距离
Auto Traverse OffMesh Link 自动遍历OffMesh链接
Auto Repath 自动重新寻路
Height 高度
Base offset 基本偏移
Obstacle Avoidance Type 障碍躲避类型
NavMesh Walkable 导航网格行走
更多精彩而尽在:http://www.gopedu.com/
- 自动寻径
- Unity--自动寻径
- 自动寻径
- Unity3D 自动寻径
- 自动寻径
- 自动寻径
- 自动寻径
- 自动寻径
- Unity之自动寻径
- Unity之自动寻径
- unity之自动寻径
- unity之自动寻径
- unity学习之自动寻径
- Unity3D学习之(自动寻径)
- Unity学习之自动寻径
- Unity学习之自动寻径进阶
- 学习Unity3D之自动寻径。
- unity代码笔记<3>自动寻径
- Linux基础正则表达式grep
- 两张表A和B,各有一个字段,更新时间A.MODIFIED_TM和B.MODIFIED_TM,A表为主表,更新时间不为空,但是B表更新时间可能为空,现在要取A、B两表时间最新的那个,B.MODIFIED
- JVM调优的"标准参数"的各种陷阱
- VC办法
- 1023. Have Fun with Numbers (20)
- 自动寻径
- live555分析之基础知识-BT1120协议
- vc6.0 中getline需要按两次回车的解决方法
- 如何正确配置Nginx+PHP
- 互联网协议入门(二)
- PHP进阶笔记 : 从零搭建LNMP环境(二) - 集成Nginx与PHP
- JavaSocket聊天器<二>客户端与服务端发送信息
- sip点滴
- iOS中的常见错误