大家好,我一直在开发我的第一款游戏,突然出现了这个错误,无法运行游戏,我已经安装了新版本的unity,但它仍然存在。我知道它可能是由几个原因引起的,但到目前为止运气不佳,你知道最可能的原因以及如何解决吗?
当我选择脚本时,唯一没有得到这个错误的是:
using UnityEngine;
using Assets.Code.States;
using Assets.Code.Interfaces;
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;
}
}
但举个例子,我得到了错误:
using UnityEngine;
using Assets.Code.Interfaces;
namespace Assets.Code.States
{
public class BeginState : IStateBase
{
private StateManager manager;
public BeginState (StateManager managerRef)
{
manager = managerRef;
Debug.Log ("Constructing BeginState");
Time.timeScale = 0;
}
public void StateUpdate()
{
if (Input.GetKeyUp(KeyCode.Space))
manager.SwitchState(new PlayState (manager));
}
public void ShowIt()
{
if (GUI.Button (new Rect (10, 10, 150, 100), "Press to Play"))
{
Time.timeScale = 1;
manager.SwitchState (new PlayState (manager));
}
}
}
}
其他剧本也是如此。
我已经安装了更新版本的unity3d,卸载了防病毒软件,检查了文件名,但错误仍然存在。我在命名空间中也没有任何类。。
确保您的脚本文件的名称与它所包含的MonoBehavior类完全相同。
MyScript.cs:
using UnityEngine;
public class MyScript : MonoBehaviour
{
}
此外,如果脚本文件包含辅助类,请确保它们位于文件的底部,而不是MonoBehavior子类的顶部。
此外,当MonoBehavior类位于名称空间中时,Unity有时会出现问题。我不知道这到底是什么时候发生的,只是偶尔发生。将类从命名空间中取出可以修复错误。
我对这个问题有一个奇怪的变体,没有在其他地方看到发布的解决方案。
TLDR
我在Unity无法识别为MonoBehaviours的类的命名空间中有空格。
背景
我在项目中的两个脚本文件上都有No MonoBehaviour scripts in the file or ...
警告文本,一个是MonoBehavior,另一个是ScriptableObject。每个问题都有不同的症状:
单行为
- MonoBehavior类的名称类似于
MyMonoBehaviourService
- 脚本文件名为
MyMonoBehaviourService.cs
- 该类不是分部的,它没有嵌套类型,也没有在文件中定义任何其他类型
- 我无法通过检查器将
MyMonoBehaviourService
附加到GameObject,但我可以通过gameObject.AddComopnents<MyMonoBehaviourService>()
。这导致脚本附加到对象,看起来和行为都正确 - 进入播放模式后,我会得到错误:
The referenced script (Unknown) on this Behaviour is missing!
- 退出PlayMode后,带有
MyMonoBehaviourService
的GameObject现在会说它不见了
可脚本化对象
- ScriptableObject类的名称类似于
MyScriptableServiceData
- 脚本文件名为
MyScriptableServiceData.cs
- 该类不是分部的,它没有嵌套类型,也没有在文件中定义任何其他类型
- 我能够通过C#创建一个
MyScriptableServiceData
,并使用AssetDatabase
保存它 - 然后,我可以使用检查器查看和修改属性
- 在退出并重新打开项目时,资产会说它的脚本丢失了
分辨率奇怪的是,问题实际上是每个类的命名空间中都有空白。我误以为我看到了换行,但实际上,命名空间中有一条换行符。
namespace Appalachia.Prototype.KOC.Areas.DeveloperInterface.V01.Features.PerformanceProfiling.Services.
FPS
{
public sealed class FPSProfilerService : MonoBehaviour
{
}
}
需要更改为:
namespace Appalachia.Prototype.KOC.Areas.DeveloperInterface.V01.Features.PerformanceProfiling.Services.FPS
{
public sealed class FPSProfilerService : MonoBehaviour
{
}
}
我不知道为什么这会导致MonoBehavior/ScriptableObject检测出现问题,但我确实花了一段时间才发现。