我的状态由各州组织如下: BeginState PlayState WonState LostState
和一个管理它们的脚本,名为StateManager.cs:
public class StateManager : MonoBehaviour
{
private IStateBase activeState;
void Start ()
{
activeState = new BeginState (this);
}
void Update ()
{
if (activeState != null)
activeState.StateUpdate();
}
void OnGUI()
{
if (activeState != null)
activeState.ShowIt(); }
public void SwitchState(IStateBase newState)
{
activeState = newState;
}
}
问题是当我将脚本组件附加到游戏对象时,这个statemanager.cs脚本只是我使用的,因为它被归类为Monobehaviour。
例如,我想使用Playtstate.cs,但我无法使用。
using UnityEngine;
using Assets.Code.Scripts;
namespace Assets.Code.States
{
public class PlayState : IStateBase
{
private StateManager manager;
public PlayState (StateManager managerRef)
{
manager = managerRef;
Debug.Log ("Constructing PlayState");
}
public void StateUpdate()
{
if (Input.GetKeyUp(KeyCode.Space))
{
manager.SwitchState(new WonState (manager));
}
if (Input.GetKeyUp(KeyCode.Return))
{
manager.SwitchState(new LostState (manager));
}
}
尽管PlayState是一个IStateBase实例,但它不被视为Monobehaviour,所以我无法添加一个独有的状态按钮。我怎么能绕过这个?
答案 0 :(得分:0)
为了能够将任何Script
附加到GameObject
,您需要让您的脚本或其继承树中的任何类继承自MonoBehaviour
。为了能够从Inspector
分配其公共字段,您还需要将其标记为[Serializable]
。请注意,您的IStateBase
无法被视为继承自MonoBehaviour
。实际上我们根本看不到它的实现。
让我们看看Unity3D
中的所有一般可能性:
//Works because it inherits from class inheriting MonoBehaviour
public class TestScript : BaseTest
{
}
//This will also be assignable from Inspector
public class BaseTest : MonoBehaviour
{
}
//This will also work as we still have MonoBehaviour in a root of our inheritance
public class TestScript : BaseTest
{
}
//This will not be assignable from Inspector
public abstract class BaseTest : MonoBehaviour
{
}
好吧,接口不能从类或抽象类继承,只能从其他接口继承,所以它无论如何都不会工作。