Struct具有Transform并存储在Dictionary <int,struct =“”>中

时间:2017-04-27 14:20:01

标签: c# unity5

我有一个包含字符串,布尔值和Transform的结构。我的部分代码循环遍历场景中具有相关标记的每个对象,并将每个单个对象的信息存储在结构中。然后将结构放在一个以对象的ID作为Key的Dictionary中。所以我的字典(伪代码)看起来像字典位置=新字典(int ID,位置pos),其中“位置pos”是具有对象的字符串,布尔值和变换的结构。它是一个结构字典,每个条目代表我场景中的一个对象。

因此,当我在字典中按时间点A存储对象的信息结构时,它应该存储字符串,Boolen和Tranform AT THAT POINT IN TIME。因此,稍后,在时间点B,当我遍历字典时,我可以在需要时检索正确的字符串和正确的对象ID的布尔值。

在B点,我从Dictionary的存储结构中检索到的变换显然已经更新为B点的当前变换值。因此,当我尝试将有问题的对象移动到A点的变换值时,Debug.Log我告诉我A点和B的Transform值是相同的,并且对象被移动到它的当前位置(净效果=什么都没发生!)

以下是我存储结构值的方法:

using UnityEngine;
using UnityEngine.SceneManagement;
namespace ExtensionMethods
{

    public static class GameObjectExtensions
    {
        public static Positions GetPositionsData(this GameObject obj)
        {
            var pos = new Positions();
            pos.transform = obj.transform;
            pos.sceneName = SceneManager.GetActiveScene().name;
            var rigid = obj.GetComponent<Rigidbody>();
            if (rigid != null)
            {
                pos.isRigid = true;
            }
            else
            {
                pos.isRigid = false;
            }

            return pos;
        }
    }
}

以下是我将结构存储在词典中的方法:

public class SaveSceneState : Singleton(SaveSceneState) {
    public Dictionary<int, Positions> positions;

    void Awake()
    {
        positions = new Dictionary<int, Positions>();
    }

    /// <summary>
    /// When the the scene is changed, add the ID and Position struct
    /// of the objects to the Dictionary.
    /// </summary>
    public void OnSceneChange()
    {
        var objs = GameObject.FindGameObjectsWithTag("Remember");
        foreach (GameObject obj in objs)
        {
            var pos = obj.GetPositionsData();
            var id = obj.GetInstanceID();
            if (!positions.ContainsKey(id))
            {
                positions.Add(id, pos);
            }
        }
    }

后来,在检索时,我使用了这个:

var objs = GameObject.FindGameObjectsWithTag("Remember");

        foreach (GameObject obj in objs)
        {
            // Look up the ID of the object.
            var id = obj.GetInstanceID();
            Positions pos;

            // If the object is in the dictionary, display its stuff.
            if (SaveSceneState.Instance.positions.TryGetValue(id, out pos))
            {
                // Call the Transform method on just the focused object.
                obj.SendMessage("OnTransform", (pos.transform));
            }
        }

最后,应该显示两个不同变换的函数以及使当前对象的变换等于传入的变换值:

void OnTransform(Transform trans)

{
    Debug.Log(trans.position.Equals(null));
    Debug.Log(trans.position.ToString());
    Debug.Log(this.transform.position.ToString());
    this.transform.position = trans.position;
}

如果传入的变换为假,则得到的Debug.Log输出为False,然后两个Debug行等于相同的Transform值。

我唯一可以想到的是,当Transform存储在struct中时,它是通过引用传递的,因此Dictionary的struct只查看其值的当前值?

1 个答案:

答案 0 :(得分:1)

在这种情况下,OP正在回答他自己的问题!

感谢31eee384关于我使用类的事实,因此传递了引用而不是实际Transform的副本,它引导我到这里: C# & Unity : Pass reference by value?

该帖子的答案建议我将变换分解为我的struct中的Vector3 Position字段,然后存储它,这样就可以了!

谢谢,31eee384!我会把你的答案投票,但我认为我不能。