项目要求在renderTexture中选择3D模型中的点,并在点处画一个球形,在网上搜索到大神的写法[https://blog.csdn.net/zhaojunkuan/article/details/113344129?spm=1001.2014.3001.5502],是利用重写RawImage来实现的,由于我不知道重写是的RawImage怎么加载到unity项目中,所以我对代码进行了修改,把修改的脚本作为场景中现有RawImage的组件来实现功能
using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class LyRawImage1 : MonoBehaviour,IPointerClickHandler
{
// 点击RawImage时,相对RawImage自身的坐标
private Vector2 ClickPosInRawImg;
// 预览映射相机
private Camera PreviewCamera;
private Canvas canvasa;
private RawImage image;
private void Start()
{
// 初始获取预览映射相机
if (PreviewCamera == null)
{
//获取相机对象
PreviewCamera = GameObject.Find("PreviewCamera").transform.GetComponent<Camera>();
}
if (canvasa == null)
{
//获取画布对象
canvasa = GameObject.Find("Canvas").transform.GetComponent<Canvas>();
}
//定义界面中的RawImage
image = GameObject.Find("RawImage").transform.GetComponent<RawImage>();
}
//IPointerClickHandler Called when a pointer is pressed and released on the same object
void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
{
GetRawImageObj(eventData, image.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;
var objCube = GameObject.CreatePrimitive(PrimitiveType.Sphere);//类型
objCube.transform.position = raycastHit.point;
}
return obj;
}
#endregion
}