我有一个带动画师的模特;以及一个让它移动的控制器脚本,然后我创建了一个名为“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实例进行网格划分?
答案 0 :(得分:1)
Unity场景中的“事物”是GameObject
,这就是它的全部内容。
您的班级必须是MonoBehaviour
才能加入游戏对象。
在Unity中,所有内容都是MonoBehaviour
(Component
)。在字面上,Unity中没有任何其他内容。
(当然,对于像数学计算这样的事情,你可能会有一些“原始的”非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。