Сценарий, который сохраняет информацию о преобразованиях, а затем загружает обратно и создает префаб в тех же позициях и поворотах сохраненной информации о преобразованиях.
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](https://i.stack.imgur.com/do6WX.jpg)
На скриншоте дверь, отмеченная красным кружком, представляет собой прекрасный дублированный сборный дом. Тот, что помечен зеленым кружком, представляет собой префаб, который находится под красным и не должен создаваться вообще с неправильным положением и вращением.
Справа в списке все объекты черного цвета - это новые дублированные префабы. в том числе клоны. Объекты, выделенные синим цветом, являются сохраненными преобразованиями.
Основной целью является дублирование префаба с теми же сохраненными позициями преобразований и поворотами, включая родительский, если они есть.