Как можно также вернуться из метода в Список трансформаций или игровых объектов, не создавая экземпляры для новых игровых объектов? - PullRequest
0 голосов
/ 30 августа 2018
 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;
 using UnityEngine.SceneManagement;

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

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

             trnfrm[i].sceneName = tranformToSave[i].gameObject.scene.name;
             trnfrm[i].name = tranformToSave[i].name;
             trnfrm[i].parent = tranformToSave[i].parent;
             trnfrm[i].pos = tranformToSave[i].localPosition;
             trnfrm[i].rot = tranformToSave[i].localRotation;
             trnfrm[i].scale = tranformToSave[i].localScale;
         }

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

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

         TransformInfo[] savedTransforms = JsonHelper.FromJson<TransformInfo>(jsonTransform);
         GameObject[] gameObjects = new GameObject[savedTransforms.Length];
         Transform[] loadedTransforms = new Transform[savedTransforms.Length];

         for (int i = 0; i < gameObjects.Length; i++)
         {
             SceneManager.SetActiveScene(SceneManager.GetSceneByName(savedTransforms[i].sceneName));

             gameObjects[i] = new GameObject();
             loadedTransforms[i] = gameObjects[i].transform;
             loadedTransforms[i].name = savedTransforms[i].name;
             loadedTransforms[i].parent = savedTransforms[i].parent;
             loadedTransforms[i].localPosition = savedTransforms[i].pos;
             loadedTransforms[i].localRotation = savedTransforms[i].rot;
             loadedTransforms[i].localScale = savedTransforms[i].scale;
         }
         return loadedTransforms;
     }
 }

Проблема заключается в том, что метод LoadTransform возвращает массив Transforms, но также создает новые объекты GameObject в редакторе в иерархии.

Что я хочу сделать, это добавить что-то вроде логического флага или, возможно, другого способа, чтобы я мог выбрать, возвращать ли массив массивов преобразования с созданием или без создания новых игровых объектов, поэтому я попробовал что-то подобное:

 //Load Transform
     public static Transform[] LoadTransform(bool returnInfo)
     {
         string jsonTransform = File.ReadAllText(@"d:\json\json.txt");
         if (jsonTransform == null)
         {
             return null;
         }

         TransformInfo[] savedTransforms = JsonHelper.FromJson<TransformInfo>(jsonTransform);
         GameObject[] gameObjects = new GameObject[savedTransforms.Length];
         Transform[] loadedTransforms = new Transform[savedTransforms.Length];

         for (int i = 0; i < gameObjects.Length; i++)
         {
             SceneManager.SetActiveScene(SceneManager.GetSceneByName(savedTransforms[i].sceneName));

             if (returnInfo == true)
             {
                 gameObjects[i] = new GameObject();
                 loadedTransforms[i] = gameObjects[i].transform;
             }
             loadedTransforms[i].name = savedTransforms[i].name;
             loadedTransforms[i].parent = savedTransforms[i].parent;
             loadedTransforms[i].localPosition = savedTransforms[i].pos;
             loadedTransforms[i].localRotation = savedTransforms[i].rot;
             loadedTransforms[i].localScale = savedTransforms[i].scale;
         }
         return loadedTransforms;
     }

Я добавил bool-флаг returnInfo, но теперь загруженный-преобразователь имеет значение null.

Но главная цель - решить, возвращать ли массив преобразований с экземплярами для новых игровых объектов или без них.

Проблема в том, что я использую скрипт типа Editorwindow и внутри OnGUI для сохранения и загрузки объектов:

  List<GameObject> selections = Selection.objects.OfType<GameObject>().ToList();
          if (selections.Count > 0)
          {
              GUI.enabled = true;
          }
          else
          {
              GUI.enabled = false;
          }
          if (GUILayout.Button("Save selected objects data"))
          {
              if (selections.Count > 0)
              {
                              tempTransformSelection = selections;
                  for (var i = selections.Count - 1; i >= 0; --i)
                  {
                      var selected = selections[i];
                      transformSelection.Add(selected.transform);
                  }

                  TransformSaver.SaveTransform(transformSelection.ToArray());
                  transformSelection = new List<Transform>();
              }
          }

          var file = @"d:\json\json.txt";
          FileInfo fi = new FileInfo(file);

          // By default asume you don't want to show the button
          // it will than only be enabled if the later conditions match
          bool showButton = false;

          // you can check this already here not in the loop
          // if no file -> nothing to do
          if (!File.Exists(@"d:\json\json.txt") || fi.Length <= 0) return;


          // This is only reached if the file exists and is not empty
          // check for null transforms
          for (int i = 0; i < tempTransformSelection.Count(); i++)
          {
              // if not null do nothing
              if (tempTransformSelection[i] != null)
                  continue;

              // otherwise enable the button and leave the loop
              showButton = true;
              break;
          }

          // if not true then button won't be shown
          if (showButton == true)
          {
              GUI.enabled = true;
          }
          else
          {
              GUI.enabled = false;
          }
          if (GUILayout.Button("Instantiate back deleted selected bojects"))
          {
              TransformSaver.LoadTransform(true);
              showButton = false;
          }
      }

      private void OnInspectorUpdate()
      {
          Repaint();
      }

Основная цель - выбрать объекты в иерархии в редакторе. Затем нажмите «Сохранить данные выбранных объектов», чтобы сохранить выбранный объект в файл json.

Тогда я хочу сделать это только в том случае, если один из сохраненных объектов в файле является нулевым в иерархии, например, если я удалил один или несколько объектов в сохраненном файле! только после этого включите true, нажав кнопку «Восстановить назад удаленные выбранные объекты»

А затем при нажатии на кнопку «Создать обратно удаленные выбранные объекты» установите кнопку обратно в положение false!

Но важно проверить нулевое значение в сохраненном списке объектов в файле json! Но еще раз я застрял с tempTransformSelection и с тем, как включить false / true кнопку.

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