A计划学习--游戏设计模式--状态模式

/*                 设计模式学习--状态模式
 * 优点:在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为。
 *       如果用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("主角攻击");
    }
}

//严重怀疑自己对状态模式有严重的误解

//先记录,有了新的理解在来修正

猜你喜欢

转载自blog.csdn.net/qq_35711014/article/details/79978791