将游戏对象附加到从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,所以我不能添加此状态独有的按钮。我该怎么绕过这个?
要将任何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的接口继承
接口不能从类或抽象类继承,只能从其他接口继承,所以它无论如何都不能工作。