FC2ブログ
    04 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 06

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】Unityで同じ項目を持つ複数のオブジェクトをまとめて取得設定する方法。 

    おはようございます。坂内です。
    今日も雨がずっと降っております。
    昨日一昨日あたりからずっと降ってますよね・・・・

    これ、以前にもやったかもしれませんが・・・・
    例えば、こんな感じで複数同じような情報がある場合、どうやってますか?





    こうやれば、できますが・・・・

    [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)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/694-5e4a9db9
    この記事にトラックバックする(FC2ブログユーザー)