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); } } }