AudioSource在场景上,clip在asset文件中
对Button组件进行封装
using UnityEditor; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class GButton: Button { [SerializeField] private bool sound = true; [SerializeField] private AudioClip clickEff; [SerializeField] private AudioSource clickAudio; protected override void Awake() { base.Awake(); this.clickEff = AssetDatabase.LoadAssetAtPath<AudioClip>("Assets/.../xx.mp3"); } public override void OnPointerClick(PointerEventData eventData) { base.OnPointerClick(eventData); this.clickAudio = GameObject.Find("/.../SFX").GetComponent<AudioSource>(); if (sound && clickEff != null) { this.clickAudio.PlayOneShot(clickEff); } } }
自定义编辑器类
using UnityEditor; [CustomEditor(typeof(GButton))] public class GButtonEditor : UnityEditor.UI.ButtonEditor { GButton gButton; protected override void OnEnable() { base.OnEnable(); this.gButton = (GButton)target; } public override void OnInspectorGUI() { base.OnInspectorGUI(); EditorGUILayout.Space(); serializedObject.Update(); var prop_Sound = this.serializedObject.FindProperty("sound"); EditorGUILayout.PropertyField(prop_Sound); if (prop_Sound.boolValue) { EditorGUILayout.PropertyField(this.serializedObject.FindProperty("clickEff")); EditorGUILayout.PropertyField(this.serializedObject.FindProperty("clickAudio")); } this.serializedObject.ApplyModifiedProperties(); } }