質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

872閲覧

C# Unity 配列が同期してしまう、(一つの要素を操作したら、全部の要素が変更される)

Shitake893

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/03/27 10:46

Unity C#にて配列が同期されてしまいます。

カードゲームを作りたく、使用するカードを入れる配列
(構造体で int[]card, string cardnameが入っています)
を作った所、作ってすぐの時はそれぞれに独立して、数値を入れられるのですが、
いざUnityて構うと4つ作った配列の内、一つのものをいじくるとすべての
値が変更されてしまうというトラブルが起こっています。

主なソースは以下のようになっています
//デッキの作成、この時は同じ初期デッキを作る

//UIを変更する所、主にこの配列を使っているのが次の所

C#

1コード 2void CreateDeck() 3 { 4 Decks = new Movecen.DecksData[4]; 5 6/*Movecen.DecksData{ 7string decksname; 8int[] cards; 9} 10*/ 11 for(int i = 0; i < 4; i++) 12 { 13 Decks[i].deckname = "NewDeck" + (i + 1).ToString(); 14 Decks[i].card = new int[100]; 15 Decks[i].card = Resources.Load<DeckEntity>("DeckEntityList/FastDeck").cards; 16//DeckEntity、初期のデッキが入っています 17 for(int k = 0; k < 10 && i == 0; k++) 18 { 19 Debug.Log("作成したデッキの" + k + "番目は" + Decks[0].card[k]); 20 } 21 22 } 23 24 //配列が同期しているかのテスト、ここでは同期しない事が判明したが、 25//Unity上では異変が起こっっていた 26 Debug.Log("変更前の0の0は" + Decks[0].card[0]); 27 Debug.Log("変更前の0の1は" + Decks[1].card[1]); 28 Decks[0].card[0] = 4; 29 Debug.Log("変更後の0の0は" + Decks[0].card[0]); 30 Debug.Log("変更後の0の1は" + Decks[1].card[1]); 31 32 33 34 }

次の所が主にこの構造体を使っている所です

C#

1コード 2 public void DeckSet()//デッキのカードをセットする 3 { 4 Debug.Log("デッキセットです"); 5 //ひとまず、前にあったカードを削除する 6 foreach (CardController card in Decks.GetComponentsInChildren<CardController>()) 7 {//ここで前に表示されていたカードを消します 8 Destroy(card.gameObject); 9 } 10 11 DeckDropPlace[] Okibas = Decks.GetComponentsInChildren<DeckDropPlace>(); 12 int Cardbasyo = 0; 13 //カード置き場を読み込む 14 int[] kari = new int[100]; 15 Array.Copy(deckManager.Decks[deckManager.DeckLod].card,kari,100); 16 17 //このkariにデッキのカード達を入れておく 18 //if(deckManager.DeckLod != 0)return; 19 for(int i = 0; i < MetaNumber.CARDNUMBER; i++) 20 { 21 Debug.Log("kariのこの数は" + kari[i]); 22 while(kari[i] > 0) 23 { 24 GameObject thiscard = Instantiate(CARD, Okibas[Cardbasyo].transform);//置き場所にカードを召喚する 25 thiscard.transform.position = Okibas[Cardbasyo].transform.position; 26 CardController cardC = thiscard.GetComponent<CardController>(); 27 cardC.Init(i);//カードの初期化、ここでカードの情報を入れる 28 cardC.placenumber = i; 29 kari[i]--;//kariの数を引きく 30 Cardbasyo++; 31 } 32 } 33 // Debug.Log("仮のリストでの調整後" + deckManager.Decks[0].card[0]); 34 35 }

Unityのエディターで起動させるだけなら、ここが全てです。どこかで
同期してしまったのか、教えて下さると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bboydaisuke

2022/03/28 03:54

DecksData のメンバがコメントによる定義では cards になってるのに コード内では card になっている時点で、他にもいろいろ勘違いしてるんだろうな、という感じがします。 自分の把握していない所で変数が書き換えられているのでしょうから、一部のコードを貼られても無駄だと思います。
Shitake893

2022/03/28 10:13

bboydaisuke様 ありがとうございます。ごめんなさい、DecksDataのメンバがcardsになっていたのは ここに質問するために急いで付け足したため、誤字をしてしましました。ご指摘ありがとうございます。 一応この件は解決できました。 Decks[i].card = Resources.Load<DeckEntity>("DeckEntityList/FastDeck").cards; の所を Array.Copy()を使うよう変更しました。 本当に初期的な間違いでした。Debug.Logでの確認もうっかりずらす所を間違えてしまい、 門体解決が遠のいてしまいました。 質問者様の言う通り、勘違いで打ち間違いがありました。ありがとうございました。
guest

回答1

0

ベストアンサー

デッキの初期化のところ↓

C#

1Decks[i].card = new int[100]; 2Decks[i].card = Resources.Load<DeckEntity>("DeckEntityList/FastDeck").cards;

1行目で配列の初期化を行っていますが、次の行で上書きしているので初期化の意味が無くなり、すべてのデッキが同じメモリを指しているのではないでしょうか?

同期しないようにしたいのであれば↓

C#

1Array.Copy(Resources.Load<DeckEntity>("DeckEntityList/FastDeck").cards,Decks[i].card,100);

2つ目のコードで使われているArray.Copy()メソッドを使えばいいと思います。

投稿2022/03/28 12:30

KomoriGameDev

総合スコア433

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shitake893

2022/03/28 14:46

KomiriGameDev様 ありがとうございます。まさしくその通りです。 実際にそこを修正して、解決できました。 その他、コメントのcardがcardsになっていたり、Debug.Logで間違った所を 確認していたりと至らない所がありました。 このような質問に対しコメントをしていただき誠にありがとうございます。
KomoriGameDev

2022/03/28 15:28

お役に立てたなら良かったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問