首页 > 解决方案 > Unity 3D:如何存储和替换网格中的预制件?

问题描述

我正在创建一个像Crypt of the necrodancer这样的视频游戏,当我想生成地图时我被阻止了我的想法很简单:制作一个网格系统并替换一些图块以具有特定的图块(障碍物,墙......)但我没有'不知道我应该如何存储信息来替换我的瓷砖。

我基于Sebastian Lague教程中的网格生成图

我想在检查员中更换我的瓷砖

就我而言,我找到了一个用另一个替换一些瓷砖的脚本,但我无法保存它......这是替换东西的脚本

using UnityEngine;
using UnityEditor;

public class ReplaceWithPrefab : EditorWindow
{
    [SerializeField] private GameObject prefab;

    [MenuItem("Tools/Replace With Prefab")]
    static void CreateReplaceWithPrefab()
    {
        EditorWindow.GetWindow<ReplaceWithPrefab>();
    }

    private void OnGUI()
    {
        prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", prefab, typeof(GameObject), false);

        if (GUILayout.Button("Replace"))
        {
            var selection = Selection.gameObjects;

            for (var i = selection.Length - 1; i >= 0; --i)
            {
                var selected = selection[i];
                var prefabType = PrefabUtility.GetPrefabType(prefab);
                GameObject newObject;

                if (prefabType == PrefabType.Prefab)
                {
                    newObject = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
                }
                else
                {
                    newObject = Instantiate(prefab);
                    newObject.name = prefab.name;
                }

                if (newObject == null)
                {
                    Debug.LogError("Error instantiating prefab");
                    break;
                }

                Undo.RegisterCreatedObjectUndo(newObject, "Replace With Prefabs");
                newObject.transform.parent = selected.transform.parent;
                newObject.transform.localPosition = selected.transform.localPosition;
                newObject.transform.localRotation = selected.transform.localRotation;
                newObject.transform.localScale = selected.transform.localScale;
                newObject.transform.SetSiblingIndex(selected.transform.GetSiblingIndex());
                Undo.DestroyObjectImmediate(selected);
            }
        }

        GUI.enabled = false;
        EditorGUILayout.LabelField("Selection count: " + Selection.objects.Length);
    }
}

关于如何保存信息的任何想法?

标签: c#unity3d

解决方案


Unity 最近在几个版本前添加了一个 tilemap 系统。它似乎是您正在寻找的东西,它已经为您处理了网格。

您可以在此处阅读更多相关信息: https ://docs.unity3d.com/Manual/class-Tilemap.html

您可以使用 SetTile 方法和 Tile 对象编辑 tilemap,而不是实例化一堆预制件。瓷砖本身是使用瓷砖调色板创建的,您也可以在上面的页面中阅读更多信息。


推荐阅读