一、需求
可交互的物体,当光标进入该物体的时候,发出一个回应的响声,用以提醒用户,这是一个可交互的元素。
二、实现原理
1、组件配置:
GameObject类型 | Collider组件 | EventTrigger组件 |
Button | 不需要 | 需要 |
3D object | 添加MeshCollider | 需要 |
2、事件添加:
gameobject.GetComponent<EventTrigger>().AddListener(EventTriggerType.PointerEnter, (PointerEventData eventData) =>
{
Debug.Log("播放进入的声音!");
//todo
});
三、脚本设置
四、代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using Cysharp.Threading.Tasks;
/// <summary>
/// 光标进入可交互【按钮】或者【物体】的时候,出现一个清脆的响声
/// </summary>
[RequireComponent(typeof(AudioSource))]
public class PointerEnterAudio : MonoBehaviour
{
/// <summary>
/// 光标进入按钮的声音
/// </summary>
[SerializeField]
[Header("光标进入按钮的声音")]
public AudioClip myAudio;
/// <summary>
/// 需要增加声音的物体
/// </summary>
[Header("需要增加声音的物体")]
public List<GameObject> myObjects = new List<GameObject>();
/// <summary>
/// AudioSource组件
/// </summary>
private AudioSource audioSource;
/// <summary>
/// 当前获取焦点
/// </summary>
private bool isFocus;
private void Awake()
{
audioSource = this.GetComponent<AudioSource>();
}
// Start is called before the first frame update
void Start()
{
#region ======代码绑定初始化======begin
myObjects.ForEach(x =>
{
//EventTrigger组件添加
if (!x.GetComponent<EventTrigger>()) x.AddComponent<EventTrigger>();
if (x.GetComponent<Button>()) //按钮
{
//不加碰撞器
}
else //非按钮,maybe 3D or other GUI
{
if (x.GetComponent<Collider>())
{
x.AddComponent<MeshCollider>();
}
}
bool isPlaying = false;
//光标进入的事件绑定
x.GetComponent<EventTrigger>().AddListener(EventTriggerType.PointerEnter, async (PointerEventData eventData) =>
{
if (!isFocus && !isPlaying)
{
audioSource.clip = myAudio;
audioSource.Play();
isPlaying = true;
await UniTask.Delay(System.TimeSpan.FromSeconds(myAudio.length),cancellationToken:this.GetCancellationTokenOnDestroy());
Debug.Log("播放进入的声音!");
isPlaying = false;
}
else
{
isFocus = true;
}
});
//光标退出的事件绑定
x.GetComponent<EventTrigger>().AddListener(EventTriggerType.PointerExit, (PointerEventData eventData) =>
{
isFocus = false;
});
});
#endregion ======代码绑定初始化======end
}
}