Почему при создании префаба для его дублирования дублируется двойная сумма, а некоторые в неправильном положении и повороте? - PullRequest
0 голосов
/ 10 октября 2019

Сценарий, который сохраняет информацию о преобразованиях, а затем загружает обратно и создает префаб в тех же позициях и поворотах сохраненной информации о преобразованиях.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine.SceneManagement;
using UnityEditor;

public static class TransformSaver
{
    [System.Serializable]
    public class Transform
    {
        public string sceneName;
        public string name;
        public UnityEngine.Transform parent;
        public Vector3 pos;
        public Quaternion rot;
        public Vector3 scale;
    }

    //Save Transform
    public static void SaveTransform(UnityEngine.GameObject[] tranformToSave)
    {
        Transform[] trnfrm = new Transform[tranformToSave.Length];
        for (int i = 0; i < trnfrm.Length; i++)
        {
            trnfrm[i] = new Transform();

            trnfrm[i].sceneName = tranformToSave[i].gameObject.scene.name;
            trnfrm[i].name = tranformToSave[i].name;
            trnfrm[i].parent = tranformToSave[i].transform.parent;
            trnfrm[i].pos = tranformToSave[i].transform.position;
            trnfrm[i].rot = tranformToSave[i].transform.rotation;
            trnfrm[i].scale = tranformToSave[i].transform.localScale;
        }

        string jsonTransform = JsonHelper.ToJson(trnfrm, true);
        File.WriteAllText(@"e:\json\json.txt", jsonTransform);
    }

    public static Transform[] LoadTransforms()
    {
        string jsonTransform = File.ReadAllText(@"e:\json\json.txt");
        if (jsonTransform == null)
        {
            return null;
        }

        Transform[] savedTransforms = JsonHelper.FromJson<Transform>(jsonTransform);

        return savedTransforms;
    }

    //Load Transform
    public static Transform[] LoadTransform(bool usePrefab, GameObject prefab, bool useSceneName, string sceneName)
    {
        string jsonTransform = File.ReadAllText(@"e:\json\json.txt");
        if (jsonTransform == null)
        {
            return null;
        }

        Transform[] savedTransforms = JsonHelper.FromJson<Transform>(jsonTransform);

        for (int i = 0; i < savedTransforms.Length; i++)
        {
            try
            {
                if (useSceneName)
                {
                    SceneManager.SetActiveScene(SceneManager.GetSceneByName(sceneName));
                }
                else
                {
                    SceneManager.SetActiveScene(SceneManager.GetSceneByName(savedTransforms[i].sceneName));
                }
            }

            if (usePrefab == true && prefab != null)
            {
                GameObject go = UnityEngine.Object.Instantiate(prefab);

                go.transform.position = savedTransforms[i].pos;
                go.transform.rotation = savedTransforms[i].rot;
                go.transform.transform.SetParent(savedTransforms[i].parent);

            }
        }
        return savedTransforms;
    }
}

Затем скрипт окна редактора для кнопок и префабов выбирают для дублирования:

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class SaveTransformsInfo : EditorWindow
{
    public GameObject source;

    [MenuItem("Tools/Save Transforms")]
    private static void CreateReplaceWithPrefab()
    {
        const int width = 340;
        const int height = 70;

        var x = (Screen.currentResolution.width - width) / 2;
        var y = (Screen.currentResolution.height - height) / 2;

        GetWindow<SaveTransformsInfo>().position = new Rect(x, y, width, height);
    }

    private void OnGUI()
    {
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Select Prefab", GUILayout.Width(80));
        source = (GameObject)EditorGUILayout.ObjectField(source, typeof(GameObject), true, GUILayout.ExpandWidth(true));
        EditorGUILayout.EndHorizontal();

        GUILayout.Space(35);

        if (GUILayout.Button("Save Transforms"))
        {
            TransformSaver.SaveTransform(Selection.gameObjects);
        }

        GUILayout.Space(2);

        if (GUILayout.Button("Load Transforms"))
        {
            TransformSaver.LoadTransform(true, source, false, "");
        }
    }
}

И часть файла json примера содержимого:

{
    "Items": [
        {
            "sceneName": "Example_01",
            "name": "Wall_Door_Long_01",
            "parent": {
                "instanceID": -692606
            },
            "pos": {
                "x": 24.0,
                "y": 55.0,
                "z": -25.0
            },
            "rot": {
                "x": -0.7071068286895752,
                "y": 0.0,
                "z": 0.0,
                "w": 0.7071068286895752
            },
            "scale": {
                "x": 1.0,
                "y": 1.0,
                "z": 1.0
            }
        },
        {
            "sceneName": "Example_01",
            "name": "Wall_Door_Long_01",
            "parent": {
                "instanceID": 393488
            },
            "pos": {
                "x": 16.0,
                "y": 50.0,
                "z": -26.99999237060547
            },
            "rot": {
                "x": 0.0,
                "y": 0.7071065902709961,
                "z": 0.0,
                "w": -0.7071069478988648
            },
            "scale": {
                "x": 1.0,
                "y": 1.0,
                "z": 1.0
            }
        },

Но в итоге я получаю 18 новых дублированных префабов и еще 18 клонированных дублированных префабов, а это 36 вместоof 18. И некоторые из них находятся в том же положении и вращении, что и сохраненные преобразования, но некоторые из них стоят под другими с другим положением и вращением:

Duplicated Prefabs

На скриншоте дверь, отмеченная красным кружком, представляет собой прекрасный дублированный сборный дом. Тот, что помечен зеленым кружком, представляет собой префаб, который находится под красным и не должен создаваться вообще с неправильным положением и вращением.

Справа в списке все объекты черного цвета - это новые дублированные префабы. в том числе клоны. Объекты, выделенные синим цветом, являются сохраненными преобразованиями.

Основной целью является дублирование префаба с теми же сохраненными позициями преобразований и поворотами, включая родительский, если они есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...