C#
1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using System.Linq; 6 7public class Test : MonoBehaviour 8{ 9 [System.Serializable] 10 public class Party 11 { 12 public List<Char> Chars; 13 14 public object Clone() 15 { 16 Party tmpParty; 17 tmpParty = (Party)this.MemberwiseClone(); 18 19 tmpParty.Chars = tmpParty.Chars.ToList(); 20 21 return tmpParty; 22 } 23 } 24 25 26 [System.Serializable] 27 public class Char 28 { 29 public int Char_ID; 30 public string Char_Name; 31 public List<Item> Char_Items = new List<Item>(); 32 } 33 34 [System.Serializable] 35 public class Item 36 { 37 public string Name; 38 public int Count; 39 } 40 41 public List<Party> SaveData = new List<Party>(); 42 43 [SerializeField] 44 public Party SaveData_Playing; 45 46 void Start() 47 { 48 Item Item1 = new Item(); 49 Item1.Name = "回復剤"; 50 Item1.Count = 1; 51 52 Item Item2 = new Item(); 53 Item2.Name = "武器"; 54 Item2.Count = 2; 55 56 Char Man=new Char(); 57 Man.Char_ID = 1; 58 Man.Char_Name = "オトコ"; 59 Man.Char_Items.Add(Item1); 60 Man.Char_Items.Add(Item2); 61 62 Item Item3 = new Item(); 63 Item1.Name = "魔法剤"; 64 Item1.Count = 3; 65 66 Item Item4 = new Item(); 67 Item2.Name = "なんか"; 68 Item2.Count = 4; 69 Char WoMan = new Char(); 70 WoMan .Char_ID = 2; 71 WoMan .Char_Name = "オンナ"; 72 WoMan .Char_Items.Add(Item3); 73 WoMan .Char_Items.Add(Item4); 74 75 SaveData_Playing.Chars.Add(Man); 76 SaveData_Playing.Chars.Add(WoMan); 77 78 SaveData.Add(new Party()); 79 SaveData[0]=(Party)SaveData_Playing.Clone(); 80 81 } 82}
上記のようなスクリプトを作りました。
ざっくりですが、ゲームを遊んでいてプレイ状況をセーブしたときの挙動想定しています。
79行目の
SaveData[0]=(Party)SaveData_Playing.Clone();
でセーブスロットにセーブデータを保存したつもりです。
ただ、実際に動かしてみると
SaveData_PlayingとSaveDataが一部同期してしまっており困っております。
例えば、Manの回復剤を2にすると、セーブをしたデータの
SaveData[0]
こちらまで一緒に2に切り替わってしまいます。
ネットで調べた限りだと値渡しのコピー(?)や、DeepCopyをする、と書いてあるのですが、どこをどうしたら良いかわからず、お知恵を貸していただけますと幸いです
コーの表示が崩れています。直してください。
Unity のタグをつけてください。
> 値渡しのコピーなどをすれば良いと思うのですが
意味不明です。具体的にコードのどこをどうしたいのか書いてください。
このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
> 出てくる’’’の枠の中に・・・
毎回間違えてますが ’’’ ではなくて ``` です。(バッククオート 3 つ)
おっしゃりたい意味はわかるので些事なのですが
C#では「参照渡し」は全く別の事象を指しています。
WoManとManを間違えているところがありますが、元ソースでもそうなっているのですか?
失礼しました。
コード挿入とUnityタグについて追加させていただきました。
また、質問文を補足させていただきました。
また、「WoManとManを間違えているところ」コチラも修正させていただきました。
Microsoft のドキュメントによると、
"MemberwiseClone メソッドは、新しいオブジェクトを作成し、現在のオブジェクトの非静的フィールドをその新しいオブジェクトにコピーすることによって、簡易コピーを作成します。フィールドが値型の場合、そのフィールドはビット単位でコピーされます。フィールドが参照型の場合、参照はコピーされますが、参照先オブジェクトはコピーされないため、元のオブジェクトとその複製は同じオブジェクトを参照します。"
・・・ということです。 上の一番最後のところが原因では?
回答1件
あなたの回答
tips
プレビュー