作者:Truly
在一些游戏中,如果玩家从NPC面前经过,NPC的头会在一定的范围内朝向玩家,这次我们用Animation Rigging来实现这个功能。实现效果如下:
一、基本组件
Animation Rigging是基于Animation C# Jobs构建的程序化动画绑定系统,可以在运行时更新动画骨骼的运动行为。
在开始具体操作前,先简单了解各个相关组件的作用(快速浏览即可)。
其实下边的一堆定义,用人话(可能不太准确)来说大概就是:
用Rig Constraints设置想要的运动规则,Rig组件会把这些信息收集起来传给Rig Builder,Rig Builder生成新的动作“覆盖”到动画状态机上。
1.Bone Renderer
Bone Renderer可以在Scene窗口中显示骨骼,只需把对应骨骼的添加进Transform列表,便能可视化列表内容,一个角色可有多个Bone Render组件。
2.Rig Constraints 绑定约束
Rig Constraints 的作用是程序化控制骨骼,约束对应骨骼的运动,Unity中预置了各种不同作用的约束,也可以自行编写。
3.Rig
Rig用于收集其子物体的Rig Constraints并生成列表,然后交给Rig Builder。Rig组件要与骨骼的根节点同一层级。
4.Rig Builder
Rig Builder用于生成Playable Graph,并且把Playable Graph添加到动画状态机中。Rig Builder需要与Animator组件在同一个Game Object上。
二 、导入资源包
1.本项目使用的是Unity 2019.3,打开资源包管理器:菜单栏Window > Package Manager
2. Advanced > Show preview packages
3.选中Animation Rigging并安装
三、实现功能
1.添加基本组件
(1)在Animator组件所在的Game Object上添加Rig Builder组件。
(2)在骨骼根节点的同一层级新建空的Game Object,重命名为Rigs并添加Rig组件,然后把Rig拖进Rig Bulider中。
(3)在Rigs Game Object下新建子物体,重命名为HeadAim并添加Multi-Aim Constraint组件。Multi-Aim Constraint可以旋转Game Object使其某个轴朝向目标。
2.设置Multi-Aim Constraint组件参数
(1)Weight(权重):1代表被约束的对象会完全根据下边的设置去运动,本次将在脚本中控制权重。
(2)Constrained Object(被约束的对象):把角色骨骼的Head节点拖进Constrained Object。意味着Head节点将会受到控制。
(3)Aim Axis:Z,把Head节点的Z轴朝向目标。
(4)Source Objects(可理解为目标对象):在角色下新建空Game Object,重命名为AimTarget并拖进Source Objects栏。第三部分将会通过脚本控制AimTarget的Transform,从而实现NPC视线跟随效果。
(5)Constrained Axes(约束轴):仅勾选Y轴,因为面向玩家只需绕Y轴旋转头部。
NPC头部绕Y轴旋转,面朝AimTarget
(6) Max Limit(限制最大旋转角度):70,如果不进行角度限制且玩家站在NPC背后,那么这可能会变成一个恐怖游戏......
3.编写脚本
(1)在编写脚本前,先在玩家角色下新建一个空Game Object并重命名为LookTrans,调整到大概头部的位置(用作NPC瞄准的参考Transform)。接着把玩家的Tag改为Player。
(2)新建脚本,顶部添加Using UnityEngine.Animations.Rigging;
(3)①声明变量,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Animations.Rigging;
public class NPC : MonoBehaviour
{
public Transform aimTarget; //瞄准对象,Source Objects
public Transform lookTrans; //玩家身上的瞄准参考Transform
public MultiAimConstraint multiAimConstraint; //约束
public float aimSpeed = 4f; //发现玩家时瞄准速度(调节权重)
public Transform headTrans; //画线相关
void Start()
{
multiAimConstraint.weight = 0;
}
②拖入对应变量赋值
(4)在NPC角色中添加一个Sphere Collider,勾选Is Trigger并且调节大小,用其模拟NPC的探测范围。
(5)当玩家进入探测范围时,把lookTrans设置为玩家身上的LookTrans;当玩家退出探测范围时,把lookTrans设置为null.
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
lookTrans = other.transform.Find("LookTrans");
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
lookTrans = null;
}
}
(6)在LateUpdate()中根据LookTrans更新aimTarget的位置,同时调节Multi-Aim Constraint的权重。
private void LateUpdate()
{
if (lookTrans)
{
aimTarget.SetpositionAndRotation(lookTrans.position, lookTrans.rotation);
multiAimConstraint.weight = Mathf.Clamp01(multiAimConstraint.weight aimSpeed * Time.deltaTime);
}
else
{
multiAimConstraint.weight = Mathf.Clamp01(multiAimConstraint.weight - aimSpeed * Time.deltaTime);
}
Debug.DrawLine(headTrans.position, headTrans.position 3.5f * headTrans.forward, Color.red);
}
结语:利用Animation Rigging实现NPC视线跟随就介绍到这里,Unity还预置了很多好用的Rig Constraints(例如Two Bone IK Constraint:https://docs.unity3d.com/Packages/com.unity.animation.rigging@0.2/manual/constraints/TwoBoneIKConstraint.html 可以简便地制作手部或者脚部的IK),
有兴趣的小伙伴可以参考官方文档自行了解。
官方文档:https://docs.unity3d.com/Packages/com.unity.animation.rigging@0.2/manual/index.html
链接:https://pan.baidu.com/share/init?surl=IK89EfBHlZEpt12_dkAYFQ
提取码:jpka
咱们的游戏开发交流群也欢迎强势插入:869551769
希望参与线下游戏开发学习的,欢~~~~~~迎访问:http://levelpp.com/
,