【问题标题】:Menus in Unity3D, using UnityScript and subclassesUnity3D 中的菜单,使用 UnityScript 和子类
【发布时间】:2014-07-05 06:17:32
【问题描述】:

我正在尝试设置一个通用类来处理 Unity3D 中的菜单。

以下代码我打算附加到一个空的游戏对象

import System.Collections.Generic;

#pragma strict

public enum MenuType { loadSceneOnMouseDown, enableGameObject, changeValue };

    public class MenuClass extends System.Object
    {
        public var menuObject           : GameObject;
        public var menuType             : MenuType;
    }

public var menuItems = List.<MenuClass>();

这会在编辑器中产生以下结果:

我希望每个菜单类型都有自己的参数,因此在此示例中,一旦从枚举中选择 loadSceneOnMouseDown,我希望“loadSceneOnMouseDown”有另一个公共变量作为定义要加载的场景名称的字符串。而我希望“enableGameObject”类型将游戏对象作为公共变量。但是我不希望两者都出现在这两个领域。例如,我可以这样:

public class MenuClass extends System.Object
{
    public var menuObject           : GameObject;
    public var menuType             : MenuType;
    public var sceneName            : String
    public var targetObject         : GameObject
}

但这会使它出现在列表的每个元素之下。我考虑做一个进一步的子类来解决这个问题,但随后使用“public var menuItems = List.();”这一行那行不通。 (或者会吗?:D)

抱歉,如果我不清楚,请在这里尽我所能,但我觉得很难。可能有一个非常简单的解决方案,或者我正在以完全错误的方式进行瘦身。非常感谢您对此问题的任何帮助!

谢谢!

【问题讨论】:

    标签: menu unity3d subclass unityscript


    【解决方案1】:

    Unity 的序列化并不真正支持多态性。 MenuClass 类型的列表在技术上可以在运行时包含子类对象,但就序列化列表而言,Unity 将假定它们都是基类型的对象。

    有时候有点不方便。

    有一些流行的解决方法:

    • 让所有可能的字段序列化MenuClass,然后编写一个custom inspector,在您工作时只公开相关字段。在像您这样的简单案例中,这通常是最快的解决方案。
    • 序列化一些基本数据字段,然后使用该数据在运行时重建更精细的对象。例如,Unity 不能序列化一个 Dictionary,但它可以序列化两个你拼接在一起的列表。方便,仍然简单,但有一些限制。
    • 构建一些自定义序列化库,然后疯狂使用它。流行的选择包括 JsonFx、MiniJson、Protobufs 和 C# 的内置 XML 序列化。工作量很大,但功能非常强大。

    就像我说的,如果您认为这可以满足您的需求,我建议您从自定义检查器开始。

    除了最常见教程中的代码之外,您还可以根据该控件值进行切换,然后调用 EditorGUILayout.FloatField()EditorGUILayout.ObjectField() 等函数以及它们的表亲来获取数据。

    自定义编辑器脚本经常被忽视,但它是 Unity 开发人员可用的最强大的功能之一。

    【讨论】:

    • 感谢您提供的信息 :) 我会制作一个自定义检查器。我现在也明白为什么多态性有用了:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2014-11-11
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    相关资源
    最近更新 更多