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

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

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

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

ポインタ

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

配列

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

解決済

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

Shitake893
Shitake893

総合スコア1

C#

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

ポインタ

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

配列

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

1回答

-1評価

0クリップ

229閲覧

投稿2022/03/27 10:46

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

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

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

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

C#

コード void CreateDeck() { Decks = new Movecen.DecksData[4]; /*Movecen.DecksData{ string decksname; int[] cards; } */ for(int i = 0; i < 4; i++) { Decks[i].deckname = "NewDeck" + (i + 1).ToString(); Decks[i].card = new int[100]; Decks[i].card = Resources.Load<DeckEntity>("DeckEntityList/FastDeck").cards; //DeckEntity、初期のデッキが入っています for(int k = 0; k < 10 && i == 0; k++) { Debug.Log("作成したデッキの" + k + "番目は" + Decks[0].card[k]); } } //配列が同期しているかのテスト、ここでは同期しない事が判明したが、 //Unity上では異変が起こっっていた Debug.Log("変更前の0の0は" + Decks[0].card[0]); Debug.Log("変更前の0の1は" + Decks[1].card[1]); Decks[0].card[0] = 4; Debug.Log("変更後の0の0は" + Decks[0].card[0]); Debug.Log("変更後の0の1は" + Decks[1].card[1]); }

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

C#

コード public void DeckSet()//デッキのカードをセットする { Debug.Log("デッキセットです"); //ひとまず、前にあったカードを削除する foreach (CardController card in Decks.GetComponentsInChildren<CardController>()) {//ここで前に表示されていたカードを消します Destroy(card.gameObject); } DeckDropPlace[] Okibas = Decks.GetComponentsInChildren<DeckDropPlace>(); int Cardbasyo = 0; //カード置き場を読み込む int[] kari = new int[100]; Array.Copy(deckManager.Decks[deckManager.DeckLod].card,kari,100); //このkariにデッキのカード達を入れておく //if(deckManager.DeckLod != 0)return; for(int i = 0; i < MetaNumber.CARDNUMBER; i++) { Debug.Log("kariのこの数は" + kari[i]); while(kari[i] > 0) { GameObject thiscard = Instantiate(CARD, Okibas[Cardbasyo].transform);//置き場所にカードを召喚する thiscard.transform.position = Okibas[Cardbasyo].transform.position; CardController cardC = thiscard.GetComponent<CardController>(); cardC.Init(i);//カードの初期化、ここでカードの情報を入れる cardC.placenumber = i; kari[i]--;//kariの数を引きく Cardbasyo++; } } // Debug.Log("仮のリストでの調整後" + deckManager.Decks[0].card[0]); }

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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での確認もうっかりずらす所を間違えてしまい、 門体解決が遠のいてしまいました。 質問者様の言う通り、勘違いで打ち間違いがありました。ありがとうございました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

ポインタ

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

配列

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