Unity中使用RawImage和RenderTexture在UI界面上投影其他相机拍摄的内容,并实现控制投影在RawImage中摄像机的移动

这篇博客介绍了如何在Unity中利用RenderTexture和RawImage组件,将一个摄像机捕捉的内容投影到UI界面,并且详细阐述了如何设置和控制投影在RawImage上的摄像机进行移动,包括物体跟随运动和摄像机围绕特定点旋转的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

a.单纯的用小窗显示物体

个人认为所谓的 “ 物体A跟随物体B运动 ” 表现为:二者表现为运动(平移、旋转)方向,速度在任何时刻表现一致。

1.在Project界面创建RenderTexture

在这里插入图片描述

2.在Hierarchy界面创建RawImage

在这里插入图片描述

3.选中第二个摄像机,将New Render Texture挂载上

在这里插入图片描述

4.选中RawImage,将New Render Texture挂载上

在这里插入图片描述
最终效果如下图所示
在这里插入图片描述

b.当小窗显示时,可以控制小窗移动

场景中有两个摄像机,分别挂在不同的脚本

第一个脚本MoveScript.cs

using UnityEngine;
using System.Collections;

public class MoveScript : MonoBehaviour {
   

    public enum RotationAxes {
    MouseXAndY = 0, MouseX = 1, MouseY = 2 }
    public RotationAxes axes = RotationAxes.MouseXAndY;

    public float sensitivityX = 15F;
    public float sensitivityY = 15F;

    public float minimumX = -360F;
    public float maximumX = 360F;

    public float minimumY = -60F;
    public float maximumY = 60F;
    
    public static bool isEnableMove;

    float moveSensitivity = 1.0f;

    float rotationX = 0F;
    float rotationY = 0F;

    //Quaternion originalRotation;
    //鼠标缩放
    public float sensitivity = 60f;
    public float minFov = 50f;
    public float maxFov = 70f;

    public float speedMove = 10f;
    private float speed;

     void Start()
    {
   
        // Make the rigid body not change rotation
        if (GetComponent<Rigidbody>())
            GetComponent<Rigidbody>().freezeRotation = true;
       // originalRotation = transform.localRotation;
        speed = speedMove;
        isEnableMove = true;
    }

    void Update()
    {
   
        fnRotate();
        if (isEnableMove)
            fnMove();
       // fnScroll();
    }
  
    void fnRotate()
    {
   
        CharacterController controller = gameObject.GetComponent<CharacterController>();
        if (Input.GetMouseButton(1))//0对应左键 , 1对应右键 , 2对应中键
        {
   
            if (axes == RotationAxes.MouseXAndY)
            {
   
                float rotationX = transform
Unity中通过点击RawImage来获取RenderTexture的映射物体需要编写一些脚本逻辑。首先,在场景中创建一个RawImage一个空物体,RawImage设为UI元素。接下来,我们需要在脚本中实现点击RawImage的功能。 首先,在需要实现点击事件的脚本中添加以下代码段: ```csharp using UnityEngine; using UnityEngine.EventSystems; public class ClickRawImage : MonoBehaviour, IPointerClickHandler { public GameObject mappedObject; // 映射的物体 public RenderTexture renderTexture; // 渲染纹理 public void OnPointerClick(PointerEventData eventData) { // 获取点击的位置 Vector2 localCursor; RectTransformUtility.ScreenPointToLocalPointInRectangle(GetComponent<RectTransform>(), eventData.position, null, out localCursor); // 将点击的位置转换为纹理坐标 Vector2 textureCoordinates = new Vector2(localCursor.x / GetComponent<RectTransform>().rect.width + 0.5f, localCursor.y / GetComponent<RectTransform>().rect.height + 0.5f); // 根据纹理坐标获取映射的位置 Ray ray = Camera.main.ViewportPointToRay(textureCoordinates); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { // 获取点击位置的映射物体 mappedObject = hit.transform.gameObject; } } } ``` 在脚本中,我们需要实现接口`IPointerClickHandler`来响应RawImage的点击事件。在点击事件回调函数`OnPointerClick`中,首先计算出点击的位置`localCursor`,然后将其转换为纹理坐标`textureCoordinates`。接着,根据纹理坐标通过Raycast来获取点击位置的映射物体,将其赋值给`mappedObject`。 最后,将该脚本挂载到RawImage上,将相应的RenderTexture赋值给脚本中的`renderTexture`变量。这样,当点击RawImage时,就可以通过点击位置获取到映射的物体了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值