自动寻径
现在的大部分mmo游戏都有了自动寻路功能。点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。使用Unity来开发手游,自动寻路可以有很多种实现方式。
我们要实现一个功能:点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上”最短路径“。
步骤:
1.创建地形
2.添加角色
3.创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。
4.选中地形,在Navigation窗口中,设置Navigation Static
5.依次选中障碍物,在Navigation窗口中,设置Navigation Static
6.Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进行场景烘焙,就可以烘焙出寻路网格了
7.为角色添加NavMeshAgent组件。Component->Navigation->Nav Mesh Agent
8.为角色新增一个脚本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){
AdmatorToIdle(); //静止不动方法
}
else{
AdmatorToRun(); //开始跑方法
}
}
void AdmatorToIdle() {
anim.SetFloat("idle", 1F);
anim.SetFloat("walk", 0.0F);
anim.SetFloat("run", 0F);
}
void AdmatorToRun() {
anim.SetFloat("idle", 0F);
anim.SetFloat("walk", 0.0F);
anim.SetFloat("run", 1.0F);
}
巨魔从高空跳下
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(LayersUp LayersDown)-->Bake
5、选中巨魔,设置巨魔属性(NavMesh Walkable :Default LayersUp或LayersDown)
宠物跟随
public Transform target;
public NavMeshAgent agent;
void Start () {
agent =GetComponent<NavMeshAgent >();
}
void Update () {
if (target != null)
{
agent.SetDestination(target.position-new Vector3(0,0,3) ); //巨魔自身的坐标减去Z轴的距离,与宠物始终保持3米的距离
}
}
现在的大部分mmo游戏都有了自动寻路功能。点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。使用Unity来开发手游,自动寻路可以有很多种实现方式。
我们要实现一个功能:点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上”最短路径“。
步骤:
1.创建地形
2.添加角色
3.创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。
4.选中地形,在Navigation窗口中,设置Navigation Static
5.依次选中障碍物,在Navigation窗口中,设置Navigation Static
6.Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进行场景烘焙,就可以烘焙出寻路网格了
7.为角色添加NavMeshAgent组件。Component->Navigation->Nav Mesh Agent
8.为角色新增一个脚本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){
AdmatorToIdle(); //静止不动方法
}
else{
AdmatorToRun(); //开始跑方法
}
}
void AdmatorToIdle() {
anim.SetFloat("idle", 1F);
anim.SetFloat("walk", 0.0F);
anim.SetFloat("run", 0F);
}
void AdmatorToRun() {
anim.SetFloat("idle", 0F);
anim.SetFloat("walk", 0.0F);
anim.SetFloat("run", 1.0F);
}
巨魔从高空跳下
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(LayersUp LayersDown)-->Bake
5、选中巨魔,设置巨魔属性(NavMesh Walkable :Default LayersUp或LayersDown)
宠物跟随
public Transform target;
public NavMeshAgent agent;
void Start () {
agent =GetComponent<NavMeshAgent >();
}
void Update () {
if (target != null)
{
agent.SetDestination(target.position-new Vector3(0,0,3) ); //巨魔自身的坐标减去Z轴的距离,与宠物始终保持3米的距离
}
}
更多精彩关注:http://www.gopedu.com/