需求
想拓展一下UGUI的Button,找了几个帖子,只是能实现功能,但是用起来总有些不尽人意的地方,想办法处理一下
实现
1.创建继承自Button的类
using UnityEngine;
using UnityEngine.UI;
public class CustomButton : Button
{
[SerializeField] public int audioKey = -1;
protected override void Start()
{
base.Start();
onClick.AddListener(PlaySound);
}
private void PlaySound()
{
if (audioKey != -1)
{
// AudioManager.Instance.PlaySound(audioKey);
}
}
}
这里只临时做一丢丢功能示例,我们预期的是上面代码中的属性在Inspector中显示出来,然而并没有

2.处理Inspector 显示问题
using UnityEditor;
[CustomEditor(typeof(CustomButton))]
public class CustomButtonEditor : UnityEditor.UI.ButtonEditor
{
public override void OnInspectorGUI()
{
var btn = (CustomButton)target;
btn.audioKey = EditorGUILayout.IntField("Audio Key", btn.audioKey);
base.OnInspectorGUI();
}
}
如图,属性已经能正确显示

目前只能通过AddComponent的方式创建,我们预期的是和unity 自带的Button一样的创建方式
注意:editor脚本继承自对应组件的Editor,如上面Button的,继承自 UnityEditor.UI.ButtonEditor
,否则Inspector显示可能出现问题
3.处理在prafab中和hierarchy中创建按钮
- 整理一下Button的使用体验
- 1. 右键创建
- 2. 自动挂载Image,用于接收raycast
- 3. 自动挂载text显示文案
- 4. 创建节点时,需要区分是否是编辑prefab模式,是否有选中的父节点,确定生成节点的位置
- 5. 创建节点时,需要区分是否在canvas下等情况,是否需要生成canvas
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
public class CustomUI : Editor
{
[MenuItem("GameObject/UI/CustomButton")]
public static void CreateCustomButton()
{
//创建按钮
var btn = ObjectFactory.CreateGameObject("CustomButton");
ObjectFactory.AddComponent<RectTransform>(btn);
var img = ObjectFactory.AddComponent<Image>