【ハルシオンブログ】PrefabをInstantiateするときの注意点?ベースとなるPrefabを弄ってはいけない気がします!
こんにちは!もう11月ですね!今年もあと2か月となりました...うわぁ 早いですね~
コロナのせいでどこも行けてません。
来年落ち着いたらどこか(北海道)に遊びに行こうと思いますと、心に誓う坂内です。
Unityにてちょっと気になったことがあったのでメモしておきます。
uGUIのImageを並べてこんな感じの表みたいのを作るとします。

この時にコード上ではこんな感じに書くと思います。
あ、プレハブを生成するGameObjectにはVerticalLayoutGroupがついています。
[Blog20201102.cs]
ここまではいいとします。
では、各itemPrefabで生成されたImageのオブジェクトの色を変える時は?
[Blog20101102.cs]
こんな感じで「生成したオブジェクトの色を変える」のが一般だと思います。
しかし、こんな書き方でも動くようです。
[Blog20201102.cs]
何をやっているかというと、「プレハブ本体を変更してそれを生成」しているんですが、これはよろしくないかと思います。
これ、上記のような書き方ならば意図的な感じはしますが、以下のようなコードを見ることがあります。
これは何か勘違いしている書き方ではないかと。
[Blog20201102.cs]
基本的には「プレハブはベースとなるオブジェクト」「プレハブをもとに生成したオブジェクトに手を加える」がよろしいのかなと。
そんな決まり自体はないのですが、元を変えちゃうのはどうかと。
上記の書き方をすると、実行後のプレハブ自体に色がついてしまいます。
ということで、プレハブの生成は色々な書き方で動くけど、「Prefabはベースとなるオブジェクト」「生成した後のオブジェクトに手を加える」がいいのかなと勝手に思ってる私でした。
では、あでゅ~ノシ
コロナのせいでどこも行けてません。
来年落ち着いたらどこか(北海道)に遊びに行こうと思いますと、心に誓う坂内です。
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)
« 【ハルシオンブログ】Unity2020.2でデフォルトの親オブジェクトの設定ができる。 | 【ハルシオンブログ】Listの最大値、最小値の要素番号が欲しかった。 »
コメント
| h o m e |