如何在统一编辑器中从场景创建可编写脚本的对象

Posted

技术标签:

【中文标题】如何在统一编辑器中从场景创建可编写脚本的对象【英文标题】:How to create scriptable object from scene in unity editor 【发布时间】:2019-05-07 12:27:39 【问题描述】:

我目前正在 Unity 中创建一个 2D 游戏,但在关卡设计方面遇到了麻烦。我想创建大约 100 个关卡,每个关卡在不同的位置都有不同的预制件。

为了加载适当的关卡,我构建了一个带有可脚本化对象的架构。瓦片地图被用来表示障碍物。因此,每个级别可能有大约 30 个不同的瓷砖位置。对每个可编写脚本的对象分别填写这些信息对我来说似乎是错误的。

我现在正在寻找的是一种在编辑器中创建关卡并将数据直接保存在可编写脚本的对象中的方法。在编辑器中有一个按钮,上面写着:“将当前场景布局保存在例如可编写脚本的对象级别 3 中”。并且还能够在编辑器模式下将每个关卡加载到场景中。

【问题讨论】:

“在编辑器中创建关卡并直接保存数据”不就是场景的用途吗? 【参考方案1】:

您在预制件中创建关卡并将此预制件引用到您的 ScriptableObject 中。 所以你的关卡预制件包含你的瓦片地图和其他预制件。

【讨论】:

【参考方案2】:

我会建议 Raphael 解决方案,但在某些情况下,如果您要处理预制件问题,这可能会很困难。

实现此目的的其他方法是创建您的自定义编辑器来迭代您的场景并创建此 ScriptableObject。

我将此代码用于类似的事情

        GameObject __PARENT = GameObject.Find("__PARENT");
        Vector3 centroid = Vector3.zero;
        Transform[] childs = __PARENT.transform.GetComponentsInChildren<Transform>();
        foreach (Transform go in childs)
        
            Debug.Log(go.name);
            centroid += go.position;
        
        centroid /= (__PARENT.transform.childCount);
        GameObject centerPivotObject = new GameObject();
        centerPivotObject.name = "CenterPivotObject";            
        centerPivotObject.transform.position = centroid;

        foreach (Transform go in childs)
        
            go.parent = centerPivotObject.transform;
        

在我的例子中,我试图在父对象中居中枢轴,但是您可以使用 this 将这个迭代组合在您的父游戏上并使用它创建您的 ScriptableObject

https://wiki.unity3d.com/index.php/CreateScriptableObjectAsset

【讨论】:

以上是关于如何在统一编辑器中从场景创建可编写脚本的对象的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 Android 上运行之间会丢失可编写脚本对象中的数据,但在编辑器中却没有?

NSDT可编程3D场景兼容Three.js

在 Google Apps 脚本中从另一个电子表格编辑一个电子表格

在可编写脚本的对象UNITY 5中存储方法

使 C++ 应用程序可编写脚本

Silverlight 数据绑定无法从可编写脚本的成员中工作