Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考
此代码仅为较上一P有所改变的代码
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
Enemy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : Entity
{
[Header("Move Info")]
public float moveSpeed;
public float idleTime;
#region 类
public EnemyStateMachine stateMachine;
#endregion
protected override void Awake()
{
base.Awake();
stateMachine = new EnemyStateMachine();
}
protected override void Start()
{
base.Start();
}
protected override void Update()
{
base.Update();
stateMachine.currentState.Update();
}
}
Enemy_Skeleton.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditorInternal;
using UnityEngine;
public class Enemy_Skeleton : Enemy
{
#region 类State
public SkeletonIdleState idleState { get; private set; }
public SkeletonMoveState moveState { get; private set; }
#endregion
protected override void Awake()
{
base.Awake();
idleState = new SkeletonIdleState(this, stateMachine, "Idle", this);
moveState = new SkeletonMoveState(this,stateMachine, "Move", this);
}
protected override void Start()
{
base.Start();
stateMachine.Initialize(idleState);
}
protected override void Update()
{
base.Update();
}
}
EnemyState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyState
{
protected Enemy enemyBase;
protected EnemyStateMachine stateMachine;
protected bool triggerCalled;
private string animBoolName;
protected float stateTimer;
public EnemyState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName)
{
this.enemyBase = _enemyBase;
this.stateMachine = _stateMachine;
this.animBoolName = _animBoolName;
}
public virtual void Enter()
{
triggerCalled = false;
enemyBase.anim.SetBool(animBoolName, true);
}
public virtual void Update()
{
stateTimer -= Time.deltaTime;
}
public virtual void Exit()
{
enemyBase.anim.SetBool(animBoolName, false);
}
}
EnemyStateMachine.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyStateMachine
{
public EnemyState currentState { get; private set; }//记得加private set,不然很可能会被外部改了
public void Initialize(EnemyState _startState)
{
currentState = _startState;
currentState.Enter();
}
public void ChangeState(EnemyState _newState)
{
currentState.Exit();
currentState = _newState;
currentState.Enter();
}
}
SkeletonIdleState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SkeletonIdleState : EnemyState
{
private Enemy_Skeleton enemy;//创建独特的Skeleton的类,便于将Skeleton里的东西传过去
public SkeletonIdleState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName,Enemy_Skeleton _enemy) : base(_enemyBase, _stateMachine, _animBoolName)
{
enemy = _enemy;
}
public override void Enter()
{
base.Enter();
stateTimer = enemy.idleTime;
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
if(stateTimer < 0)
{
stateMachine.ChangeState(enemy.moveState);
}
}
}
SkeletonMoveState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SkeletonMoveState : EnemyState
{
private Enemy_Skeleton enemy;//创建独特的Skeleton的类,便于将Skeleton里的东西传过去
public SkeletonMoveState(Enemy _enemyBase, EnemyStateMachine _stateMachine, string _animBoolName,Enemy_Skeleton _enemy) : base(_enemyBase, _stateMachine, _animBoolName)
{
enemy = _enemy;
}
public override void Enter()
{
base.Enter();
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
enemy.SetVelocity(enemy.moveSpeed * enemy.facingDir, enemy.rb.velocity.y);
if(enemy.IsWallDetected()||!enemy.IsGroundDetected())//当撞墙或者没有路的时候翻转
{
enemy.Flip();
stateMachine.ChangeState(enemy.idleState);
}
}
}