文件中没有 Unity3d 单行为脚本,或者它们的名称与文件名不匹配



大家好,我一直在开发我的第一款游戏,突然出现了这个错误,无法运行游戏,我已经安装了新版本的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检测出现问题,但我确实花了一段时间才发现。

最新更新