/* 设计模式学习--状态模式
* 优点:在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为。
* 如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,
* 碰到复杂的情况就会造成代码结构的混乱。在这种情况下,就可以使用状态模式来解决问题。
* 定义:状态模式允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。
* 游戏开发时常常碰到设置主角状态的问题,通常解决办法可以用unity自带的动画状态机也
* 自己写一个有限状态机FSM等方法来解决。
* 实例: 这里假设主角有3种状态:Idle(闲置) run(跑)attack(攻击)
*
*
*/
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StateStudy : MonoBehaviour
{
void Start()
{
Player playerIdle = new Player(new Idle());
Player playerRun = new Player(new Run());
Player playerAttack = new Player(new Attack());
playerIdle.UseState();
playerRun.UseState();
playerAttack.UseState();
}
}//StateStudyclass_end
/// <summary>
/// 主角类,定义当前的状态
/// </summary>
public class Player
{
private IState mState;
/// <summary>
/// 定义Player的初始状态
/// </summary>
/// <param name="mState"></param>
public Player(IState mState)
{
this.mState = mState;
}
public void UseState()
{
mState.SetState();
}
}
/// <summary>
/// 抽象状态类,定义一个接口以封装与IState的一个特定状态相关的行为
/// </summary>
public abstract class IState
{
public abstract void SetState();
}
/// <summary>
/// Istate的子类,用来设置Idle的状态
/// </summary>
public class Idle : IState
{
public override void SetState()
{
Debug.Log("主角闲置");
}
}
/// <summary>
/// Istate的子类,用来设置Run的状态
/// </summary>
public class Run : IState
{
public override void SetState()
{
Debug.Log("主角奔跑");
}
}
/// <summary>
/// Istate的子类,用来设置 Attack 的状态
/// </summary>
public class Attack : IState
{
public override void SetState()
{
Debug.Log("主角攻击");
}
}
//严重怀疑自己对状态模式有严重的误解
//先记录,有了新的理解在来修正