【ハルシオンブログ】Unity Updateの中でGetComponentをしてはいけませんよ?っていう基本の話
5月も終わりですね。
5月もあっという間に終わった感じがします。
さて横浜ゲームダンジョンに出ようかどうしようか・・・・・・坂内っす。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityでの基本的な話なんだけど、Update内でGameObject.Findをしないという話。
よく聞きますよね。
実際にどれくらい重くなるのか試してみました。
[Blog20230529.cs]

Startでは画面の負荷をあげるために、Sphereを1000個画面に適当に置いてます。
2000回Imageの色を変えて時間を測ります。
Updateの中の
GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);
と
imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);
を切り替えて実行してみました。
【GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
11.10498秒
【imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
11.27025秒
か・・・変わらねえ・・・・というか、GetComponentしてない方が遅い!?
あれ??
まぁただ、Updateで毎フレームFindで取得しにいくのはちょっと気持ち悪いのは気持ち悪いですよね…
ちなみに処理負荷上げるために玉を10000個置いても、処理時間に差がありませんでした‥
うちのPCだとちょっと時間の差はありませんでしたが、やめた方がいいですね!キリッ
ということで、UpdateでGetComponentをしない方がいいよという話。全然検証になってませんが。
では、あでゅ~!ノシ
5月もあっという間に終わった感じがします。
さて横浜ゲームダンジョンに出ようかどうしようか・・・・・・坂内っす。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityでの基本的な話なんだけど、Update内でGameObject.Findをしないという話。
よく聞きますよね。
実際にどれくらい重くなるのか試してみました。
[Blog20230529.cs]
using UnityEngine;
using UnityEngine.UI;
public class Blog20230529 : MonoBehaviour
{
[SerializeField] GameObject obj;
[SerializeField] Image imgPlate;
int rdmCnt = 0;
System.Diagnostics.Stopwatch stopwatch;
bool isMeasuring;
private void Start() {
// 準備
for (int i = 0; i < 1000; i++) {
Instantiate(obj, new Vector3(Random.Range(-3f, 3f), Random.Range(-4f, 6f), 0), Quaternion.identity);
}
stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
isMeasuring = true;
}
private void Update() {
if (isMeasuring) {
rdmCnt++;
GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);
//imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);
if (rdmCnt >= 2000) {
isMeasuring = false;
stopwatch.Stop();
Debug.Log((float)stopwatch.Elapsed.TotalSeconds);
}
}
}
}

Startでは画面の負荷をあげるために、Sphereを1000個画面に適当に置いてます。
2000回Imageの色を変えて時間を測ります。
Updateの中の
GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);
と
imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);
を切り替えて実行してみました。
【GameObject.Find("imgPlate").GetComponent<Image>().color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
11.10498秒
【imgPlate.color = new Color(Random.value, Random.value, Random.value, 1f);の場合】
11.27025秒
か・・・変わらねえ・・・・というか、GetComponentしてない方が遅い!?
あれ??
まぁただ、Updateで毎フレームFindで取得しにいくのはちょっと気持ち悪いのは気持ち悪いですよね…
ちなみに処理負荷上げるために玉を10000個置いても、処理時間に差がありませんでした‥
うちのPCだとちょっと時間の差はありませんでしたが、やめた方がいいですね!キリッ
ということで、UpdateでGetComponentをしない方がいいよという話。全然検証になってませんが。
では、あでゅ~!ノシ
Category: 開発日記(Unity)
【ハルシオンブログ】ifでキャスト判定した時にそのままキャストした変数として使う
こんにちは。
大坂です。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
ifでis演算子を使用してキャスト判定した時って、そのままキャストした変数として使えるんですね。
こんな感じでやってた。
こうできます。
ちょっとだけ手間が省けますね。
C#7からの機能らしいです。
では今週も短いですがこれにてノシ
大坂です。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
ifでis演算子を使用してキャスト判定した時って、そのままキャストした変数として使えるんですね。
こんな感じでやってた。
object obj = "test";
if(obj is string) {
Debug.Log(((string)obj).Length);
}
こうできます。
object obj = "test";
if(obj is string s) {
Debug.Log(s.Length);
}
ちょっとだけ手間が省けますね。
C#7からの機能らしいです。
では今週も短いですがこれにてノシ
Category: 開発日記(Unity)
【ハルシオンブログ】配列ってあとからでもサイズ変えれるんですね。Resizeで配列のサイズを変えよう!
こんにちは。坂内っす。
5月ももう終わりそうですね。
時が過ぎるのがとても速いです・・・
ポケットガール~受け継がれし希望~ でてます!
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityで配列使うことって多々ありますよね。
でも配列って大きさ決めたら増やすこととかできないから使いずらいってことあると思います。
その分Listのほうが自由にできていいですもんね。
でも実は配列って宣言した後でもサイズ変えれるんですよ。
Array.Resize(ref 配列, 変更後の要素数)
[Blog20220522.cs]

こんな感じで、初め6個のintを入れたintAryですが、Resize後にはちゃんと10個の配列になっています。
ということで、配列のサイズを初期設定後に変える方法でした。
あでゅ~ノシ
5月ももう終わりそうですね。
時が過ぎるのがとても速いです・・・
ポケットガール~受け継がれし希望~ でてます!
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityで配列使うことって多々ありますよね。
でも配列って大きさ決めたら増やすこととかできないから使いずらいってことあると思います。
その分Listのほうが自由にできていいですもんね。
でも実は配列って宣言した後でもサイズ変えれるんですよ。
Array.Resize(ref 配列, 変更後の要素数)
[Blog20220522.cs]
using System;
using UnityEngine;
public class Blog20230522 : MonoBehaviour
{
void Start() {
int[] intAry = {0, 1, 2, 4, 6, 10 };
Debug.Log("初期設定" + intAry.Length);
Array.Resize(ref intAry, 10);
Debug.Log("リサイズ後" + intAry.Length);
}
}

こんな感じで、初め6個のintを入れたintAryですが、Resize後にはちゃんと10個の配列になっています。
ということで、配列のサイズを初期設定後に変える方法でした。
あでゅ~ノシ
Category: 開発日記(Unity)
【ハルシオンブログ】C#9で型名がわかっているときはnew 演算子で型名を省略できる
こんにちは。
大坂です。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
C#9で型名がわかっているときはnew 演算子で型名を省略できるんですね。
ターゲット型の new 式というらしいです。
「var」のところはエラーになるので、型名を明示しているときだけできますね。
大した話ではないですが、C#9でこんな機能があるよという紹介でした。
ではまたノシ
大坂です。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
C#9で型名がわかっているときはnew 演算子で型名を省略できるんですね。
ターゲット型の new 式というらしいです。
// 今までの書き方
List test_1 = new List();
// new で型を省略できる
List test_2 = new();
// エラー
var test_3 = new();
// メソッドの戻り値も省略できる
List TestMethod()
{
return new() {1, 2, 3};
}
「var」のところはエラーになるので、型名を明示しているときだけできますね。
大した話ではないですが、C#9でこんな機能があるよという紹介でした。
ではまたノシ
Category: 開発日記(Unity)
【ハルシオンブログ】Unityでボタンいっぱいの画面を作ってみた。
こんにちは。坂内っす。
まずはポケガ3の宣伝から。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityでこんな画面作ってみる。

ボタンがいっぱいで作るのめんどいよね!
ボタン1個1個にOnClick設定とか・・・・やってられませんよね。
こんな感じで簡単に作れます。
まずボタンのプレハブを用意。

60x60の白Imageと、その子供にTextを用意しました。
もちろんTMPでもなんでもOK
Textは数字入れたときにちゃんと見えるようにサイズと位置を調整済。
次に、ボタンを並べるところを準備します。
GridLayoutで60x60が並ぶようにしておきました。

あとは、こんなコードを書きます。
[Blog20230515.cs]
これだけ。
1個1個ボタンを設定する必要なんてないんです!
AddListnerで設定してあげればいいですね。
これで作られるオブジェクトはこんな感じ。

ちゃんとボタン押すと押されたNoが画面上部にでますね。
ということで、ボタンいっぱいの画面の作り方でした。
あでゅ~ノシ
まずはポケガ3の宣伝から。
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityでこんな画面作ってみる。

ボタンがいっぱいで作るのめんどいよね!
ボタン1個1個にOnClick設定とか・・・・やってられませんよね。
こんな感じで簡単に作れます。
まずボタンのプレハブを用意。

60x60の白Imageと、その子供にTextを用意しました。
もちろんTMPでもなんでもOK
Textは数字入れたときにちゃんと見えるようにサイズと位置を調整済。
次に、ボタンを並べるところを準備します。
GridLayoutで60x60が並ぶようにしておきました。

あとは、こんなコードを書きます。
[Blog20230515.cs]
using UnityEngine;
using UnityEngine.UI;
public class Blog20230515 : MonoBehaviour
{
[SerializeField] Text lblSelectNo;
[SerializeField] Transform trnButton;
[SerializeField] GameObject objItem;
const int countOfButton = 150;
void Start()
{
for (int i = 0; i < countOfButton; i++) {
GameObject obj = Instantiate(objItem, trnButton, false);
obj.name = "btn" + i;
Text text = obj.GetComponentInChildren<Text>();
text.text = i.ToString();
int no = i;
obj.GetComponent<Button>().onClick.AddListener(() => OnClickNo(no));
}
}
void OnClickNo(int i) {
lblSelectNo.text = i.ToString();
}
}
これだけ。
1個1個ボタンを設定する必要なんてないんです!
AddListnerで設定してあげればいいですね。
これで作られるオブジェクトはこんな感じ。

ちゃんとボタン押すと押されたNoが画面上部にでますね。
ということで、ボタンいっぱいの画面の作り方でした。
あでゅ~ノシ
Category: 開発日記(Unity)