1. Qiita
  2. 投稿
  3. Unity

【Unity拡張】ゲーム再生中に値の変更を禁止するAttributeを作ってみた

  • 3
    いいね
  • 0
    コメント

はじめに

「ゲーム停止中はインスペクターから値を変更したいけど、再生中には変更を禁止させたいなぁ」
と思ったので、エディタ再生中に値の入力を禁止させるAttributeを作ってみました。

本記事のUnityのバージョンは Unity5.5.0b7 です

前提 - Attribute(属性)について

Unityでは変数にSerializeField属性をつけるとInspector上から数値を入力できるようになります。

NewBehaviourScript.cs
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    [SerializeField]
    private int x;
}

image

今回作ったものについて

今回はConstantFieldというAttributeを作ってみました。

以下のように使います。

NewBehaviourScript.cs
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    [ConstantField]
    [SerializeField]
    private int x;
}

これを使うとエディタ停止中は通常通り入力ができて、
image

エディタ再生中には値の編集ができなくなります。
image



以上でConstantFieldについての解説は終わりです。

ソースコード

以下のスクリプトをプロジェクトに入れてください

ConstantFieldAttribute.cs
using UnityEngine;

/// <summary>
/// エディター再生時に値の変更を禁止するAttribute
/// </summary>
public class ConstantFieldAttribute : PropertyAttribute
{
}

以下のスクリプトをプロジェクトのEditorフォルダ以下に入れてください

ConstantFieldDrawer.cs
using UnityEngine;
using UnityEditor;

/// <summary>
/// ConstantField属性の描画を行うクラス
/// </summary>
[CustomPropertyDrawer(typeof(ConstantFieldAttribute))]
public class ConstantFieldDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        label.text += " (Constant)";
        EditorGUI.BeginDisabledGroup(EditorApplication.isPlaying);
        EditorGUI.PropertyField(position, property, label);
        EditorGUI.EndDisabledGroup();
    }
}

この二つのスクリプトをプロジェクトに入れれば、ConstantFieldが使えるようになります。(完)

参考URL

自分だけのPropertyDrawerを作ろう!
http://qiita.com/kyusyukeigo/items/8be4cdef97496a68a39d