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!我会投票决定你的答案,但我想我做不到。