一、确定大致需要
1、Context类
2、state接口类
3、两个具体实现类作为接口类的子类
二、初步代码实现
然后在 context类中定义接口类
三、对脚本继承
在实现类中,设置状态切换
注意
1、在变量前加一个m,指的是私有变量member
总代码
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.SocialPlatforms;
//使用状态模式
public class DM01Sate : MonoBehaviour
{
void Start()
{
//声明状态的拥有者 new一个context
Context context = new Context();
//设置默认状态
context.SetState(new ConcreteStateA(context));
context.Handle(5);
context.Handle(20);
context.Handle(30);
context.Handle(4);
context.Handle(6);
}
}
public class Context//定义一个类
{
private IState mState;//定义下面的这个状态
//然后对状态进行设置(处于哪个状态)提供一个方法
public void SetState(IState state)
{
mState = state;
}
public void Handle(int arg)//调用Handle方法
{
mState.Handle(arg);
}
}
public interface IState//写一个接口类,包含方法
{
void Handle(int arg);//定义一个方法,传入参数
}
public class ConcreteStateA : IState//写一个具体的实现类,作为接口的子类
{
private Context mContext;
public ConcreteStateA(Context context)//传入参数,知道属于哪个具体类
{
mContext = context;
}
public void Handle(int arg)
{
Debug.Log("ConcreateStateA.Handle" + arg);
if (arg > 10)//当参数(arg)。。。
{
mContext.SetState(new ConcreteStateB(mContext));
}
}
}
public class ConcreteStateB : IState//写第二个具体的实现类,作为接口的子类
{
private Context mContext;
public ConcreteStateB(Context context)//传入参数,知道属于哪个具体类
{
mContext = context;
}
public void Handle(int arg)
{
Debug.Log("ConcreteStateB.Handle" + arg);
if (arg <= 10)
{
mContext.SetState(new ConcreteStateA(mContext));
}
}
}