Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么新的实例化预置不在原始选定游戏对象的相同位置?_C#_Unity3d - Fatal编程技术网

C# 为什么新的实例化预置不在原始选定游戏对象的相同位置?

C# 为什么新的实例化预置不在原始选定游戏对象的相同位置?,c#,unity3d,C#,Unity3d,这是保存选定游戏对象的脚本,将信息转换为json文件。还可以通过从一个选定的预置中实例化预置来加载它们。它应该将新的实例化预置放置在原始选定游戏对象的位置、旋转和缩放中,但事实并非如此 我可以看到,新实例化的预制件与检查器中的原始游戏对象具有相同的位置,但新实例化的预制件仍然位于场景中其他位置,与原始预制件不接近 using UnityEngine; using System.Collections; using System.Collections.Generic; using System.

这是保存选定游戏对象的脚本,将信息转换为json文件。还可以通过从一个选定的预置中实例化预置来加载它们。它应该将新的实例化预置放置在原始选定游戏对象的位置、旋转和缩放中,但事实并非如此

我可以看到,新实例化的预制件与检查器中的原始游戏对象具有相同的位置,但新实例化的预制件仍然位于场景中其他位置,与原始预制件不接近

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

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 = PlayerPrefs.GetString("transform");
        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 UnityEngine.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);
        GameObject[] gameObjects = new GameObject[savedTransforms.Length];
        UnityEngine.Transform[] loadedTransforms = new UnityEngine.Transform[savedTransforms.Length];

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

            }
            if (usePrefab == true && prefab != null)
            {
                UnityEngine.Object.Instantiate(prefab, savedTransforms[i].pos,
                    savedTransforms[i].rot, savedTransforms[i].parent);
            }
            else
            {
                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;
    }
}
使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
使用System.IO;
使用UnityEngine.SceneManagement;
公共静态类转换程序
{
[系统可序列化]
公共类转换
{
公共字符串场景名称;
公共字符串名称;
公共单元引擎。转换父级;
公共向量机3 pos;
公共四元数;
公共向量3标度;
}
//保存转换
公共静态void SaveTransform(UnityEngine.GameObject[]TransformToSave)
{
Transform[]trnfrm=新的转换[transformtosave.Length];
对于(int i=0;i
和editorwindow脚本,用于选择预制选择游戏对象以获取信息和保存加载按钮:

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, "");
        }

    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEditor;
使用UnityEngine;
公共类SaveTransformsInfo:EditorWindow
{
公共游戏对象源;
[菜单项(“工具/保存转换”)]
私有静态void createReplaceWithPrefact()
{
const int width=340;
const int height=70;
var x=(Screen.currentResolution.width-width)/2;
变量y=(Screen.currentResolution.height-height)/2;
GetWindow().position=新矩形(x、y、宽度、高度);
}
私有void OnGUI()
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(“选择预置”,GUILayout.Width(80));
source=(GameObject)EditorGUILayout.ObjectField(source,typeof(GameObject),true,GUILayout.ExpandWidth(true));
EditorGUILayout.EndHorizontal();
Guillayout.空间(35);
if(GUILayout.Button(“保存变换”))
{
SaveTransform(Selection.gameObjects);
}
空间(2);
if(GUILayout.Button(“加载变换”))
{
LoadTransform(true,source,false,“”);
}
}
}

我也尝试过在游戏对象变换的位置和旋转中使用局部变换,但如果是局部变换或非局部变换,则没有多大帮助。

仅供参考:检查器中显示的位置和旋转始终是相对于父对象的局部变换


然后在脚本中使用
位置
旋转
存储值

trnfrm[i].pos = tranformToSave[i].transform.position;
trnfrm[i].rot = tranformToSave[i].transform.rotation;
但随后在“加载”时,会出现
localPosition
localRotation

或者当使用

Instantiate(prefab, savedTransforms[i].pos, savedTransforms[i].rot, savedTransforms[i].parent);
它再次使用
位置
旋转

你是谁
Instantiate(prefab, savedTransforms[i].pos, savedTransforms[i].rot, savedTransforms[i].parent);
savedTransforms[i].parent;
UnityEngine.Object.Instantiate(prefab, savedTransforms[i].pos, savedTransforms[i].rot, savedTransforms[i].parent);