Unity中实现点选RenderTexture中的3D模型

重写RawImage,两种情况,一种是UI有专门的UI相机,一种是没有专门的UI相机

using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

namespace Lylibs
{
    public class LyRawImage : RawImage, IPointerClickHandler
    {
        // 点击RawImage时,相对RawImage自身的坐标
        private Vector2 ClickPosInRawImg;
        // 预览映射相机
        private Camera PreviewCamera;
        private Camera UICamera;
        private Canvas canvasa;
        protected override void Start()
        {
            // 初始获取预览映射相机
            if (PreviewCamera == null)
            {
                PreviewCamera = GameObject.Find("PreviewCamera").transform.GetComponent<Camera>();
            }
            if (UICamera == null)
            {
                UICamera = GameObject.Find("UICamera").transform.GetComponent<Camera>();
            }
            if (canvasa == null)
            {
                canvasa = GameObject.Find("Canvas").transform.GetComponent<Canvas>();
            }
        }
        void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
        {
            //GetRawImageObj(eventData, rectTransform, PreviewCamera);
            CheckDrawRayLine(canvasa, eventData.position, this, PreviewCamera, UICamera);
        }
        #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))
            {
                Debug.Log(raycastHit.transform.name);
                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);
                    // Debug.Log(p_hitInfo.transform.name);
                }
            }
        }
        #endregion
    }
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
要在Unity3D实现鼠标悬浮模型上显示文字,可以使用Unity的鼠标事件和UI系统来实现。 首先,在模型上添加一个Collider组件,以便能够检测到鼠标事件。然后,在模型上添加一个空的GameObject作为子对象,用于显示文本。 接下来,创建一个脚本并将其附加到模型的Collider上。在脚本,使用OnMouseEnter和OnMouseExit函数来检测鼠标进入和离开事件。当鼠标进入时,启用子对象,并将其位置设置为鼠标所在的位置。同时,将子对象的UI Text组件的文本内容设置为要显示的文字。当鼠标离开时,禁用子对象。 下面是一个示例代码: ```csharp using UnityEngine; using UnityEngine.UI; public class HoverText : MonoBehaviour { public string textToShow; private GameObject hoverTextObject; private Text hoverText; void Start() { hoverTextObject = transform.GetChild(0).gameObject; hoverText = hoverTextObject.GetComponent<Text>(); } void OnMouseEnter() { hoverTextObject.SetActive(true); hoverText.text = textToShow; hoverTextObject.transform.position = Input.mousePosition; } void OnMouseExit() { hoverTextObject.SetActive(false); } } ``` 在上面的代码,我们通过transform.GetChild(0)来获取子对象,并使用GetComponent()函数来获取UI Text组件。在OnMouseEnter函数,我们设置了文本和位置,并启用了子对象。在OnMouseExit函数,我们禁用了子对象。 注意,在使用此方法时,需要为UI Text组件设置字体、颜色、大小等属性,以便能够正常显示文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值