国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Unity3D StateMachine擴展優化

2019-11-09 19:01:43
字體:
來源:轉載
供稿:網友

1.Unity3D StateMachine正常的狀態下是每個動做結束后沒有回調,所以有時候我們要判斷當前不是哪一個動作是要做什么的,如下:

public class TestJS : MonoBehaviour { public Animator _animator; PRivate AnimatorTransitionInfo _changeAnimator; void Update () { _changeAnimator = _animator.GetAnimatorTransitionInfo(0); if (!_changeAnimator.IsName("xxx")) { //Do Sth } }}

2.這時我們就可以優化:對他們每次,進入結束弄一個回調=>狀態改變: 這里寫圖片描述 在AnimationStateMachine里面寫結束,進入的回調。

using UnityEngine;using System.Collections;using UnityEngine.Experimental.Director;public class AnimationStateMachine : StateMachineBehaviour{ public System.Action<int> EnterStateCallback; public System.Action<int> ExitStateCallback; public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnStateEnter(animator, stateInfo, layerIndex); if (EnterStateCallback != null) { EnterStateCallback(stateInfo.fullPathHash); } } public override void OnStateMachineEnter(Animator animator, int stateMachinePathHash) { base.OnStateMachineEnter(animator, stateMachinePathHash); if (EnterStateCallback != null) { EnterStateCallback(stateMachinePathHash); } } public override void OnStateMachineExit(Animator animator, int stateMachinePathHash) { base.OnStateMachineExit(animator, stateMachinePathHash); if (ExitStateCallback != null) { ExitStateCallback(stateMachinePathHash); } } public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnStateExit(animator, stateInfo, layerIndex); if (ExitStateCallback != null) { ExitStateCallback(stateInfo.fullPathHash); } }}

3.這些回調還沒有被初始化,此時在應用這個AnimatorControl的物體上添加腳本進行初始化:

using UnityEngine;using System.Collections;public class ParkourPlayerAnimatorController : MonoBehaviour{ //引用 private ParkourPlayerAnimationHash animHash; private int random; public Animator flyRobot; [SerializeField] private Animator playerAnimator; public ParkourAnimationStates CurrentAnimationState { get; private set; } // Use this for initialization void Awake() { random = Random.Range(0,3); animHash = GetComponent<ParkourPlayerAnimationHash>(); //最重要的在這邊初始化回調函數因為結束回調暫時還可以省略,所以只是初始化進入某個動畫的回調: AnimationStateMachine[] _animStateMachine = playerAnimator.GetBehaviours<AnimationStateMachine>(); for (int i = 0; i < _animStateMachine.Length; i++) { _animStateMachine[i].EnterStateCallback = SetCurrentAnimationState; } } // Update is called once per frame void Update() { } //可以保存一個CurrentAnimationState 的狀態而不用像1.在Update一直判斷。 void SetCurrentAnimationState(int hashName) { if (hashName == animHash.RunState) { CurrentAnimationState = ParkourAnimationStates.Run; } else if (hashName == animHash.RollState) { CurrentAnimationState = ParkourAnimationStates.Roll; } else if (hashName == animHash.JumpState || hashName == animHash.JumpState1 || hashName == animHash.JumpState2) { CurrentAnimationState = ParkourAnimationStates.Jump; } else if (hashName == animHash.MoveSideState) { CurrentAnimationState = ParkourAnimationStates.MoveSide; } else if (hashName == animHash.FallState) { CurrentAnimationState = ParkourAnimationStates.Fall; } else if (hashName == animHash.FlyTrigger) { CurrentAnimationState = ParkourAnimationStates.Fly; } } public void Run() { playerAnimator.SetBool(animHash.RunBool, true); } public void Stop() { playerAnimator.SetBool(animHash.RunBool, false); } public void PlayJump() { switch (random % 3) { case 0: playerAnimator.SetTrigger(animHash.JumpTrigger); break; case 1: playerAnimator.SetTrigger(animHash.JumpTrigger1); break; case 2: playerAnimator.SetTrigger(animHash.JumpTrigger2); break; } random++; } public void PlayRoll() { playerAnimator.SetTrigger(animHash.RollTrigger); } public void PlayMoveSideLeft() { playerAnimator.SetTrigger(animHash.MoveSideLeftTrigger); } public void PlayMoveSideRight() { playerAnimator.SetTrigger(animHash.MoveSideRightTrigger); } public void PlayFly() { playerAnimator.SetTrigger(animHash.FlyTrigger); } public void PlayFall() { playerAnimator.SetTrigger(animHash.FallTrigger); } public void PlayCatchRob() { playerAnimator.SetTrigger("Catch"); } public void PlayFlyRobot() { playerAnimator.SetTrigger(animHash.FlyTrigger); }}在3中有一個引用到animHash判斷每個動畫SetCurrentAnimationState(int hashName)是否相等,來記錄using UnityEngine;using System.Collections;public class ParkourPlayerAnimationHash : MonoBehaviour{ public int IdleState { get; private set; } public int RunState { get; private set; } public int JumpState { get; private set; } public int JumpState1 { get; private set; } public int JumpState2 { get; private set; } public int MoveSideState { get; private set; } public int RollState { get; private set; } public int FallState { get; private set; } public int RunBool { get; private set; } public int JumpTrigger { get; private set; } public int JumpTrigger1 { get; private set;} public int JumpTrigger2 { get; private set;} public int RollTrigger { get; private set; } public int FallTrigger { get; private set; } public int FlyTrigger { get; private set; } public int MoveSideLeftTrigger { get; private set; } public int MoveSideRightTrigger { get; private set; } // Use this for initialization void Awake() { IdleState = Animator.StringToHash("Base Layer.待機"); RunState = Animator.StringToHash("Base Layer.跑步"); JumpState = Animator.StringToHash("Base Layer.跳"); JumpState1 = Animator.StringToHash("Base Layer.跳1"); JumpState2 = Animator.StringToHash("Base Layer.跳2"); MoveSideState = Animator.StringToHash("Base Layer.側移"); RollState = Animator.StringToHash("Base Layer.下滑"); FallState = Animator.StringToHash("Base Layer.摔倒"); FlyTrigger = Animator.StringToHash("Fly"); RunBool = Animator.StringToHash("Run"); JumpTrigger = Animator.StringToHash("Jump"); JumpTrigger1 = Animator.StringToHash("Jump1"); JumpTrigger2 = Animator.StringToHash("Jump2"); RollTrigger = Animator.StringToHash("Roll"); FallTrigger = Animator.StringToHash("Fall"); MoveSideLeftTrigger = Animator.StringToHash("MoveSideLeft"); MoveSideRightTrigger = Animator.StringToHash("MoveSideRight"); }}

這里寫圖片描述


All our dreams can come true, if we have thecourage to pursue them. 我們所有的夢想都可以成真,只要我們有勇氣去追求它們。 ————沃爾特·迪斯尼


上一篇:Ionic2雙擊退出應用

下一篇:adb shell 小結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 无为县| 右玉县| 凉城县| 临夏市| 梁平县| 罗江县| 衢州市| 利津县| 永定县| 麻江县| 新安县| 措勤县| 泰州市| 正阳县| 竹北市| 辰溪县| 京山县| 宾川县| 邯郸市| 万宁市| 健康| 临城县| 益阳市| 肥东县| 扎兰屯市| 福安市| 黄陵县| 东乡县| 肇庆市| 金平| 仪征市| 自治县| 灵石县| 成武县| 广州市| 怀来县| 宝丰县| 城步| 南华县| 宁德市| 钟山县|