やりたいこと
ボタンがPress状態の時にハイライト画像を上から重ねたい
実装手法
Buttonの子オブジェクトにハイライトオブジェクトを配置し
Press時にアクティブに、離したときに非アクティブにする。
実装プログラム
Buttonを継承する
ハイライトオブジェクトを設定する
各イベントでハイライトのアクティブを切り替える
ButtonHighlight.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class ButtonHighlight : Button
{
// ハイライトオブジェクト
public GameObject highlight;
public override void OnPointerClick(PointerEventData eventData)
{
base.OnPointerClick(eventData);
if (highlight != null && highlight.activeSelf)
highlight.SetActive(false);
}
public override void OnPointerExit(PointerEventData eventData)
{
base.OnPointerExit(eventData);
if (highlight != null && highlight.activeSelf)
highlight.SetActive(false);
}
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
if (highlight != null && !highlight.activeSelf)
highlight.SetActive(true);
}
}
問題点
追加したGameObjectのhighlightの変数がインスペクター上に表示されない
コンポーネントを継承した場合、追加した変数はインスペクター上に表示されないらしい
解決方法
エディタ拡張を使い、強制的に変数を表示させる
Editorディレクトリに以下のスクリプトを入れる
ButtonHighlightEditor.cs
using UnityEngine;
using UnityEditor;
using UnityEditor.UI;
[CustomEditor(typeof(ButtonHighlight))]
public class ButtonHighlightEditor : ButtonEditor {
public override void OnInspectorGUI()
{
var bh= target as ButtonHighlight;
GUILayout.BeginHorizontal();
bh.highlight = EditorGUILayout.ObjectField("highlight", bh.highlight, typeof(GameObject), true) as GameObject;
GUILayout.EndHorizontal();
base.OnInspectorGUI();
}
}