我如何才能从方法中返回变换列表或游戏对象列表,而又不使新游戏对象成为实例?

时间:2018-08-30 03:03:39

标签: c# unity3d

 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;
     }

我添加了一个布尔标志returnInfo,但现在loadTransforms为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文件中保存的对象列表检查null!但是我再次被tempTransformSelection以及如何启用false / true按钮所困扰。

0 个答案:

没有答案