Unity 三维模型点击
三维模型点击,可充当三维按钮使用
关键步骤
1、射线点击判断是否为自身
2、执行委托函数,用于外部监听
CS如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BtnOf3D : MonoBehaviour
{
private Ray ray;
private RaycastHit hit;
private Camera mainCamera;
public delegate void MouseClickAction();
private Vector3 initialMousePosition;
private bool isDragging = false;
/// <summary>
/// 订阅这个事件
/// </summary>
public event MouseClickAction OnMouseClick;
private void Start()
{
mainCamera = Camera.main;
}
private void Update()
{
RayOnMouseDown();
}
/// <summary>
/// 射线模拟鼠标点击自身,且不拖动
/// </summary>
private void RayOnMouseDown()
{
if (Input.GetMouseButtonDown(0))
{
// 记录初始鼠标位置
initialMousePosition = Input.mousePosition;
isDragging = false;
}
if (Input.GetMouseButton(0))
{
// 计算鼠标位置变化
Vector3 mousePositionDelta = Input.mousePosition - initialMousePosition;
// 判断是否发生了拖动
if (mousePositionDelta.sqrMagnitude > 5f) // 这里的5是一个阈值,你可以根据需要调整
{
isDragging = true;
}
}
if (Input.GetMouseButtonUp(0))
{
if (!isDragging)
{
ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
if (hit.collider.gameObject == gameObject)
{
// 触发事件
if (OnMouseClick != null)
{
OnMouseClick();
}
}
}
}
// 重置状态
isDragging = false;
}
}
}
使用示例如下
1、注意订阅事件的添加必须带有移除,防止内存泄漏
public class Test :MonoBehaviour
{
public BtnOf3D btn3D;
private void Start()
{
btn3D.OnMouseClick += Btn3DOnClick;
}
private void Btn3DOnClick()
{
Debug.Log("模型被点击");
}
private void OnDestroy()
{
btn3D.OnMouseClick -= Btn3DOnClick;
}
}