【问题标题】:Unity C# interfaces causing "script class cannot be found"Unity C# 接口导致“找不到脚本类”
【发布时间】:2020-06-22 03:16:24
【问题描述】:

我正在使用 Unity 2019.3.13f1 和 Visual Studio Community 2019 版本 16.5.4。我的脚本 InterfaceContainer.cs 如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InterfaceContainer : MonoBehaviour {

    // Start is called before the first frame update
    void Start() {

    }

    // Update is called once per frame
    void Update() {
        
    }

}

public interface IItem {

    public string Name { get; }
    public string Path { get; }
    public GameObject Icon { get; }

    public void Open();

}

Visual Studio 没有给出编译错误。

在 Unity 中,脚本检查器会显示“文件中没有 MonoBehaviour 脚本,或者它们的名称与文件名不匹配。”当我将脚本拖入游戏对象时,它显示“无法添加脚本组件“InterfaceContainer”,因为找不到该脚本类。确保没有编译错误,并且文件名和类名匹配。”

名称绝对匹配,因为当我删除界面部分时,错误不再存在。
我也尝试删除类部分。它没有帮助。
添加的任何后续脚本都有完全相同的错误,无论它们是否包含任何接口或引用此脚本。

奇怪的是当我删除这个脚本的界面部分,刷新Unity,再次添加这部分,再次刷新Unity,错误消失了。但是所有随后添加的脚本仍然有相同的错误。

我不知道是什么导致了这个错误,并且用谷歌搜索了很长时间没有结果。任何帮助将不胜感激。

编辑:当我删除界面部分并再次添加时,错误并没有消失;我仍然可以将脚本作为组件拖动,当我尝试进入播放模式时,它会要求我修复所有编译器错误。

【问题讨论】:

  • 控制台还有其他错误吗?在修复所有编译器错误之前,Unity 不会重新编译所有内容!
  • 嘿,不是 100% 确定,但我认为你不应该为每个文件声明超过 1 个 Monobehaviour 类,否则 Unity 不喜欢它。尝试将IItem 移动到单独的文件中,看看是否有帮助
  • @Ron IItem 不是 class,也不是 MonoBehaviour,虽然 ;) 在 MonoBehaviour 文件中有一个接口并不美观,但没有问题
  • @derHugo 我同意,但我确实在使用旧版本的 Unity 之一时遇到了这个问题,这就是我问的原因
  • @Ron 几岁了?至少自从 Unity 4 以来,这从来都不是问题 ^^ 你甚至可以在一个文件中拥有多个 MonoBehaviour 类...... Unity 只会“知道”与文件名匹配的那个(有时对于通用或抽象有意义)类型)

标签: c# unity3d


【解决方案1】:

试试这个:

  1. 在Unity的项目面板中右键
  2. Import New Asset... 并选择 InterfaceContainer.cs
  3. 尝试再次将此脚本添加为组件。

【讨论】:

  • 我试着照你说的做。如果InterfaceContainer.cs 不在我的脚本文件夹中,则它会导入脚本,但它不起作用。否则,它会创建一个重复的 InterfaceContainer1.cs,而这两个都不起作用。
  • 您能否从interface IItem 的成员(Name, Path, Icon and Open) 中删除public 修饰符?如果我保留这些修饰符,则无法编译此脚本,删除后,此脚本运行良好。
【解决方案2】:

我会尝试的一件事是检查它是否发生在早期版本的统一中。使用unity hub 很容易拥有不同版本的统一来检查这类事情。如果您使用的是最新版本之一,它会很有用。

我可以确认,在 2018.4.12,我将我的单体行为与接口连接起来没有问题。

另一方面,您没有实现您在单一行为中定义的接口,尽管这不会导致任何问题,如果出现错误,您是否尝试过在您的单一行为中实现接口?

希望有帮助

【讨论】:

  • 反对多个 cmets 的原因是什么? ;) 这不是问题的答案
  • 可能不是正确的答案,但它是一个有 2 个建议供提问者检查的答案,一旦检查也可能缩小导致错误的可能性。我认为我的建议很有用,当我寻求帮助时,我感谢建议和人们为我可能遇到的问题所做的努力,即使这不是问题的直接答案
  • 好吧,至于你的建议:我正在使用2019.3.13,在MonoBehaviour 文件脚本中声明interface 完全没有问题.. 你甚至可以有多个MonoBehaviour 类型的类在一个文件中(例如摘要等).. Unity 只会知道具有匹配名称的那个。这里的问题是我们还不知道的其他问题
  • 我还有两个类型为MonoBehaviour 的类实现IItem。无论是否添加它们,所有脚本都会发生错误。我尝试使用2019.3.15f1 并出现同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
相关资源
最近更新 更多