你瞅啥?——Animation Rigging 實現(xiàn)NPC視線跟隨

作者:Truly
在一些游戲中,如果玩家從NPC面前經過,NPC的頭會在一定的范圍內朝向玩家,這次我們用Animation Rigging來實現(xiàn)這個功能。實現(xiàn)效果如下:

一、基本組件
Animation Rigging是基于Animation C# Jobs構建的程序化動畫綁定系統(tǒng),可以在運行時更新動畫骨骼的運動行為。
在開始具體操作前,先簡單了解各個相關組件的作用(快速瀏覽即可)。
其實下邊的一堆定義,用人話(可能不太準確)來說大概就是:
用Rig Constraints設置想要的運動規(guī)則,Rig組件會把這些信息收集起來傳給Rig Builder,Rig Builder生成新的動作“覆蓋”到動畫狀態(tài)機上。
1.Bone Renderer
Bone Renderer可以在Scene窗口中顯示骨骼,只需把對應骨骼的添加進Transform列表,便能可視化列表內容,一個角色可有多個Bone Render組件。

2.Rig Constraints 綁定約束
Rig Constraints 的作用是程序化控制骨骼,約束對應骨骼的運動,Unity中預置了各種不同作用的約束,也可以自行編寫。

3.Rig
Rig用于收集其子物體的Rig Constraints并生成列表,然后交給Rig Builder。Rig組件要與骨骼的根節(jié)點同一層級。

4.Rig Builder
Rig Builder用于生成Playable Graph,并且把Playable Graph添加到動畫狀態(tài)機中。Rig Builder需要與Animator組件在同一個Game Object上。

二 、導入資源包
1.本項目使用的是Unity 2019.3,打開資源包管理器:菜單欄Window > Package Manager
2. Advanced >?Show preview packages
3.選中Animation Rigging并安裝

三、實現(xiàn)功能
1.添加基本組件
(1)在Animator組件所在的Game Object上添加Rig Builder組件。

(2)在骨骼根節(jié)點的同一層級新建空的Game Object,重命名為Rigs并添加Rig組件,然后把Rig拖進Rig Bulider中。

(3)在Rigs Game Object下新建子物體,重命名為HeadAim并添加Multi-Aim Constraint組件。Multi-Aim Constraint可以旋轉Game Object使其某個軸朝向目標。

2.設置Multi-Aim Constraint組件參數(shù)

(1)Weight(權重):1代表被約束的對象會完全根據(jù)下邊的設置去運動,本次將在腳本中控制權重。
(2)Constrained Object(被約束的對象):把角色骨骼的Head節(jié)點拖進Constrained Object。意味著Head節(jié)點將會受到控制。
(3)Aim Axis:Z,把Head節(jié)點的Z軸朝向目標。
(4)Source Objects(可理解為目標對象):在角色下新建空Game Object,重命名為AimTarget并拖進Source Objects欄。第三部分將會通過腳本控制AimTarget的Transform,從而實現(xiàn)NPC視線跟隨效果。
(5)Constrained Axes(約束軸):僅勾選Y軸,因為面向玩家只需繞Y軸旋轉頭部。

(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; //發(fā)現(xiàn)玩家時瞄準速度(調節(jié)權重)
?
??? public Transform headTrans; //畫線相關
?
??? void Start()
??? {
??????? multiAimConstraint.weight = 0;
??? }
?
②拖入對應變量賦值

(4)在NPC角色中添加一個Sphere Collider,勾選Is Trigger并且調節(jié)大小,用其模擬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()中根據(jù)LookTrans更新aimTarget的位置,同時調節(jié)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實現(xiàn)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

咱們的游戲開發(fā)交流群也歡迎強勢插入:869551769
希望參與線下游戲開發(fā)學習的,歡~~~~~~迎訪問:http://levelpp.com/