【ハルシオンブログ】Unityで同じ項目を持つ複数のオブジェクトをまとめて取得設定する方法。
おはようございます。坂内です。
今日も雨がずっと降っております。
昨日一昨日あたりからずっと降ってますよね・・・・
これ、以前にもやったかもしれませんが・・・・
例えば、こんな感じで複数同じような情報がある場合、どうやってますか?


こうやれば、できますが・・・・
[Script0420.cs]

こんな感じでできます。
ただ、この方法だと表示等の項目が増える度に配列を増やして・・・・・これが数十キャラの場合は?
どんどん大変になっていきいますよね。
今でもすでにこんな感じです。

こんな時は大本のリスト1個で他の項目を自動で取得しちゃいましょう!
まずはコードをこんな感じに変えます。
[Script0420.cs]
ラベルやイメージ等の各キャラに付随するオブジェクトはベースのオブジェクトを起点に取得すればアサインをしなくてもいいですね。
この方法だとアサインはベースとなるcharaObjをやるだけ。
実際にはこんな感じ。

アサインがすんごい楽ですよね。
こんな感じにしていけば、大体こんな感じでいつもやってます。
ベースとなるオブジェクト自体も名前を決めて、アサインをせずに自動で取得するようにすればもっと楽なのかもしれませんが・・・
ってことで、同じようなオブジェクトをまとめて楽にとる方法でした。
あでゅ~ノシ
今日も雨がずっと降っております。
昨日一昨日あたりからずっと降ってますよね・・・・
これ、以前にもやったかもしれませんが・・・・
例えば、こんな感じで複数同じような情報がある場合、どうやってますか?


こうやれば、できますが・・・・
[Script0420.cs]
using UnityEngine;
using UnityEngine.UI;
public class Script0420 : MonoBehaviour
{
public Text[] lblNames;
public Image[] imgCharas;
public Text[] lblStrNums;
public Text[] lblIntNums;
public Text[] lblAgiNums;
void Start()
{
for(int i = 0; i < lblNames.Length; i++) {
lblNames[i].text = i + "番目のキャラ";
//imgCharas[i].sprite = 絵を表示
lblStrNums[i].text = Random.Range(1, 1000).ToString("n0");
lblIntNums[i].text = Random.Range(1, 1000).ToString("n0");
lblAgiNums[i].text = Random.Range(1, 1000).ToString("n0");
}
}
}

こんな感じでできます。
ただ、この方法だと表示等の項目が増える度に配列を増やして・・・・・これが数十キャラの場合は?
どんどん大変になっていきいますよね。
今でもすでにこんな感じです。

こんな時は大本のリスト1個で他の項目を自動で取得しちゃいましょう!
まずはコードをこんな感じに変えます。
[Script0420.cs]
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Script0420 : MonoBehaviour
{
public List<GameObject> charaObj;
List<Text> lblNames = new List<Text>();
List<Image> imgCharas = new List<Image>();
List<Text> lblStrNums = new List<Text>();
List<Text> lblIntNums = new List<Text>();
List<Text> lblAgiNums = new List<Text>();
void Start()
{
// キャラの表示オブジェクトを取得
SetCharaBase();
// キャラのデータを設定
SetCharaData();
}
private void SetCharaBase() {
foreach(GameObject charaBaseObj in charaObj) {
lblNames.Add(charaBaseObj.transform.Find("lblName").GetComponent<Text>());
imgCharas.Add(charaBaseObj.transform.Find("imgChara").GetComponent<Image>());
lblStrNums.Add(charaBaseObj.transform.Find("lblStr").GetComponent<Text>());
lblIntNums.Add(charaBaseObj.transform.Find("lblInt").GetComponent<Text>());
lblAgiNums.Add(charaBaseObj.transform.Find("lblAGI").GetComponent<Text>());
}
}
private void SetCharaData() {
for(int i = 0; i < charaObj.Count; i++) {
lblNames[i].text = i + "番目のキャラ";
//imgCharas[i].sprite = 絵を表示
lblStrNums[i].text = Random.Range(1, 1000).ToString("n0");
lblIntNums[i].text = Random.Range(1, 1000).ToString("n0");
lblAgiNums[i].text = Random.Range(1, 1000).ToString("n0");
}
}
}
ラベルやイメージ等の各キャラに付随するオブジェクトはベースのオブジェクトを起点に取得すればアサインをしなくてもいいですね。
この方法だとアサインはベースとなるcharaObjをやるだけ。
実際にはこんな感じ。

アサインがすんごい楽ですよね。
こんな感じにしていけば、大体こんな感じでいつもやってます。
ベースとなるオブジェクト自体も名前を決めて、アサインをせずに自動で取得するようにすればもっと楽なのかもしれませんが・・・
ってことで、同じようなオブジェクトをまとめて楽にとる方法でした。
あでゅ~ノシ
Category: 開発日記(Unity)
« 【ハルシオンブログ】LinqのAggregateってちょっと面白いですかね? | 【ハルシオンブログ】foreachで変数を使わずに繰り返し回数を得る方法 »
コメント
| h o m e |