【问题标题】:Declaring a new instance of a class in C#在 C# 中声明类的新实例
【发布时间】:2014-03-07 05:01:13
【问题描述】:

Unity 不喜欢这个,根据研究和来自 Unity 的警告

("您正在尝试使用 'new' 关键字创建 MonoBehavior。这是不允许的。MonoBehaviours 只能使用 AddComponent() 添加。或者您的脚本可以继承自 ScriptableObject 或根本不继承基类。)

我知道 AddComponent,但我认为这不是我想要的。

public Boids boids = new Boids();

Boids 是我的第二堂课。我在教程中看到了这项工作,所以我有点困惑为什么这在 Monodevelop 中不起作用。

【问题讨论】:

  • Boids 是否真的使用了从MonoBehaviour 继承的任何方法或其他东西?为什么不直接从ScriptableObject 继承?这样它应该仍然可以在检查器中编辑。
  • 是的,我确实听说过 ScriptableObject,但我对如何实现它感到非常困惑。我用谷歌搜索了它并没有得到任何运气,你会这么好心只写一个示例行吗?
  • 例如,这个 (wiki.unity3d.com/index.php/CreateScriptableObjectAsset) 示例并没有真正帮助我。我尝试让我的 Boids 类继承自 ScriptableObject 而不是 MonoBehaviour。但我的检查员没有运气。

标签: c# reference unity3d


【解决方案1】:

很容易用谷歌搜索...

http://forum.unity3d.com/threads/119537-You-are-trying-to-create-a-MonoBehaviour-using-the-new-keyword

这与 Boids 的继承有关。 New 显然不是实例化对象的正确方法,应该使用统一框架进行实例化

gameObject.AddComponent<Boids>()

【讨论】:

  • 是的,我用谷歌搜索过。除了我需要它在我的全局变量中,因为我需要在我的其他类中访问它。你不能在全局变量中这样做,这就是我问的原因:)谢谢。
  • 我要做的是在我的全局变量中将我的“公共 Boids boids..”设置为我的 Boids.cs 脚本。我需要它在我的检查器中有一个下拉列表,其中包含我的 Boids.cs 类的所有全局变量。就像在教程中我发现的那样:youtube.com/watch?v=3FXCHdPA_Mk 如果你跳到第 35 分钟左右,他在 Unity 中,你明白我的意思。
  • 视频时长不到 35 分钟 :)。我想你会发现你需要在你的全局变量中声明这个变量,并在你有一个可以调用 AddComponent 的游戏组件时初始化该变量。
  • 我不确定您是否完全理解我的问题。 AddComponent 对我没有帮助。在声明我的 Boids 类变量 (boids) 时,我需要引用这个脚本。这将允许我在我的 AI 类中使用 Boids 类。我不能用 AddComponent 做到这一点,它只是将脚本添加到我不想做的游戏对象中。
  • 我的问题是 Unity 中的 new 等价物是什么。我听说过 ScriptableObject,但它有点令人困惑。
【解决方案2】:

如果我理解正确,您需要您的 AI 脚本来获取场景中的所有 Boid 实例并对其进行处理。

如果是这种情况,那么有多种方法可以做到这一点,一个简单的方法是:

  1. 在您的 AI 脚本中声明 public Boids[] boids 字段
  2. 创建单个游戏对象并添加您的 AI 脚本
  3. 创建一堆游戏对象并在 Unity 编辑器中将 Boids 脚本添加到其中
  4. 选择包含您的 AI 脚本的游戏对象。您应该在检查器中看到一个 boids 字段。将所有 Boid 游戏对象拖放到该字段
  5. 您现在可以访问 AI 脚本中所有链接的 Boid

这里是一些示例脚本:

public class AI : MonoBehaviour
{
    public Boid[] boids;

    void Update()
    {
        foreach (Boid boid in this.boids)
        {
            // Do something with boid
        }
    }
}

public class Boid : MonoBehaviour
{
    public float searchRadius;
    // Anything else
}

【讨论】:

    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多