将游戏对象附加到从monoehaviour继承的脚本

本文关键字:monoehaviour 继承 脚本 游戏 对象 | 更新日期: 2023-09-27 18:29:25

我的游戏按以下状态组织:BeginState播放状态WonStateLostState

以及一个名为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脚本只是我使用的,因为它被归类为Monopahavior。

例如,我想使用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实例,但它不被视为Monopahavior,所以我不能添加此状态独有的按钮。我该怎么绕过这个?

将游戏对象附加到从monoehaviour继承的脚本

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

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

从从MonoBehavior继承的其他类继承

//Works because it inherits from class inheriting MonoBehaviour
public class TestScript : BaseTest
{
}
//This will also be assignable from Inspector
public class BaseTest : MonoBehaviour
{
}

从从MonoBehavior继承的其他抽象类继承

//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
{
}

从继承自MonoBehavior的接口继承

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