前言:转载注明出处,不然一辈子吃不上4个菜
脚本挂在那个物体上 就从那个物体的正前方添加射线,
实现的功能点: 射线的进入退出, 鼠标抬起和按下 鼠标点击
需要自己添加一个材质球和一个父节点 如图
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
// 点击: 添加Collider 和button;
// 拖拽: 添加 Collider
public class RayEvent : MonoBehaviour
{
//射线获取的物体
GameObject currentObj;
//上一个物体
GameObject LastObj;
// 用来保存当前物体
GameObject SaveCueerntObj;
//物体原本的父物体
public Transform StartPoint;
//射线的材质球
public Material material;
//按钮的点击事件
PointerEventData data;
//射线组件
LineRenderer lineRenderer;
//初始化
void Start()
{
LastObj = null;
//指针点击数据
data = new PointerEventData(EventSystem.current);
//添加射线组件
lineRenderer = gameObject.AddComponent<LineRenderer>();
//如果材质球不为空
if (material)
lineRenderer.material = material; //添加材质球
lineRenderer.startWidth = 0.01f; //射线起始长度
lineRenderer.endWidth = 0.01f; //射线结束长度
}
private void Update()
{
Radiographic();
}
/// <summary>
/// 射线检测
/// </summary>
public void Radiographic()
{
//射线的起始点,方向,长度
Ray ray = new Ray(transform.position, transform.forward * 1000);
//显示射线
Vector3[] vector3s = new Vector3[] { transform.position, transform.forward * 1000f };
//射线碰到的物体返回的信息
RaycastHit hit;
//射线
Physics.Raycast(ray, out hit);
if (hit.collider != null) //碰到了物体
{
currentObj = hit.collider.gameObject;
SaveCueerntObj = currentObj;
//保存碰到物体的坐标
vector3s[1] = hit.point;
// 射线材质球的颜色
lineRenderer.material.color = Color.green;
//按下鼠标
if (Input.GetMouseButtonDown(0))
{
//当前物体不为空
if (currentObj != null)
{ //如果当前物体有button组件
if (currentObj.GetComponent<Button>() != null) //点击
{
//执行指针点击事件
ExecuteEvents.Execute<IPointerClickHandler>(currentObj, data, ExecuteEvents.pointerClickHandler);
}
else //拖拽
{
//设置父节点
currentObj.transform.parent = transform;
}
}
}
//鼠标抬起
if (Input.GetMouseButtonUp(0))
{
//执行指针抬起事件
ExecuteEvents.Execute<IPointerUpHandler>(currentObj, data, ExecuteEvents.pointerUpHandler);
if (currentObj == null) // 当前物体为空 返回
return;
if (currentObj.GetComponent<Button>() != null) //当前物体有 Button组件
{
currentObj = null; //当前物体为空
return;
}
else
{
currentObj.transform.parent = StartPoint; //设置父节点
}
}
}
else
{ //射线颜色为红色
lineRenderer.material.color = Color.red;
SaveCueerntObj = null;
}
//进入退出事件
RayEntryAndExit();
//设置射线的长度。位子。
lineRenderer.SetPositions(vector3s);
}
void RayEntryAndExit()
{
if (!SaveCueerntObj) //退出
{
if (LastObj)
{
ExecuteEvents.Execute<IPointerExitHandler>(currentObj, data, ExecuteEvents.pointerExitHandler);
LastObj = null;
}
}
if (!LastObj) //进入
{
if (SaveCueerntObj)
{
ExecuteEvents.Execute<IPointerEnterHandler>(currentObj, data, ExecuteEvents.pointerEnterHandler);
LastObj = SaveCueerntObj;
}
}
}
}