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如图:
|
3)拖拽到相应位置
|
如何编辑Animation—Controller?
选中需要编辑的组件(本场景中的人物)—点击Windows—选择Animator。
(1)默认状态:直接拖拽
(2)行走和奔跑,仅将动画效果进行拖拽
(3)静止、行走和奔跑状态的切换
使用人物(hero)属性面板中的Nav Mesh Agent中的speed(最大速度)进行调整。使用脚本进行切换。
(4)状态的变化需要在状态器中添加一些东西,重命名为speed
(5)将静止状态和行走状态进行连接
(6)右击如图所标注位置后出现相关属性框
(7)单击此处,生成相关内容
(8)如上图中,将Greate(最大速度)大于0时,切换速度到walk模式
(9)在walk动画上重复第(5)步,生成切换成静止模式的箭头线条,将速度的最大值改为最小值(下拉菜单),修改为小于0.1
(10)取消选择上图右侧属性界面中的Has Exit Time
(11)同理操作walk和run的动画切换。
注意:(3)步中说到的speed是最大速度,任何地方的速度都不能大于该数字。
(12)此时点击播放,仍然是静止状态。需要对相关参数进行赋值,在Hero代码中进行完善。
设置变量 public Animator anim; 直接在属性面板中进行拖拽 |
完整代码展示如下: 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);//只需要获取速度的大小 } } |