关于c#:Struct具有Transform并存储在Dictionary< int,Struct>中。

Struct has Transform and is stored in Dictionary<int, Struct>

我有一个结构,它有一个字符串、布尔值和一个转换。我的部分代码循环遍历场景中具有相关标记的每个对象,并将每个单独对象的信息存储在一个结构中。然后将结构放置在一个字典中,该字典以对象的ID作为键。所以我的字典(在伪代码中)看起来像字典positions=new dictionary(int id,positions pos),其中"positions pos"是具有对象的字符串、布尔值和转换的结构。它是一个结构字典,每个条目代表我场景中的一个对象。

因此,当我在时间点A将对象的信息结构存储在字典中时,它应该在该时间点存储字符串、布尔值和转换。因此,稍后,在时间点B,当我遍历字典时,我可以在需要的时候检索正确对象ID的正确字符串和布尔值。

另一方面,我从字典的存储结构中检索到的转换显然已经更新为B点的当前转换值。因此,当我试图将有问题的对象移动到A点的转换值时,debug.log会告诉我A点和B点的转换值是相同的,并且对象被移动到当前位置(净效果为=没有发生任何情况)!

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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;
        }
    }
}

下面是我在字典中存储结构的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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);
            }
        }
    }

稍后,在检索时,我使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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));
            }
        }

最后,要显示两个不同转换并使当前对象的转换等于传入转换值的函数:

1
2
3
4
5
6
7
8
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;
}

如果传入的转换为false,则我得到的debug.log输出为false,然后是两个等于相同转换值的调试行。

我唯一能想到的是,当转换存储在结构中时,它是通过引用传递的,因此字典的结构只查看当前值作为其值?


在这种情况下,操作人员正在回答自己的问题!

由于31eee384关于我正在使用一个类这一事实的观点,因此引用被传递,而不是实际转换的副本,因此它引导我到这里:统一:按值传递引用?

对这篇文章的回答建议我将转换分解为结构中的vector3位置字段,并将其存储起来,这样就可以了!

谢谢,31ee384!我会投票决定你的答案,但我想我做不到。