Unity 全局屏幕点击特效
思路:
1、生成一个点击特效实例,每点击屏幕,就调整特效实例的位置并控制特效的显隐状态即可。
2、需要注意要保证在编辑器开发时或手机上运行时都要显示点击效果。
方案一 (推荐)
using UnityEngine;
using UnityEngine.EventSystems;
public class ScreenClick : MonoBehaviour,IPointerDownHandler
{
public GameObject effectPrefab;//特效预制体
private GameObject clickEffectInstance;
private RectTransform _Rect;
void Start()
{
_Rect = GetComponent<RectTransform>();
clickEffectInstance = Instantiate(effectPrefab, transform);
clickEffectInstance.SetActive(false);
}
public void OnPointerDown(PointerEventData eventData)
{
clickEffectInstance.SetActive(false);
RectTransformUtility.ScreenPointToWorldPointInRectangle(_Rect,eventData.position,eventData.enterEventCamera,out Vector3 pos);
clickEffectInstance.transform.position = pos;
clickEffectInstance.SetActive(true);
}
}
方案二
using UnityEngine;
public class ScreenClick : MonoBehaviour
{
public GameObject effectPrefab;//特效预制体
public Camera _Camera;
private GameObject clickEffectInstance;
private RectTransform _Rect;
void Start()
{
_Rect = GetComponent<RectTransform>();
clickEffectInstance = Instantiate(effectPrefab, transform);
clickEffectInstance.SetActive(false);
}
void Update()
{
#if UNITY_EDITOR
if (Input.GetKeyDown(KeyCode.Mouse0))
{
clickEffectInstance.SetActive(false);
var screenPos = Input.mousePosition;
ShowClickEffect(screenPos);
Debug.Log("222");
}
#elif UNITY_ANDROID||UNITY_IOS
if (Input.touchCount > 0)
{
var touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
clickEffectInstance.SetActive(false);
var screenPos = Input.GetTouch(0).position;
ShowClickEffect(screenPos);
Debug.Log("333");
}
}
#endif
}
/// <summary>
/// 显示点击特效
/// </summary>
/// <param name="screenPos">点击的屏幕位置</param>
private void ShowClickEffect(Vector2 screenPos)
{
RectTransformUtility.ScreenPointToWorldPointInRectangle(_Rect, screenPos, _Camera, out Vector3 pos);
clickEffectInstance.transform.position = pos;
clickEffectInstance.SetActive(true);
}
}