将游戏对象附加到从monobehaviour

时间:2016-01-06 17:55:50

标签: c# unity3d

我的状态由各州组织如下: 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,所以我无法添加一个独有的状态按钮。我怎么能绕过这个?

1 个答案:

答案 0 :(得分:0)

为了能够将任何Script附加到GameObject,您需要让您的脚本或其继承树中的任何类继承自MonoBehaviour。为了能够从Inspector分配其公共字段,您还需要将其标记为[Serializable]。请注意,您的IStateBase无法被视为继承自MonoBehaviour。实际上我们根本看不到它的实现。

让我们看看Unity3D中的所有一般可能性:

从其他继承自MonoBehaviour

的类继承
//Works because it inherits from class inheriting MonoBehaviour
public class TestScript : BaseTest
{
}

//This will also be assignable from Inspector
public class BaseTest : MonoBehaviour
{
}

继承自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
{
}

从继承自MonoBehaviour

的接口继承

好吧,接口不能从类或抽象类继承,只能从其他接口继承,所以它无论如何都不会工作。