You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
3.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
}
/// <summary>
/// 射线投射
/// </summary>
/// <param name="canvas">画布</param>
/// <param name="mousePosition">当前Canvas下点击的鼠标位置</param>
/// <param name="previewImage">预览图</param>
/// <param name="previewCamera">预览映射图的摄像机</param>
void CheckDrawRayLine(Canvas canvas, Vector3 mousePosition, RawImage previewImage, Camera previewCamera)
{
// 将UI相机下点击的UI坐标转为相对RawImage的坐标
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(PreviewImage.GetComponent<RectTransform>(), 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);
}
}
}