赞
踩
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
- using System.Collections;
- using System.Collections.Generic;
- using Unity.VisualScripting;
- using UnityEngine;
-
- public class Player : MonoBehaviour
- {
- [Header("Move Info")]
- public float moveSpeed;//定义速度,与xInput相乘控制速度的大小
- public float jumpForce;
- [Header("Collision Info")]
- [SerializeField] private Transform groundCheck;//transform类,代表的时物体的位置,后面会来定位子组件的位置
- [SerializeField] private float groundCheckDistance;
- [SerializeField] private Transform wallCheck;//transform类,代表的时物体的位置,后面会来定位子组件的位置
- [SerializeField] private float wallCheckDistance;
- [SerializeField] private LayerMask whatIsGround;//LayerMask类,与Raycast配合,https://docs.unity3d.com/cn/current/ScriptReference/Physics.Raycast.html
- #region 定义Unity组件
- public Animator anim { get; private set; }//这样才能配合着拿到自己身上的animator的控制权
- public Rigidbody2D rb { get; private set; }//配合拿到身上的Rigidbody2D组件控制权
- #endregion
- #region 定义States
- public PlayerStateMachine stateMachine { get; private set; }
- public PlayerIdleState idleState { get; private set; }
- public PlayerMoveState moveState { get; private set; }
- public PlayerJumpState jumpState { get; private set; }
- public PlayerAirState airState { get; private set; }//与其说是airState,不如说是FallState
- #endregion
- private void Awake()
- {
- stateMachine = new PlayerStateMachine();
- //通过构造函数,在构造时传递信息
- idleState = new PlayerIdleState(this, stateMachine, "Idle");
- moveState = new PlayerMoveState(this, stateMachine, "Move");
- jumpState = new PlayerJumpState(this, stateMachine, "Jump");
- airState = new PlayerAirState(this, stateMachine, "Jump");
- //this 就是 Player这个类本身
- }//Awake初始化所以State,为所有State传入各自独有的参数,及animBool,以判断是否调用此动画(与animatoin配合完成)
- private void Start()
- {
- anim = GetComponentInChildren<Animator>();//拿到自己身上的animator的控制权
- rb = GetComponent<Rigidbody2D>();
- stateMachine.Initialize(idleState);
- }
- private void Update()//在mano中update会自动刷新但其他没有mano的不会故,需要在这个updata中调用其他脚本中的函数stateMachine.currentState.update以实现 //stateMachine中的update
-
- {
- stateMachine.currentState.Update();//反复调用CurrentState的Update函数
- }
-
- public void SetVelocity(float _xVelocity,float _yVelocity)
- {
- rb.velocity = new Vector2(_xVelocity, _yVelocity);//将rb的velocity属性设置为对应的想要的二维向量。因为2D游戏的速度就是二维向量
- }//控制速度的函数,此函数在其他State中可能会使用,但仅能通过player.SeVelocity调用
- public bool IsGroundDetected()
- {
- return Physics2D.Raycast(groundCheck.position, Vector2.down, groundCheckDistance, whatIsGround);
- }//通过RayCast检测是否挨着地面,https://docs.unity3d.com/cn/current/ScriptReference/Physics.Raycast.html
- //xxxxxxxx() => xxxxxxxx == xxxxxxxxxx() return xxxxxxxxx;
- private void OnDrawGizmos()
- {
- Gizmos.DrawLine(groundCheck.position, new Vector3(groundCheck.position.x, groundCheck.position.y - groundCheckDistance));//绘制一条从 from(前面的) 开始到 to(后面的) 的线。
- Gizmos.DrawLine(wallCheck.position, new Vector3(wallCheck.position.x + wallCheckDistance, wallCheck.position.y ));//绘制一条从 from(前面的) 开始到 to(后面的) 的线。
- }//画线函数
- }
- using System.Collections;
- using System.Collections.Generic;
- using System.Security.Authentication.ExtendedProtection;
- using UnityEngine;
- //被继承的总类,后面的所以state都需要继承它
- //实际上Player并没有进入过这个状态,没有调用此脚本,所有的调用均属于此脚本的子脚本
- public class PlayerState
- {
- protected PlayerStateMachine stateMachine;//创建PlayerStateMachine类,以承接来自Player.cs传过来的东西
- protected Player player;//创建Player类,以承接来自Player.cs传过来的东西
-
- #region Unity组件
- protected Rigidbody2D rb;//纯简化,将player.rb --> rb
- #endregion
-
- private string animBoolName;//控制此时的anim的BOOL值
- protected float xInput;//设置一个可以保存当前是否在按移动键的变量
- public PlayerState(Player _player,PlayerStateMachine _stateMachine,string _animBoolName)
- {
- this.player = _player;
- this.stateMachine = _stateMachine;
- this.animBoolName = _animBoolName;
- }//构造函数,用于传递信息
-
- public virtual void Enter()
- {
- player.anim.SetBool(animBoolName, true);//通过animator自带的函数,将animator里的Bool值改变为想要的值
- rb = player.rb;//纯简化,将player.rb --> rb
-
- }
- public virtual void Update()
- {
-
- xInput = Input.GetAxisRaw("Horizontal");//对于键盘和游戏杆输入,该值将处于 -1...1 的范围内。 由于未对输入进行平滑处理,键盘输入将始终为 -1、0 或 1。 如果您想自己完成键盘输入的所有平滑处理,这非常有用。
- player.anim.SetFloat("yVelocity", rb.velocity.y);//通过animator自带的函数,将animator里的Float值改变为想要的值,改变yVelocity以控制Jump与Fall动画的切换
- }
- public virtual void Exit()
- {
- player.anim.SetBool(animBoolName, false);//通过animator自带的函数,将animator里的Bool值改变为想要的值
- }
-
- }
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class PlayerStateMachine
- {
- public PlayerState currentState { get; private set; }
- public void Initialize(PlayerState _startState)
- {
- currentState = _startState;
- currentState.Enter();
- }//初始化状态函数,及通过将idleState传送进来,以便于调用idleState中的Enter函数
-
- public void ChangeState(PlayerState _newState)
- {
- currentState.Exit();
- currentState = _newState;
- currentState.Enter();
- }//更改状态函数
- //1.调用当前状态的Exit函数,使动画为false
- //2.传入新的状态,替换原来的状态
- //3.调用新的状态的Enter函数
- }
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- //GroundState用于保证只有在Idle和Move这两个地面状态下才能调用某些函数,并且稍微减少一点代码量
- public class PlayerGroundState : PlayerState
- {
- public PlayerGroundState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
- {
- }
-
- public override void Enter()
- {
- base.Enter();
- }
- public override void Update()
- {
- base.Update();
- if (Input.GetKeyDown(KeyCode.Space)&&player.IsGroundDetected())
- {
- stateMachine.ChangeState(player.jumpState);
- }//空格切换为跳跃状态
- }
- public override void Exit()
- {
- base.Exit();
- }
-
-
- }
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class PlayerIdleState : PlayerGroundState//继承函数,获得PlayerState里的所有函数和参数
- {
- public PlayerIdleState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
- {
- }//构造函数,用于传递信息。
- //当外补New出对象时,New出的对象里传入参数
-
- public override void Enter()
- {
-
- base.Enter();
- }
-
- public override void Exit()
- {
- base.Exit();
- }
-
- public override void Update()
- {
- base.Update();
- if(xInput != 0)
- {
- stateMachine.ChangeState(player.moveState);//在这里我们能使用Player里的东西,主要是因为我们通过构造函数传过来Player实体,如果不传,则无法使用已经存在了的Player实体。
- }
- }
- }
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class PlayerMoveState : PlayerGroundState
- {
- public PlayerMoveState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
- {
- }//构造函数,用于传递信息。
- //当外补New出对象时,New出的对象里传入参数
-
- public override void Enter()
- {
- base.Enter();
- }
-
- public override void Exit()
- {
- base.Exit();
- }
-
- public override void Update()
- {
- base.Update();
- player.SetVelocity(xInput*player.moveSpeed, rb.velocity.y);//player.rb.velocity.y默认的为0,player.moveSpeed在player中定义,但可以在Unity引擎中更改
- if (xInput==0)
- {
- stateMachine.ChangeState(player.idleState);//在这里我们能使用Player里的东西,主要是因为我们通过构造函数传过来Player实体,如果不传,则无法使用已经存在了的Player实体。
- }
- }
- }
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class PlayerJumpState : PlayerState
- {
- public PlayerJumpState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
- {
- }
-
- public override void Enter()
- {
- base.Enter();
- rb.velocity = new Vector2(rb.velocity.x, player.jumpForce);//将y轴速度改变
- }
- public override void Update()
- {
- base.Update();
- if (rb.velocity.y < 0)//当速度小于0时切换为airState
- {
- stateMachine.ChangeState(player.airState);//与其说是airState,不如说是FallState
- }
- }
-
- public override void Exit()
- {
- base.Exit();
-
- }
-
- }
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class PlayerAirState : PlayerState
- {
- public PlayerAirState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
- {
- }
-
- public override void Enter()
- {
- base.Enter();
- }
- public override void Update()
- {
- base.Update();
- if (player.IsGroundDetected())
- {
- stateMachine.ChangeState(player.idleState);
- }//暂时使用,因为这样写是由错误的
- }
- public override void Exit()
- {
- base.Exit();
- }
-
-
- }
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。