【Unity项目经验分享】实现左右分屏裸眼3D程序
1、实现原理
左右分屏原理,左右屏内容左右方向存在些许偏差。通过左右相机,然后左侧相机向左侧偏移一点3cm,右侧相机向右侧屏偏移一定3cm,然后将左右相机渲染内容通过RenderTexture渲染到Canvas上面的左右RawImage上面。
2、实现具体步骤
2.1 左右相机处理
在主相机下面创建左右相机两个Camera,左侧相机向左侧偏移一点3cm,右侧相机向右侧屏偏移一定3cm,如下
2.2 UI处理
将UI Canvas拖到主相机下面
设置RenderMode为Screen Space - Camera,然后设置距离
再将RenderMode设置为World Space。
2.3 将左右相机渲染内容重新渲染到Canvas上面
创建两个Custom Render Texture,分别为CameraLeft、CameraRight,并设置Size
将左右相机的OutputTexture分别设置为CameraLeft、CameraRight
创建一个Canvas,下面创建两个RawImage,分别占左侧和右侧一半,分别显示左右相机的内容
RawImageLeft设置
RawImageRight设置
将CameraLeft、CameraRight的Render Texture拖拽给对应RawImage
2.4 鼠标位置处理
在Canvas层级最优先的下面创建一个RawImage,设置图标样式
编辑处理脚本FollowMouse,代码如下,并进行如下设置
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;public class FollowMouse : MonoBehaviour
{public RectTransform mouseDown;public RectTransform canvas;public static FollowMouse1 instance;public GameObject obj;public Camera camera;public float screenMinX, screenMaxX, localMinX, localMaxX;public float screenMinY, screenMaxY, localMinY, localMaxY;public Texture2D cursorTexture;private void Start(){Cursor.lockState = CursorLockMode.Confined;Cursor.visible = false;}public void Awake(){instance = this;int width = Screen.width;int height = Screen.height;//Debug.Log(width);//Debug.Log(height);screenMaxX = width;screenMaxY = height;localMinX = -width / 2;localMaxX = width / 2;localMinY = -height / 2;localMaxY = height / 2;}void Update(){}void LateUpdate(){// »ñÈ¡Êó±êÔÚÆÁÄ»ÉϵÄλÖÃVector3 mousePosition = Input.mousePosition;//Debug.Log(mousePosition);// ½«Êó±êλÖÃת»»ÎªUI×ø±êϵϵÄλÖÃRectTransform rectTransform = mouseDown;//Vector2 localPosition = new Vector2();//float outputX = Remap(screenMinX, screenMaxX, localMinX, localMaxX, Input.mousePosition.x);//float outputY = Remap(screenMinY, screenMaxY, localMinY, localMaxY, Input.mousePosition.y);//rectTransform.localPosition = new Vector3(outputX, outputY, rectTransform.localPosition.z);//Vector2 hotSpot = new Vector2(cursorTexture.width / 2f, cursorTexture.height / 2f);//Cursor.SetCursor(cursorTexture, hotSpot, CursorMode.Auto);// ´´½¨Ò»¸öÓÃÓÚ´æ´¢½á¹ûµÄÏòÁ¿Vector2 localPosition;if(RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mousePosition, camera, out localPosition)){rectTransform.localPosition = new Vector3(localPosition.x, localPosition.y, rectTransform.localPosition.z);Vector2 hotSpot = new Vector2(cursorTexture.width / 2f, cursorTexture.height / 2f);Cursor.SetCursor(cursorTexture, hotSpot, CursorMode.Auto);}}float Remap(float a, float b, float A, float B, float value){float lerp = (value - a) / (b - a);float output = A + (B - A) * lerp;return output;}}