unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

导航系统—导航网络的生成

1)导航网格的烘焙:Windows—Navigation

在烘焙之前要确保环境的Static是勾选上的(至少要保证Navigation Static是勾选上的)

2)Navigation中的Bake进行烘焙,可以通过修改Agent Radius 进行调整边缘(选中右下角的Bake可以查看可行走区域)

3)如果需要任务可以穿过草丛,将草丛的Navigation Static都取消选中

4)如果不想在某个组件上生成导航网格,则需要Navigation中的Navigation Area 选择成Not Walkable模式,然后重新点击Bake进行渲染即可。

5)控制人物在导航图上进行行走:给人物添加一个Nav Mesh Agent属性组件(要保证生成的圆柱体和人物身躯大小保持一致,在radius中进行调整)

6)控制人物移动:通过鼠标单击目的地,人物自动走到目的地处。使用代码进行开发

代码中要实现的效果是获取目标位置,使用射线检测来完成。在鼠标点击的位置发射一条射线,判断和哪里发生碰撞,以获取点。

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.AI;//正确输入命名空间

 

public class Hero : MonoBehaviour {

 

    public NavMeshAgent agent;//只有这样才能正确命名这个

   

 

    void Update () {

        if (Input.GetMouseButtonDown(0))//只有当鼠标点击时,需要进行检测,0表示鼠标左键

        {

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//获取射线。ScreenPointToRay将屏幕坐标转换成射线,通过鼠标点击进行屏幕坐标获取

            RaycastHit hit;//用来保存碰撞信息

            if (Physics.Raycast(ray, out hit)) //用来检测碰撞信息,传一个射线,再传一个输出

            {

                print(hit.point);//此时点击地面Console会出现相应的坐标destination来对目标位置进行设置

                agent.SetDestination(hit.point);//使用

            }

        }

    }

}

7)将Nav Mesh Agent 拖拽至脚本中的Agent栏,进行调节

 

控制摄像机的跟随

1)首先计算出摄像机和主角的偏移,再将Update中使相机和主角保持相同程度的偏移即可。

2)调整好摄像机的位置后,使用代码来进行控制

创建的脚本代码无法导入,直接在主相机的属性栏新建Follow Target的组件,打开其中的脚本代码进行修改即可。完整代码展示如下:

using System;

using UnityEngine;

 

 

namespace UnityStandardAssets.Utility

{

    public class FollowTarget : MonoBehaviour

    {

 

        public Transform hero;

        private Vector3 offset;

 

        void Start()

        {

            offset = transform.position - hero.position;

        }

 

 

        private void LateUpdate()

        {

            transform.position = hero.position + offset;

        }

    }

}

 

3)将Hierarchy中人物拖拽至Inspector相应位置,此时主摄像机可以跟随人物进行运动了

 

角色的动画控制(使用动画状态机进行控制)

1)在Animations中有四个动画,本次案例需要idle、run和walk即可。在Hierarchy中的Hero中找到Animator(属性面板中)

2)(Inspector中)Animation—Controller中进行处理。在含有动画的面板创建一个New Animator Controller,改名为hero controller如图:

unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

3)拖拽到相应位置

unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

 

如何编辑Animation—Controller?

选中需要编辑的组件(本场景中的人物)—点击Windows—选择Animator。

(1)默认状态:直接拖拽

unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

(2)行走和奔跑,仅将动画效果进行拖拽

unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

(3)静止、行走和奔跑状态的切换

使用人物(hero)属性面板中的Nav Mesh Agent中的speed(最大速度)进行调整。使用脚本进行切换。

(4)状态的变化需要在状态器中添加一些东西,重命名为speed

unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

(5)将静止状态和行走状态进行连接

unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

(6)右击如图所标注位置后出现相关属性框

unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

(7)单击此处,生成相关内容

unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

(8)如上图中,将Greate(最大速度)大于0时,切换速度到walk模式

(9)在walk动画上重复第(5)步,生成切换成静止模式的箭头线条,将速度的最大值改为最小值(下拉菜单),修改为小于0.1unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

(10)取消选择上图右侧属性界面中的Has Exit Time

(11)同理操作walk和run的动画切换。

注意:(3)步中说到的speed是最大速度,任何地方的速度都不能大于该数字。

(12)此时点击播放,仍然是静止状态。需要对相关参数进行赋值,在Hero代码中进行完善。

设置变量

public Animator anim;

直接在属性面板中进行拖拽

unity导航网格的制作、人物运动代码、摄像机的跟随代码以及人物动画效果的制作

完整代码展示如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.AI;//正确输入命名空间

 

public class Hero : MonoBehaviour {

 

    public NavMeshAgent agent;//只有这样才能正确命名这个

    public Animator anim;

   

 

    void Update () {

        if (Input.GetMouseButtonDown(0))//只有当鼠标点击时,需要进行检测,0表示鼠标左键

        {

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//获取射线。ScreenPointToRay将屏幕坐标转换成射线,通过鼠标点击进行屏幕坐标获取

            RaycastHit hit;//用来保存碰撞信息

            if (Physics.Raycast(ray, out hit)) //用来检测碰撞信息,传一个射线,再传一个输出

            {

                print(hit.point);//此时点击地面Console会出现相应的坐标destination来对目标位置进行设置

                agent.SetDestination(hit.point);//使用

            }

        }

        anim.SetFloat("speed", agent.velocity.magnitude);//只需要获取速度的大小

    }

}