FC2ブログ
    10 «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.» 12

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

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

     

    【ハルシオンブログ】PrefabをInstantiateするときの注意点?ベースとなるPrefabを弄ってはいけない気がします! 

    こんにちは!もう11月ですね!今年もあと2か月となりました...うわぁ 早いですね~
    コロナのせいでどこも行けてません。
    来年落ち着いたらどこか(北海道)に遊びに行こうと思いますと、心に誓う坂内です。


    Unityにてちょっと気になったことがあったのでメモしておきます。

    uGUIのImageを並べてこんな感じの表みたいのを作るとします。



    この時にコード上ではこんな感じに書くと思います。
    あ、プレハブを生成するGameObjectにはVerticalLayoutGroupがついています。

    [Blog20201102.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20201102 : MonoBehaviour
    {
    [SerializeField] Transform trnItemPlace;
    [SerializeField] GameObject itemPrefab;

    const int ListItemCount = 7;

    private void Start() {
    for (int i = 0; i < ListItemCount; i++) {
    Instantiate(itemPrefab, trnItemPlace, false);
    }
    }
    }



    ここまではいいとします。

    では、各itemPrefabで生成されたImageのオブジェクトの色を変える時は?

    [Blog20101102.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20201102 : MonoBehaviour
    {
    [SerializeField] Transform trnItemPlace;
    [SerializeField] Image itemPrefab;

    const int ListItemCount = 7;

    private void Awake() {
    for (int i = 0; i < ListItemCount; i++) {
    Image image = Instantiate(itemPrefab, trnItemPlace, false);
    image.color = new Color(0.5f, 0.2f, 1f, 1f);
    }
    }
    }



    こんな感じで「生成したオブジェクトの色を変える」のが一般だと思います。

    しかし、こんな書き方でも動くようです。

    [Blog20201102.cs]

    public class Blog20201102 : MonoBehaviour
    {
    [SerializeField] Transform trnItemPlace;
    [SerializeField] Image itemPrefab;

    const int ListItemCount = 7;

    private void Awake() {
    itemPrefab.color = new Color(0.5f, 0.2f, 1f, 1f);
    for (int i = 0; i < ListItemCount; i++) {
    Instantiate(itemPrefab, trnItemPlace, false);
    }
    }
    }


    何をやっているかというと、「プレハブ本体を変更してそれを生成」しているんですが、これはよろしくないかと思います。

    これ、上記のような書き方ならば意図的な感じはしますが、以下のようなコードを見ることがあります。
    これは何か勘違いしている書き方ではないかと。

    [Blog20201102.cs]

    public class Blog20201102 : MonoBehaviour
    {
    [SerializeField] Transform trnItemPlace;
    [SerializeField] Image itemPrefab;

    const int ListItemCount = 7;

    private void Awake() {
    for (int i = 0; i < ListItemCount; i++) {
    itemPrefab.color = new Color(0.5f, 0.2f, 1f, 1f);
    Instantiate(itemPrefab, trnItemPlace, false);
    }
    }
    }




    基本的には「プレハブはベースとなるオブジェクト」「プレハブをもとに生成したオブジェクトに手を加える」がよろしいのかなと。
    そんな決まり自体はないのですが、元を変えちゃうのはどうかと。
    上記の書き方をすると、実行後のプレハブ自体に色がついてしまいます。

    ということで、プレハブの生成は色々な書き方で動くけど、「Prefabはベースとなるオブジェクト」「生成した後のオブジェクトに手を加える」がいいのかなと勝手に思ってる私でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0