MRが楽しい

MRやVRについて学習したことを書き残す

Unityで編集(Editor)モードでもスクリプトのライフサイクル関数を実行する

本日はUnityの小ネタ枠です。
Unityで編集(Editor)モードでもスクリプトのライフサイクル関数を実行する方法についてです。

ExecuteAlways

ExecuteAlways属性をクラスに設定するとスクリプトが編集モードと再生モード時の両方で実行されるようになります。
docs.unity3d.com

スクリプトが現在、編集モードで実行されているか再生モードで実行されているか確認したい場合はApplication.IsPlayingを参照して判別することが可能です。
docs.unity3d.com

サンプルスクリプト

編集モードと再生モードにおけるStart,Updateのライフサイクルで異なるデバッグログを出力するサンプルスクリプトを作成しました。
・ExecuteAlwaysTest.cs

using UnityEngine;

[ExecuteAlways]
public class ExecuteAlwaysTest : MonoBehaviour
{
    void Start()
    {
        if (Application.IsPlaying(gameObject))
        {
            Debug.Log("ExecuteAlwaysTest Start In Playing");
        }
        else
        {
            Debug.Log("ExecuteAlwaysTest Start In Editor");
        }
    }

    void Update()
    {
        if (Application.IsPlaying(gameObject))
        {
            Debug.Log("ExecuteAlwaysTest Update In Playing");
        }
        else
        {
            Debug.Log("ExecuteAlwaysTest Update In Editor");
        }
    }
}

以下の通り、編集モードと再生モードの両方でスクリプトが動作し、デバッグログが出力されます。
なお編集モードにおけるUpdateのタイミングは再生モードと異なり、エディター上で何かしらの操作が行われたタイミングで呼び出されます。

TortoiseGitとGitHubのSSH接続の認証を設定する

本日はTortoiseGitとGitHubの小ネタ枠です。
TortoiseGitとGitHubSSH接続の認証を設定する手順を記事にします。

SSH秘密鍵と公開鍵の作成

初めにSSH秘密鍵と公開鍵を作成します。
今回はPuTTYgenを使って作成を行いました。

PuTTYgenを起動し、[Generate]ボタンで鍵の作成を開始します。

生成中、ランダムの乱数を設定するためマウスを適当に動かす必要があります。

作成が完了すると[Public key...]の欄に公開鍵が表示されます。
秘密鍵は[Save private key]をクリックして任意のフォルダにファイル出力します。

GitHubへの公開鍵の登録

GitHub にログインして[Settings]ページを開きます。

[SSH and GPG keys]タブを開きます。

[New SSH Key]ボタンをクリックします。

公開鍵の入力ページが表示されるので、[Title]に鍵の名称を、[Key]に公開鍵のテキストを入力します。
[Add SSH Key]ボタンで登録を実行します。

これで公開鍵の登録は完了です。

TortoiseGitへの秘密鍵の登録

次にTortoiseGitに秘密鍵を登録します。
Git Cloneのダイアログで[Load Putty Key]の項目に秘密鍵の参照を追加します。

PuTTYgenの[Save private key]でファイル出力した秘密鍵への参照を指定して設定完了です。

Windows11環境で右クリックからTortoiseGitの全てのメニューを表示する

本日はWindowsとTortoiseGitの小ネタ枠です。
Windows11環境で右クリックからTortoiseGitの全てのメニューを表示する方法についてです。

Windows11環境の右クリックメニュー

最新のWindows11環境ではエクスプローラ上の右クリックで表示されるメニューがカテゴリ表示になります。
このため、通常の右クリック操作ではTortoiseGitの[Add]や[Rename]といったコマンドの選択欄が表示されなくなっています。

Windows10以前と同様の操作メニューを表示したい場合はShift+右クリックでメニューを表示します。
これでTortoiseGitの全てのメニューを表示できます。

Unityで同じオブジェクトに同一のスクリプトを複数設定できないようにする

本日はUnityの小ネタ枠です。
Unityで同じオブジェクトに同一のスクリプトを複数設定できないようにする方法についてです。

DisallowMultipleComponent

DisallowMultipleComponent属性を利用すると同じオブジェクトに2つ以上同一のコンポーネントを設定できないようにします。
docs.unity3d.com

以下のRequireComponentとReset関数の組み合わせで特定のコンポーネントの参照を設定したい場合などに役立ちます。
bluebirdofoz.hatenablog.com

サンプルスクリプト

サンプルスクリプトを作成しました。以下の通りクラスにDisallowMultipleComponent属性を記述して利用します。
・DisallowMultipleTest.cs

using UnityEngine;

[DisallowMultipleComponent]
public class DisallowMultipleTest : MonoBehaviour
{
    void Start()
    {
        Debug.Log("DisallowMultipleTest Start");
    }
}

同じオブジェクトに同一のコンポーネントを設定しようとすると以下のメッセージが表示されて追加できないようになります。

Can't add (Script) to (Object)
because a (Script) is already added to the game object!

UnityのInspectorでEnum値の選択値を一部表示しない

本日はUnityの小ネタ枠です。
UnityのInspectorでEnum値の選択値を一部表示しない方法についてです。

InspectorNameAttribute

Enum型でInspectorNameAttribute属性を使用するとInspectorに表示される項目名を変更できます。
空文字を指定することで項目自体を非表示にすることもできます。
docs.unity3d.com

サンプルスクリプト

Enum値の項目名を一部変更、非表示にした以下のサンプルスクリプトを作成しました。
・SampleEnumType.cs

using UnityEngine;

public class InspectorNameTest : MonoBehaviour
{
    private enum SampleEnumType
    {
        None,
        [InspectorName( "初版" )] // Inspectorの表示名を指定
        Alpha,
        [InspectorName( "第二版" )] // Inspectorの表示名を指定
        Beta,
        [InspectorName( "" )] // 本項目はInspectorから指定できない
        Gamma,
    }
    
    [SerializeField]
    private SampleEnumType sampleType = SampleEnumType.Alpha;
}

Inspector上で確認すると、項目名が以下の通り表示されます。

Unityのスクリプトにアイコンを設定する

本日はUnityの小ネタ枠です。
Unityのスクリプトにアイコンを設定する方法についてです。

IconAttribute

クラスにIconAttribute属性を設定して、UnityEditor上で表示される各種アイコンを指定できます。
docs.unity3d.com

サンプルコード

作成したスクリプトはデフォルトで以下のようなアイコンが表示されます。

スクリプトのコードにIconAttributeを追加し、以下の通り変更しました。
・IconTest.cs

using UnityEngine;

[Icon( "Assets/Sandbox/InspectorTest/Icon/HoloMon_400x400.jpg" )]
public class IconTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

ProjectフォルダやInspcetorビューなどのアイコンが指定した画像ファイルで表示されるようになります。

また、IconAttributeはMonoBehaviourなどを継承しない純粋なクラスでも利用できます。
・PlaneIconTest.cs

using UnityEngine;

[Icon( "Assets/Sandbox/InspectorTest/Icon/HoloMon_400x400.jpg" )]
public class PlaneIconTest
{
}

UnityのInspectorビューのフィールド入力をエンターキーを入力したタイミングで確定させる

本日はUnityの小ネタ枠です。
UnityのInspectorビューのフィールド入力をエンターキーを入力したタイミングで確定させる方法です。

DelayedAttribute

DelayedAttributeを指定すると、float/int/string型のフィールドはエンターキーを押したとき、またはフィールドからフォーカスが離れた時に値が確定します。
docs.unity3d.com

OnValidate

OnValidate()関数はInspectorの値が変更されたタイミングで呼び出されます。
これを使ってDelayedAttributeを指定した場合と指定していない場合のフィールドの反映タイミングを確認してみます。
docs.unity3d.com

サンプルスクリプト

Delayed属性を付けたstringフィールドと付けていないフィールドを比較する以下のサンプルスクリプトを作成しました。
・DelayedTest.cs

using UnityEngine;

public class DelayedTest : MonoBehaviour
{
    [SerializeField]
    private string normalField = string.Empty;

    [SerializeField, Delayed]
    private string delayedField = string.Empty;

    void OnValidate()
    {
        Debug.Log($"normalField: {normalField}, delayedField: {delayedField}");
    }
}


Delayed属性を付けていないフィールド

abcdfという文字を入力する際、以下の通り一文字の入力ごとに値の更新が発生します。

Delayed属性を付けたフィールド

abcdfという文字を入力する際、以下の通りエンターキーで入力を確定したタイミングでのみ値の更新が発生します。