继承重写UGUI的组件很简单以Button为例子
首先在Unity的Project面板上创建一个新文件夹Scripts,在该文件夹下创建一个新的脚本,我的命名是ButtonEx,
脚本代码如下:
using UnityEngine.EventSystems;
namespace UnityEngine.UI
{
public class ButtonEx : Button
{
[SerializeField] public string music = "click";
public override void OnPointerClick(PointerEventData eventData)
{
if (eventData.button != PointerEventData.InputButton.Left)
return;
if (!IsActive())
return;
UISystemProfilerApi.AddMarker("Button.onClick", this);
onClick.Invoke();
// 播放音乐
//MusicManager.GetInstance().PlaySoundEffect(music);
}
}
}
这样就继承了Button组件 可以自己添加新的字段。
但是添加字段后会发现无论是访问级别是 public 还是 添加[SerializeField] 都不会显示在unity的Inspector面板上
原来是因为 每个UGUI组件的脚本都有对应的Editor脚本负责显示这些字段。
所以我们可以通过重写对应的Editor脚本的方式去让我们新创建的字段显示出来。
我们要创建一个新的脚本MyButtonEditor继承ButtonEditor
注意:这是一个编辑器类,如果想要使用它必须要把它放到工程目录下的Editor文件夹下
PS:Editor文件夹可以存在在根目录下,也可以存在于子目录下 只要他的名字是Editor。存放于Editor文件夹下的资源只在编辑器下可以使用,打包发布时不会一同发布。
所以在这里我在根目录下创建了一个Editor文件夹并新建MyButtonEditor脚本
脚本代码如下:
using UnityEditor;//编辑器类在UnityEditor命名空间下。所以当使用C#脚本时,你需要在脚本前面加上 "using UnityEditor"引用。
using UnityEditor.UI;//ButtonEditor位于此命名空间下
using UnityEngine.UI;
//指定我们要自定义编辑器的脚本
[CustomEditor(typeof(ButtonEx), true)]
//使用了 SerializedObject 和 SerializedProperty 系统,因此,可以自动处理“多对象编辑”,“撤销undo” 和 “预制覆盖prefab override”。
[CanEditMultipleObjects]
public class ButtonExEditor : ButtonEditor
{
//对应我们在MyButton中创建的字段
//PS:需要注意一点,使用SerializedProperty 必须在MyButton类_newNumber字段前加[SerializeField]
private SerializedProperty _addValue;// 添加变量
protected override void OnEnable()
{
base.OnEnable();
_addValue = serializedObject.FindProperty("music");
}
//并且特别注意,如果用这种序列化方式,需要在 OnInspectorGUI 开头和结尾各加一句 serializedObject.Update(); serializedObject.ApplyModifiedProperties();
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.Space();//空行
serializedObject.Update();
EditorGUILayout.PropertyField(_addValue);//显示我们创建的属性
serializedObject.ApplyModifiedProperties();
}
}
现在就可以显示我们自己创建的属性了,,,至于buttonex的应用,这这里。https://blog.csdn.net/lihui061119/article/details/116299585?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162125744216780262579484%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=162125744216780262579484&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-116299585.nonecase&utm_term=buttonex&spm=1018.2226.3001.4450
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL1UEVNhXWE1EcWhUYwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0czNzATNxEjM3ETNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)