你瞅啥?——Animation Rigging 实现NPC视线跟随

你瞅啥?——Animation Rigging 实现NPC视线跟随

首页动作格斗你瞅啥更新时间:2024-04-09

作者: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/

,
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved