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

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

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

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

Unity

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

Q&A

解決済

1回答

360閲覧

複数複製された親オブジェクトの子に別々の値を代入する方法

tensaikumabouzu

総合スコア45

C#

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

Unity

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

0グッド

0クリップ

投稿2017/11/23 15:07

UnityでTwitterのタイムライン情報をGame画面に出力しようとしてます。

prefabとなったGameObjectを20個適当に出現させます。今回はTweetDisというGameObjectです。
それらを区別させるために名前(TweetText)の末尾に数字を振りました。以下が簡略化したコードです。

c#

1public GameObject TweetDis;//prefab用 2 3for (int i = 0; i < 20; i++) { 4 var obj = Instantiate (TweetDis, new Vector3 (0, 350 + 300 * i, 0), Quaternion.identity) as GameObject; 5 string j = i.ToString (); 6 obj.name = "TwitterText" + j; 7 }

TweetTextは親となっていてUnity上ではCanvasのTweetPanelが子でその子がTextのUsername,text,ProfileImageとなっています。下のような感じです。

TweetText(Cube)
↳TweetPanel(Canvas)
↳Username(Text)
text (Text)
ProfileImage(RawImage)

InstatiateではTweetText0,TweetText1・・・と名前を変更して20個複製しても子の名前は変わりませんでした。20個それぞれのUsername、Text、ProfileImageに別の情報を代入するために(今回はUsernameに絞っています)、以下のコードを組みました。kはfor文で制御しています。これではエラーを吐いてしまい、うまくいきませんでした。

c#

1UserNameText = GameObject.Find (string.Format ("TwitterText{0}/TweetPanel/Username", k)).GetComponent<Text> (); 2UserNameText.text = "@" + json [k] ["user"] ["screen_name"];

Twitterに限った話じゃありませんが、どのようにして複数複製された親オブジェクトの子に別々の値を代入することができるのでしょうか?宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

どのようにして複数複製された親オブジェクトの子に別々の値を代入することができるのでしょうか?宜しくお願い致します。

TweetDisプレハブにTweetDisを管理するスクリプトをアタッチすると楽です。
簡単に説明すると、TweetDisにスクリプトをアタッチして自身の設定を任せ、読み出し側からもアクセスできるようにするといった感じです。

下準備
0. TweetDisプレハブに下記スクリプトをアタッチ
0. ヒエラルキーから変更したいテキストコンポーネントをアタッチ
0. 参考までにボタンも用意したので必要ありましたらアタッチしてください。必要なければコードを消してください。
0. 変更内容を反映させるためにプレハブをApplyする

TweetDis.cs

C#

1public class TweetDis : MonoBehaviour 2{ 3 //ツイートボタンをクリックした場合に発火するイベントを定義 4 //使うかわかりませんが参考までに 5 public event System.Action<TweetDis> OnTweetBtn = delegate{}; 6 7 //ユーザー名を表示するTextをヒエラルキーからアタッチ 8 [SerializeField] Text UsernameText; 9 //ツイートボタンをアタッチ 10 [SerializeField] Button TweetButton; 11 12 public string UserName{ get; private set; } 13 14 //初期設定 15 public void SetUp(string UserName) 16 { 17 this.UserName = UserName; 18 UsernameText.text = UserName; 19 gameObject.name = UserName; 20 } 21 22 void Start() 23 { 24 //ツイートボタンがクリックされたらOnTweetBtnイベント発火 25 TweetButton.onClick.AddListener (()=>{ 26 if(OnTweetBtn != null) OnTweetBtn(this); 27 }); 28 } 29}

呼び出し側

C#

1//プレファブをアタッチ 2public GameObject TweetDisPrefab; 3//TweetDisを格納する配列を定義 4public List<TweetDis> TweetDisObjs = new List<TweetDis>(); 5 6void Start() 7{ 8 for (int i = 0; i < 20; i++) 9 { 10 var obj = Instantiate (TweetDisPrefab, new Vector3 (0, 350 + 300 * i, 0), Quaternion.identity) as GameObject; 11 12 //TweetDisスクリプトを取得 13 var s = obj.GetComponent<TweetDis>(); 14 //UserNameを設定 15 s.SetUp( string.Format("TwitterText{0}",i) ); 16 //クリックされた時のイベントをバインド 17 s.OnTweetBtn += OnClickTweetDis; 18 //親から子全体に何かする場合は配列に格納しておくとアクセスコストが軽いです。 19 TweetDisObjs.Add(s); 20 } 21} 22 23void OnClickTweetDis(TweetDis obj) 24{ 25 Debug.Log( string.Format("{0}がクリックされました",obj.UserName) ); 26} 27 28//すべてのTweetDisを削除 29public void DeleteAllTweetDisObjs() 30{ 31 for (int i = 0; i < TweetDisObjs.Count; i++) 32 { 33 TweetDisObjs[i].OnTweetBtn -= OnClickTweetDis; 34 Destroy(TweetDisObjs[i].gameObject); 35 } 36 TweetDisObjs.Clear(); 37} 38 39//すべてのTweetDisの名前を配列で取得 40public string[] GetAllNamesTweetDisObjs() 41{ 42 string[] names = new string[ TweetDisObjs.Count ]; 43 for (int i = 0; i < TweetDisObjs.Count; i++) 44 { 45 names[i] = TweetDisObjs[i].UserName; 46 } 47 return names; 48}

投稿2017/11/23 20:16

編集2017/11/23 20:20
IShix

総合スコア1724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問