当前位置:   article > 正文

类银河恶魔城学习记录1-2 Player动画基本设置源代码 P29

类银河恶魔城学习记录1-2 Player动画基本设置源代码 P29
Player.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Unity.VisualScripting;
  4. using UnityEngine;
  5. public class Player : MonoBehaviour
  6. {
  7. #region 定义Unity组件
  8. public Animator anim { get; private set; }//这样才能配合着拿到自己身上的animator的控制权
  9. #endregion
  10. #region 定义States
  11. public PlayerStateMachine stateMachine { get; private set; }
  12. public PlayerIdleState idleState { get; private set; }
  13. public PlayerMoveState moveState { get; private set; }
  14. #endregion
  15. private void Awake()
  16. {
  17. stateMachine = new PlayerStateMachine();
  18. //通过构造函数,在构造时传递信息
  19. idleState = new PlayerIdleState(this, stateMachine, "Idle");
  20. moveState = new PlayerMoveState(this, stateMachine, "Move");
  21. //this 就是 Player这个类本身
  22. }//Awake初始化所以State,为所有State传入各自独有的参数,及animBool,以判断是否调用此动画(与animatoin配合完成)
  23. private void Start()
  24. {
  25. anim = GetComponentInChildren<Animator>();//拿到自己身上的animator的控制权
  26. stateMachine.Initialize(idleState);
  27. }
  28. private void Update()//在mano中update会自动刷新但其他没有mano的不会故,需要在这个updata中调用其他脚本中的函数stateMachine.currentState.update以实现 //stateMachine中的update
  29. {
  30. stateMachine.currentState.Update();//反复调用CurrentState的Update函数
  31. }
PlayerState.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Security.Authentication.ExtendedProtection;
  4. using UnityEngine;
  5. //被继承的总类,后面的所以state都需要继承它
  6. //实际上Player并没有进入过这个状态,没有调用此脚本,所有的调用均属于此脚本的子脚本
  7. public class PlayerState
  8. {
  9. protected PlayerStateMachine stateMachine;//创建PlayerStateMachine类,以对其进行控制
  10. protected Player player;//创建Player类,以对其进行控制
  11. private string animBoolName;//控制此时的anim的BOOL值
  12. public PlayerState(Player _player,PlayerStateMachine _stateMachine,string _animBoolName)
  13. {
  14. this.player = _player;
  15. this.stateMachine = _stateMachine;
  16. this.animBoolName = _animBoolName;
  17. }//构造函数,用于传递信息
  18. public virtual void Enter()
  19. {
  20. player.anim.SetBool(animBoolName, true);//通过animator自带的函数,将animator里的Bool值改变为想要的值
  21. }
  22. public virtual void Update()
  23. {
  24. }
  25. public virtual void Exit()
  26. {
  27. player.anim.SetBool(animBoolName, false);//通过animator自带的函数,将animator里的Bool值改变为想要的值
  28. }
  29. }
 PlayerStateMachine.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class PlayerStateMachine
  5. {
  6. public PlayerState currentState { get; private set; }
  7. public void Initialize(PlayerState _startState)
  8. {
  9. currentState = _startState;
  10. currentState.Enter();
  11. }//初始化状态函数,及通过将idleState传送进来,以便于调用idleState中的Enter函数
  12. public void ChangeState(PlayerState _newState)
  13. {
  14. currentState.Exit();
  15. currentState = _newState;
  16. currentState.Enter();
  17. }//更改状态函数
  18. //1.调用当前状态的Exit函数,使动画为false
  19. //2.传入新的状态,替换原来的状态
  20. //3.调用新的状态的Enter函数
  21. }
 PlayerIdleState.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class PlayerIdleState : PlayerState//继承函数,获得PlayerState里的所有函数和参数
  5. {
  6. public PlayerIdleState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
  7. {
  8. }//构造函数,用于传递信息。
  9. //当外补New出对象时,New出的对象里传入参数
  10. public override void Enter()
  11. {
  12. base.Enter();
  13. }
  14. public override void Exit()
  15. {
  16. base.Exit();
  17. }
  18. public override void Update()
  19. {
  20. base.Update();
  21. if(Input.GetKeyDown(KeyCode.N))
  22. {
  23. stateMachine.ChangeState(player.moveState);//在这里我们能使用Player里的东西,主要是因为我们通过构造函数传过来Player实体,如果不传,则无法使用已经存在了的Player实体。
  24. }
  25. }
  26. }
 PlayerIdleState.cs
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class PlayerMoveState : PlayerState
  5. {
  6. public PlayerMoveState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
  7. {
  8. }//构造函数,用于传递信息。
  9. //当外补New出对象时,New出的对象里传入参数
  10. public override void Enter()
  11. {
  12. base.Enter();
  13. }
  14. public override void Exit()
  15. {
  16. base.Exit();
  17. }
  18. public override void Update()
  19. {
  20. base.Update();
  21. if (Input.GetKeyDown(KeyCode.N))
  22. {
  23. stateMachine.ChangeState(player.idleState);//在这里我们能使用Player里的东西,主要是因为我们通过构造函数传过来Player实体,如果不传,则无法使用已经存在了的Player实体。
  24. }
  25. }
  26. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57324?site
推荐阅读
相关标签
  

闽ICP备14008679号