将类的实例连接到GameObject网格的正确方法

时间:2016-03-01 07:17:20

标签: unity3d

我有一个带动画师的模特;以及一个让它移动的控制器脚本,然后我创建了一个名为“TheEntity”的简单类,它包含一个名称和一个能量的int。当时间流逝时,能量下降,因此网格随意移动或随机执行动画。

public class TheEntity()
{
    public string name;
    public int energy;

    public TheEntity()
    {
        // make a random name
        name = "joe"+ rnd.next(1,1000).toString();
        energy = rnd.next(20, 100);
    }

}

当能量值变为0时,网格“进入睡眠状态”,并在一定时间内再次重新生成。

如果我有一个TheEntity实例列表,就像我有一个NPC列表那样,将一个网格分配给列表中每个实体类的正确方法是什么?

我应该在网格上有一个脚本,它有一个对TheEntity类的引用。并在加载网格预制件时在运行时分配它? 或者我应该将整个“TheEntity”类脚本放在网格上,并将其保存为预制,所以每次加载预制件时,我都会直接使用相关的TheEntity实例进行网格划分?

1 个答案:

答案 0 :(得分:1)

  1. Unity场景中的“事物”是GameObject,这就是它的全部内容。

  2. 您的班级必须是MonoBehaviour才能加入游戏对象。

  3. 在Unity中,所有内容都是MonoBehaviourComponent)。在字面上,Unity中没有任何其他内容。

  4. (当然,对于像数学计算这样的事情,你可能会有一些“原始的”非Unity类,但那是无关紧要的。)

    就是这么简单。

    public Class Entity:Monobehaviour
    {
    }
    

    将其附加到空游戏对象。添加模型(网格)..或任何你想要的。添加声音效果,添加任何内容。

    关于“更改网格”,没问题。

    如果您愿意,可以在Entity的常规中执行此操作。

    public Class Entity:Monobehaviour
    {
    public void ChooseRandomMesh()
    {
    }
    public void ChooseRandomColorPattern()
    {
    }
    public void RunForTheHills()
    {
    }
    public void AttackHero()
    {
    }
    }
    

    如果您愿意,可以写一个Component除了随机更改网格外什么都不做。

    public Class Entity:Monobehaviour
    {
    public void RandomizeEntity()
    {
    }
    public void ChooseRandomColorPattern()
    {
    }
    }
    

    ..并将该脚本附加到游戏对象上。

    在Unity中,一切都是MonoBehaviour(一个Component),就这么简单。

    关于制作预制件,如果你愿意的话,一定要这样做。阅读有关预制件的数千个教程中的任何一个。

    您在下面的评论中发表了一条评论性的评论:

      

    “实体类也不是MonoBehaviour ......”

    这是理解Unity的极其重要的一点:

    1)你的“模型”或“AI”或“数据库连接”类型与团结游戏对象“无关”是完全正确的。 (他们当然没有“位置”或“质量!”或任何东西,对吧?!)

    尽管如此,无论如何仍然如此

    2)在Unity中,除非一个类是MonoBehaviour:你不能对它做任何事情/你甚至无法访问运行循环,这是一个完全不可行的。

    那就是那就是那就是那么多

    3)在Unity中,所有类似的东西,是真实的 MonoBehaviour,你简单将它放在一个空的游戏对象上。 (通常,Heirarchy中的名字以下划线开头,所以你知道它“不是真正的”传统游戏对象。)

    简单的底线是你的预加载场景(你必须在100%的项目中有一个)你拥有所有的“AI”和“模型”和“数据库”的东西,只是坐在一个或多个“假装”标记(marker ==否则为空游戏对象)。

    底线,当你在下面说“你的模型不是MonoBehaviour”时,这是错误的。它必须是一个MonoBehaviour(如果你想到它,你绝对不可避免地需要访问runloop,如果没有其他的话)......只需将它作为MonoBehaviour并将其放在标记上,几乎可以肯定是在你的预载中

    我希望这是有道理的。关于这个主题的Essay