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

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

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

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

Unity

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

Q&A

解決済

1回答

4455閲覧

Unityでprefabの中をScriptから動的に変更したい

iwa_o_r

総合スコア10

C#

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

Unity

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

1グッド

0クリップ

投稿2018/12/13 11:38

編集2018/12/15 14:55

前提・実現したいこと

カードゲームの手札を生成する処理をイメージして質問します。

CardというPrefabを作成し、
その中にカードの名前(Text)やカードの画像(Panel)を入れています。

このPrefabをScriptからInstantiateした際に、
マスターデータから名前と画像名を取得して表示したいのですが、
中身を動的に書き換えるのがなかなかうまくいきません…。
(マスターデータから取得する処理は一旦省いていただきたいです。)

どなたかご教授お願いいたします。

試したこと(カードのタイトルを変更する。)

public class HandCard : MonoBehaviour { public GameObject prefab; void Start () { // prefab prefab = Resources.Load<GameObject>("Card"); for (int i = 1; i < 8; i++) { GameObject obj = Instantiate(prefab, this.transform.position, Quaternion.identity, this.transform); // こんな感じで変更したいのですが、やり方が違うのでしょうか? obj.transform.GetComponent<CardTitle>.GetComponent<Text>().text = "変更したいタイトル + i"; } }

prefabのイメージ画像を追記

イメージ説明

negitama👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問者さんのコードはGetComponent のあたりの書き方が怪しい気がします。
また、for文のカウンタの i まで "" で囲んでしまうと、i という文字としか認識されません。
たとえばカードの名前を配列から取り出すなら、以下のようになるかと思います。

【追記】質問者さんからの追加情報を受けて、Cardプレハブの子オブジェクトを名前で見つけ、そのTextコンポーネントに値をセットするようスクリプトを更新しました。参考画像も差し替えています。
(子オブジェクトを名前で探しだす場合、Transform.Findメソッドが便利です。GameObject.Findメソッドとは別物なので注意)

C#

1using UnityEngine; 2using UnityEngine.UI; 3 4public class HandCard : MonoBehaviour 5{ 6 public GameObject cardPrefab; 7 8 public string[] cardNames; // カードの名前の配列 9 10 private void Start () 11 { 12 for ( int i = 0 ; i < cardNames.Length ; i++ ) 13 { 14 GameObject card = Instantiate ( cardPrefab, this.transform.position, Quaternion.identity ); 15 16 //【更新】Cardプレハブの子オブジェクトを名前で見つけ、そのTextコンポーネントに値をセットする 17 card.transform.Find ( "CardTitle" ).GetComponent<Text> ().text = cardNames[i]; 18 } 19 } 20} 21

参考画像
イメージ説明

投稿2018/12/13 13:19

編集2018/12/16 06:44
negitama

総合スコア943

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

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

iwa_o_r

2018/12/14 14:47 編集

ご回答ありがとうございます。 card.GetComponent<Text> ().text = cardNames[i]; この部分でTextがうまく取れません…。 あと、複数Textがあった場合にはこれだと難しいと思うのですが、どうすれば取れるのでしょうか?
negitama

2018/12/15 00:02 編集

参考画像を追加しました。こちらではプレハブのTextコンポーネントに文字を追加できています。プレハブの構成等確認してください。 もし認識が異なるようなら、元の質問のほうに、質問者さんのプレハブの構成など、必要な情報を追記してください。 複数テキストの場合はまた別のやり方がいいと思いますが、ひとつずつ解決してください。
iwa_o_r

2018/12/15 14:57

返信が遅くなってしまい、申し訳ありません。 参考画像ありがとうございます! その構成であれば取得できるのですね。 今回自分が作成中の構成を追記しました。 prefabの中に複数のpanelやtextを入れてカードを作成しています。
negitama

2018/12/16 06:34

追記された情報を受けて、回答を更新しました。 確認願います。
iwa_o_r

2018/12/16 07:51

出来ました!! 色々とありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問