Unity 点击RawImage 选择RenderTexture 映射的物体

Unity中实现点选RenderTexture中的3D模型_unity rendertexture raycast_一块儿腹肌的泰迪的博客-CSDN博客重写RawImageusing System;using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;namespace Lylibs{ public class LyRawImage : RawImage, IPointerClickHandler { // 预览映射相机 private Camera PreviewCamera;//RenderTexture_unity rendertexture raycasthttps://blog.csdn.net/zhaojunkuan/article/details/113344129重写RawImage,继承RawImage 和IPointerClickHandler

[SerializeField]
private Camera camPreview; // 预览映射相机
[SerializeField]
private Camera camUI;
private Canvas canvasP;
protected override void Start()
{
    if (canvasP == null)
    {
        canvasP = GetComponentInParent<Canvas>();
    }
}

void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
{
    CheckDrawRayLine(canvasP, eventData.position, this, camPreview, camUI);
}

#region UI不绑定相机
/// <summary>
/// 通过点击RawImage中映射的RenderTexture画面,对应的相机发射射线,得到物体
/// </summary>
/// <param name="data">rawimage点击的数据</param>
/// <param name="rawImgRectTransform">rawimage的recttransfotm</param>
/// <param name="previewCamera">生成rendertexture中画面的相机</param>
/// <returns>返回射线碰撞到的物体</returns>
private GameObject GetRawImageObj(PointerEventData data, RectTransform rawImgRectTransform, Camera previewCamera)
{
    GameObject obj = null;
    var pos = (data.position - (Vector2)rawImgRectTransform.position) / rawImgRectTransform.lossyScale - rawImgRectTransform.rect.position;
    var rate = pos / rawImgRectTransform.rect.size;
    var ray = previewCamera.ViewportPointToRay(rate);
    RaycastHit raycastHit;
    if (Physics.Raycast(ray, out raycastHit))
    {
        obj = raycastHit.transform.gameObject;
    }
    return obj;
}
#endregion

#region UI有专门的UI相机
/// <summary>
/// 射线投射
/// </summary>
/// <param name="canvas">画布</param>
/// <param name="mousePosition">当前Canvas下点击的鼠标位置</param>
/// <param name="previewImage">预览图</param>
/// <param name="previewCamera">预览映射图的摄像机</param>
private void CheckDrawRayLine(Canvas canvas, Vector3 mousePosition, RawImage previewImage, Camera previewCamera, Camera UiCamera)
{
    Vector2 ClickPosInRawImg;
    // 将UI相机下点击的UI坐标转为相对RawImage的坐标
    if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, mousePosition, UiCamera, out ClickPosInRawImg))
    {
        //获取预览图的长宽
        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;

        //获取在预览映射相机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 (Physics.Raycast(p_ray, out p_hitInfo))
        {
            //显示射线,只有在scene视图中才能看到
            Debug.DrawLine(p_ray.origin, p_hitInfo.point);
        }
    }
}
#endregion

*若不使用IPointerClickHandler 接口,可使用(Vector2)Input.mousePosition 获取鼠标位置信息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值