質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1936閲覧

unityでUIをプレハブ化して負荷を減らしたい。

konkonkon

総合スコア18

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/10/04 19:38

unity初心者です。スマホ用ゲーム想定です。
unityでゲーム制作をしているのですが、たまにカクつくためプロファイルを使用したところ、gfx.processsCommandsの割合が多かったため「ヒエラルキーに同時に存在するオブジェクトの数が多いのでは?」と考えました。これまでリザルト画面などはヒエラルキーにそのまま置いといて、ボス撃破処理でSetAciveするような方式を取っていました。ボス撃破時以外はチェックを外した状態SetAcive(false)にしていたので、勝手にそこまで負荷は大きくならんだろうと考えていました。(この辺の知識もあやふやなので間違いなどあれば教えてほしいです)
しかし今回カクつきを抑えたいということで、普段使わないイベント関連のオブジェクトは全部プレハブ化して必要な時だけInstantiateしたほうが処理が軽くなるのではないかと考え、作業しております。問題はここからなのですが、リザルトを閉じるための「OKボタン」などもプレハブ化することになるのですが、プレハブからヒエラルキーにあるオブジェクトは参照できないため、「OKボタン」にOnClickでリザルトを閉じる作業をさせる事が出来ません。(リザルトやバトル中のイベントは全てヒエラルキーに存在するイベントマネージャースクリプトに任せている)

ボタンなどのUIをプレハブ化したい場合どのような処理をすればよいのでしょうか。また、一般的にイベントなどのゲームUIは上記の思想に基づきプレハブ化するのが良いものなのでしょうか?

厳密にはプログラミングではないかもしれませんが、知恵袋等では回答が得られなかったためこちらで質問させてください。
何卒よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2018/10/05 01:57

エディタでプレイ中もオブジェクトの削除等出来ます(プレイを終了すれば元に戻ります)。なのでまずはプレイ中に「SetActive(true)の状態」「SetActive(false)の状態」「オブジェクトを削除した状態」に切り替えながら負荷を確認してみてください。最後の状態で軽量化しないならプレハブ化する意味が薄れます。
konkonkon

2018/10/07 13:05

sakura_hanaさんもunityの扱い方について教えてくださりありがとうございました!これを知ってるだけでデバックや改良が捗りそうです!
guest

回答1

0

ベストアンサー

■負荷の話
Activeがfalseの状態の時は、何もロードされず、負荷もありません。
なのでプレハブ化では解決しないかなと思います。

sakura_hanaさんの仰る通り、何で負荷がかかっているのかを調べてみてください。
パーティクルなど使っている場合は怪しいです。

■UIのイベントの話
Activeでなければ負荷はかからないので、シーンに置いておく、で基本は大丈夫です。
ただごちゃごちゃになってしまうのと、再利用する場合の初期化が面倒なので、
普段必要ないもの(リザルトや、スタートメニュー、ショップメニュー等など)は、プレハブ化すると良いでしょう。

プレハブ化する場合は、リザルト画面をInstantiateした直後に、
リザルト画面の閉じるボタンを取得し、押されたときの処理を登録すると良いです。


ボスを倒した
BattleManagerがボスが倒されたことを知る
BattleManagerがリザルト画面をInstantiateし、閉じるボタンを取得
BattleManagerの、OnResultEnd()を、閉じるボタンに登録しておく
ボタンが押され、OnResultEnd()が呼ばれたら、リザルト画面を消去、戦闘終了

投稿2018/10/05 03:50

編集2018/10/05 03:52
ganta7188

総合スコア434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

konkonkon

2018/10/07 13:03

回答を参考にスクリプトを組んでうまくいきました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問