【问题标题】:Correct way to connect an instance of a class to a GameObject mesh将类的实例连接到 GameObject 网格的正确方法
【发布时间】:2017-03-28 22:07:21
【问题描述】:

我有一个模特和动画师;和一个控制器脚本让它移动,然后我创建了一个名为“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 实例的网格?

【问题讨论】:

    标签: unity3d


    【解决方案1】:
    1. Unity 场景中的“事物”是 GameObject,仅此而已。

    2. 您的类必须是 MonoBehaviour 才能在游戏对象上。

    3. 在 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),就是这么简单。

    关于使其成为预制件,如果您愿意,请务必这样做。阅读数千篇关于预制件的教程。


    您在下面的 cmets 中有一个批评性评论:

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

    这是理解 Unity 的关键点:

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

    不管怎么样还是怎么样还是怎么样

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

    如此如此如此如此如此如此如此如此如此如此如此如此如此如此如此如此如此如此如此

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

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

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

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

    【讨论】:

    • 谢谢乔。我正在为我的应用程序使用 MVC 范例;玩家的实体实际上是模型,而游戏管理器是控制器。我的问题是在运行时关联 2,并且由于大多数培训视频显示附加到 ai 预制件的脚本,我认为可能有不同的方法来做到这一点。
    • 实体类也不是monobehavior,你确实提到你只能在游戏对象上附加从monobehavior派生的脚本;所以我必须通过将在网格游戏对象上运行的不同脚本连接它,无论是通过引用还是其他方式
    • 嗨,新手。这不是 MVC 中的“模型”。 “模型”基本上是您的数据。请用 3 个词解释你的游戏是什么。即,它是 FPS、横向卷轴、拼图还是什么。欢呼
    • MVC 在 ECS 系统中非常混乱。不要忘记所有的统一性,动画,物理,渲染等的整个用具......所有这些都只是“视图”。只有少数人了解 Unity 中的 MVC。无论如何你都在赛道上享受!
    • 对,unity是ECS(不是OO),很奇怪。 (维基百科ECS)你说的是完全正确的。当我们做体育网络时,你会拥有处理游戏逻辑的脚本(玩家、购买、得分——随便什么)。所有这些都与图形无关,只是游戏的逻辑。 >>>但是stackoverflow.com/a/35524924/294884 C# 中没有宏或预处理器,所以使用类似这样的微不足道的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多