一.BlendTree混合树的使用
1.放入一组动画,成为类似的动画片段,相当于一个动画合成器
2.BlendType
1D 一维模式
2D simple Directional
Animator aniChan;
// Use this for initialization
void Start () {
aniChan = GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
aniChan.SetFloat("RunAD", Input.GetAxis("Horizontal"));
aniChan.SetFloat("RunWS", Input.GetAxis("Vertical"));
//设置它的值为 -1 到 1;
}
二.动画层以及事件的应用
1.实现两个动画的重合使用时
Avatar Mask 骨骼遮罩
2.IKpress 反向动力学
通过子节点控制父节点,例如:通过眼睛的移动来控制头部位置的移动
Animator animator;
//控制头部的目标物体
public GameObject target;
//控制手或脚的目标物体
public GameObject targetTemp;
// Use this for initialization
void Start () {
animator = GetComponent<Animator>();
}
/// <summary>
/// 处理方向动力学的函数
/// </summary>
void OnAnimatorIK()
{
if (target != null)
{
//设置目标对象的权重
animator.SetLookAtWeight(1);
//看向目标物体的位置 来控制头部的移动
animator.SetLookAtPosition(target.transform.position);
}
if (targetTemp != null)
{
//设置 左手的 位置和旋转 权重
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
//设置 人物IK的移动
animator.SetIKPosition(AvatarIKGoal.LeftHand, targetTemp.transform.position);
animator.SetIKRotation(AvatarIKGoal.LeftHand, targetTemp.transform.rotation);
}
}
三.寻路系统
1.NavMesh 导航网格
(1)NavigationStatic 设置为静态
(2)Back 烘焙面板
(3)实现自动寻路 NavMeshAgent.SetDestination( Vector3 )
agent.SetDestination(target.position);
(4)实现鼠标点击自动寻路
引用——using UnityEngine.AI;
//NavMeshAgent 网格代理
NavMeshAgent agent;
// 需要寻找的目标物体
public Transform target;
//射线
Ray ray;
//被检测到的物体
RaycastHit hit;
// Use this for initialization
void Start () {
agent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update () {
//实现寻路
//agent.SetDestination(target.position);
//从主相机射出 射线 的位置为鼠标所在的位置
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(Physics.Raycast(ray,out hit, 100))
{
//鼠标点击左键
if (Input.GetMouseButtonDown(0))
{
//找到鼠标点击到的位置
agent.SetDestination(hit.point);
}
}
}
(5)NavMeshAgent组件
Stoping Distance 停止距离 跟需要寻找的对象的距离
Auto BraKing 自动制动
Obstacle Avoidance 避障 避免两个寻路物体穿透,可以调整障碍盒的大小
Priority 寻路物体的优先级 数字越小 优先级越高(0-99)
(6) NavMeshObstacle 实现动态障碍物的遮挡
Carve 实现动态遮挡
Carve Only Stationa 是否实现实时动态遮挡 勾选则是在静止后对NavMesh网格进行去除 不勾选则实时去除
(7)Off Mesh LInk 断开网格链接
可以搭建一个线性的桥 从而使使两个物体之间跳跃过去
设置双向的桥,进行连接跳跃
【烘焙遇到的问题】当物体需要被烘焙时,没有烘焙上,可能是没有采样上,
一是可以放在NavMesh中的白线上,重新烘焙一下进行采样
二是可以进行调整物体的大小,等调整到一定程度上就会显示烘焙到物体上的网格
(8)Areas
Areas Mark 区域遮罩 可以在可视的组件编辑面板上勾选,也可以通过2ⁿ在代码中表示,2ⁿ表示的为第n层
NavMeshAgent.areaMask = -1;
0代表nothing层,-1代表everything,2ⁿ代表第n层,x<<n 表示x·2ⁿ
NavMesh寻找的是消耗最少的路程,不一定是最近的路
【Test】寻路练习
//需要一个计时器 进行计算
float t = 1;
//实例化小球 需要一个小球的预制体
public GameObject spherePrefab;
//目标位置
public Transform target;
//一个颜色的数组
Color[] c = { Color.red, Color.green, Color.blue };
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
t += Time.deltaTime;
if (t > 3)
{
t = 0;
NavMeshAgent agent = CreateSphere();
agent.SetDestination(target.position);
Destroy(agent.gameObject, 10f);
}
}
//实例化小球
public NavMeshAgent CreateSphere()
{
int r = Random.Range(0, 3);
//实例化小球
GameObject go = Instantiate(spherePrefab);
//给小球添加颜色
go.GetComponent<MeshRenderer>().material.color = c[r];
//获取 agent的组件
NavMeshAgent * = go.AddComponent<NavMeshAgent>();
*.areaMask = GetAreaMarkFuc(r);
return *;
}
/// <summary>
/// 获取区域遮罩
/// </summary>
/// <param name="sphereColor"></param>
/// <returns></returns>
public int GetAreaMarkFuc(int r)
{
//设置区域遮罩的值为0
int area = 0;
switch (r)
{
case 0:
area = 1 + 8;
break;
case 1:
area = 1 + 16;
break;
case 2:
area = 1 + 32;
break;
default:
break;
}
return area;
}
四.NavMeshComponent 导航网格新组件
1.NavMeshComponent插件的具体应用
2.下载地址 GitHub
3.插件的使用
(1)Nav Mesh Surface
不需要设置静态,可以直接在组件操作上选择烘焙
(2)针对不同的Agent 烘焙出不同的 导航网格
设置AgentType
NavMeshSurface组件在同一个对象上可以多次添加
(3)可以烘焙垂直的平面
当有垂直面和水平面时,不能直接相连移动,需要通过NavMesh中的跳跃来进行实现