using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class TestRenderTexture : MonoBehaviour
{
// 点击RawImage时,相对RawImage自身的坐标
private Vector2 ClickPosInRawImg;
// 画布
public Canvas Canvas;
// 预览映射相机
public Camera PreviewCamera;
public RawImage PreviewImage;
public Camera UiCamera;
private Vector3 MousePos;
[Header("课程相关")]
public Animator leftDoor;
public Animator rightDoor;
void Start() { }
void Update()
{
if (Input.GetMouseButtonDown(0))
{
MousePos = Input.mousePosition;
}
if (MousePos != null)
{
CheckDrawRayLine(Canvas, Input.mousePosition, PreviewImage, PreviewCamera);
}
}
///
/// 射线投射
///
/// 画布
/// 当前Canvas下点击的鼠标位置
/// 预览图
/// 预览映射图的摄像机
void CheckDrawRayLine(Canvas canvas, Vector3 mousePosition, RawImage previewImage, Camera previewCamera)
{
// 将UI相机下点击的UI坐标转为相对RawImage的坐标
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(PreviewImage.GetComponent(), mousePosition, UiCamera, out ClickPosInRawImg))
{
// Lylibs.MessageUtil.Show("坐标:x=" + ClickPosInRawImg.x + ",y=" + ClickPosInRawImg.y);
// Debug.Log("坐标:x=" + ClickPosInRawImg.x + ",y=" + ClickPosInRawImg.y);
//获取预览图的长宽
float imageWidth = previewImage.rectTransform.rect.width;
float imageHeight = previewImage.rectTransform.rect.height;
//获取预览图的坐标,此处RawImage的Pivot需为(0,0),不然自己再换算下
float localPositionX = previewImage.rectTransform.localPosition.x;//
float localPositionY = previewImage.rectTransform.localPosition.y;
localPositionX = 0f;
localPositionY = 0;
//获取在预览映射相机viewport内的坐标(坐标比例)
float p_x = (ClickPosInRawImg.x - localPositionX) / imageWidth;
float p_y = (ClickPosInRawImg.y - localPositionY) / imageHeight;
//从视口坐标发射线
Ray p_ray = previewCamera.ViewportPointToRay(new Vector2(p_x, p_y));
RaycastHit p_hitInfo;
if (Input.GetMouseButtonDown(0))
{
if (Physics.Raycast(p_ray, out p_hitInfo))
{
//显示射线,只有在scene视图中才能看到
Debug.DrawLine(p_ray.origin, p_hitInfo.point);
Debug.Log(p_hitInfo.transform.name);
if (p_hitInfo.transform.gameObject.name == "Open")
{
Debug.Log("开门");
leftDoor.transform.DOLocalRotate(new Vector3(0, -15, 0), 2f);
rightDoor.transform.DOLocalRotate(new Vector3(0, 15, 0), 2f);
}
if (p_hitInfo.transform.gameObject.name == "Close")
{
Debug.Log("关门");
leftDoor.transform.DOLocalRotate(new Vector3(0, -98, 0), 2f);
rightDoor.transform.DOLocalRotate(new Vector3(0, 105, 0), 2f);
}
}
}
Debug.DrawRay(previewCamera.transform.position, p_ray.direction);
}
}
}