LoginSignup
7
4

More than 1 year has passed since last update.

[Unity]Reset()を使いこなしてアタッチ漏れをなくす

Posted at

Reset()を使いこなそう

Unityを使用して開発を行うプログラマ向けの内容です。

Unityを使っていて一番無駄な行為、それは 「アタッチ漏れによる起動のやり直し」 です。

GameObjectに追加したスクリプトのSerializeFieldへのアタッチ漏れが発生する機会は多々あります。

全体の構造として複雑になればなるほど、
構造を理解して適切なComponentをアタッチする必要があり
開発者が人間である以上、アタッチ漏れは発生します。

そのようなアタッチ漏れのリスクを可能なかぎり下げてくれるメソッド、
それが MonoBehaviour.Reset() です。

Reset()とは

Resetメソッドを一言でいうと
「GameObjectにスクリプトを追加したときに自動で行われる処理」です。

つまりこのメソッドを駆使すれば、
追加したスクリプトがInspector上に表示されたときから
SerializeFieldが既にアタッチされているようになり、
アタッチ漏れの起きようがない状況を作り出すことができます‼

使い方

Resetメソッドの使い方は簡単です。
MonoBehaviourを継承したクラス内でResetメソッドを定義し、行いたい処理を書き込むだけです。
今回で言えば、アタッチしたいSerializeFieldをメソッド内で指定してあげます。

例えば、ビデオ再生を行う VideoPlayer とそれを受け取る RawImage
RequireComponentを用いて同オブジェクト内で管理するクラスを以下のように記載するとします。

Sample.cs
[RequireComponent(typeof(RawImage), typeof(VideoPlayer))]
    public class SampleBehaviourScript : MonoBehaviour
    {
        [SerializeField]
        private VideoPlayer videoPlayer = null;

        [SerializeField]
        private RawImage rawImage = null;

        private void Reset()
        {
            videoPlayer = GetComponent<VideoPlayer>();

            rawImage = GetComponent<RawImage>();
        }
    }

上記のようにResetメソッドで必要なSerializeFieldを指定したスクリプトを
Add Componentするだけで
対象のSerializeFieldが既にアタッチされた状態になります!!

Animation.gif

ちなみに...対象のComponentのResetメソッドを意図的に呼びたい場合は
右上のコンテキストメニューから[Reset]を選択すれば再度自動で反映されます。

最後に

今回はResetメソッドを使って「アタッチ漏れ」を減らす方法について紹介しました。

活用方法を工夫すれば更に効率的に開発できそうですね!!

参考

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4