Unityに関連する記事です

 2回の手順に分けてゲーム画面にミニマップを表示する機能の実装を行います。

<完成時の Game ビュー画像>




<新しく学習する内容>
 ・ExecuteAlways 属性(旧 ExecuteInEditMode 属性)
 ・MonoBehaviour クラスのコールバック・メソッド



設計


 ミニマップを画面内の邪魔にならない位置に表示し、ゲーム画面を上空から俯瞰して見えるようにする機能を実装します。
 
 今回の手順ではカメラに映ったゲーム画面を加工し、それを UI に表示するための制御処理の実装を行います。

 こちらのサイトを参考にしております。
https://qiita.com/CdecPGL/items/ce0b5c16caecd624d2...



シェーダーの作成


 こちらのサイトを参考にしております。
https://qiita.com/CdecPGL/items/ce0b5c16caecd624d2...



 MinimapCamera によって描画されたゲーム画面をそのまま利用するのではなく、
シェーダーを利用して加工し、その情報をマテリアルに書き込み、それをミニマップとして利用します。


 任意のフォルダ内で Create => Shader => Standard Surface Shader を選択します。
ファイルの名称を Minimap に変更してダブルクリックし、編集します。


Minimap.shader

<= クリックすると開きます



MinimapMaterial


 ミニマップを描画する際に、専用のマテリアルを利用することにより、カメラに映った画像をそのまま MinimapRenderTexture に投影するのではなく、
画像を加工したものをミニマップとして利用させます。

 任意のフォルダ内で Create => Material を選択して、新しいマテリアルを作成します。
名前を MinimapMaterial に変更します。

 インスペクターの最上段にある Shader の設定を、先ほど作成した Custom/Minimap に設定してください。






MinimapCamera スクリプトを作成する


 カメラ(今回であれば MinimapCamera ゲームオブジェクトの Camera) が描画したゲーム画面の情報を Minimap シェーダーを利用して、
加工してからマテリアルに書き込みを行います。
 
 常にミニマップの情報を書き換えていると処理がとても重くなるため、ゲーム開始時と、ミニマップの画像を更新したいタイミングでのみ
マテリアルへの書き込みを行うように制御することで、ゲーム内の描画負荷を軽減しています。

 こちらのサイトを参考にしております。
https://qiita.com/CdecPGL/items/ce0b5c16caecd624d2...


MinimapCamera.cs

<= クリックすると開きます



<ExecuteAlways 属性(旧 ExecuteInEditMode 属性)>


 Unity エディターの拡張機能の1つです。

 MonoBehaviour クラスを継承しているクラスに対して ExcuteAlways 属性の付与が行えます。

[ExecuteAlways]
public class MinimapCamera : MonoBehaviour
{


 ExcuteAlways 属性が付与されているクラスは、MonoBehaviour 実装されているコールバック・メソッドの処理を
エディターで編集中にも実行するようになります。よって、ゲームを再生してないときでも、コールバック・メソッドを自動的に実行してくれるようになります。
この機能は、Prefab モードにおいても実行されます。

 今回の場合では、OnEnable メソッド、OnRenderImage メソッドが該当しますので、これらのメソッドはゲームを実行していなくても実行されるようになります。
ゲームを実行していない状態でも、どのような挙動になるかを確認できるため、主にデバッグする目的に利用されます。


 なお、ExecuteInEditMode 属性も同じ機能を持っていますが、ExecuteInEditMode 属性は旧式であり、Prefab モードにも対応していません。
今後は廃止の予定ですので、ExecuteInEditMode 属性ではなく、ExcuteAlways 属性を利用するようにしてください。

 またデバッグが不要になったら、ExcuteAlways 属性をコメントアウトしておいても問題ありません。

 
参考サイト
Unity 公式スクリプトリファレンス
https://docs.unity3d.com/ScriptReference/ExecuteAl...
Qiita @okuhiiro(株式会社 gumi) 様
スクリプトを Edit モードで実行
https://qiita.com/okuhiiro/items/0121fc26c0b80a467...
Qiita @su10
【Unity】Inspectorから値を変更したときにコールバック処理を実行する簡単な方法【エディター拡張】
https://qiita.com/su10/items/35be3e8f323975800de8


<MonoBehaviour クラスのコールバック・メソッド>


 Unity の MonoBehaviour クラスには、所定の条件を満たした際に実行されるコールバック・メソッドが多数用意されています。
よく利用するものとしては、OnTrigger 〜 系や OnCollision 〜 系のメソッドです。

 MonoBehaviour クラス内においては、On 〜 の名称で始まるメソッドはすべてコールバック・メソッドになります。

 今回の実装では、OnEnable メソッドと OnRenderImage メソッドを利用しています。
こちらでは詳細な説明は割愛し、公式スクリプトリファレンスのみを記載しています。
是非、自分で調べて、どのような条件の際に起動し、どのような引数を利用できるのかを確認しておいてください。

 他も良記事がありますので、自分で検索してみて、理解を深めてみてください。

Unity 公式スクリプトリファレンス
OnEneble
https://docs.unity3d.com/ja/current/ScriptReferenc...
Unity 公式スクリプトリファレンス
OnRenderImage
https://docs.unity3d.com/ja/current/ScriptReferenc...


MinimapCamera ゲームオブジェクトにアタッチして設定を行う


 作成した MinimapCamera スクリプトを MinimapCamera ゲームオブジェクトにアタッチします。

 インスペクターを確認し、MinimapMaterial の変数には、作成した MinimapMaterial をドラッグアンドドロップしてアサインしてください。





ゲームを実行して動作を確認する


 以上で完成です。

 MinimapCamera スクリプトには ExecuteAlways 属性がアタッチされていますので、
ゲームを実行していなくても、各コールバック・メソッドが実行されて、マテリアルに加工された情報が書き込まれて、
それを RawImage が表示することで、ゲーム画面に加工された状態のミニマップが表示されます。

 その後、実際にゲームを実行し、そのまま同じように加工されたミニマップが画面に表示されるかを確認します。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます