所谓传送门就是从一个地方传送到另一个地方。在游戏中,实现传送门会让人觉得非常神奇。
在unity 我们使用一个面片在当做传送门,要把远处一个场景的画面投到面片上。 可以使用摄像机的TargerTexture 属性。
1.在资源文件夹创建 RenderTexture, 然后拖拽到相机的 TargerTexture属性。 再将 RenderTexture贴到面片上。 即可在面片上看到该摄像机视角的画面。
这种方式也可以用来做小地图功能。
2.到这里还不够,因为光看到画面还不行。 假设你站在门外,朝门里看,自身发生位移的时候,看到的门里的画面范围也会跟着变,这才是真实的效果。
我们把放在远处的摄像机作为目标端摄像机, 那么当前玩家的摄像机应该正视这个面片。 需要 远端的摄像机能够跟玩家的摄像机有相同的位移以及旋转。这样面片上的画面的视角才能跟玩家一致。
这里 需要用到一个 方法。
(1)
public Vector3 MultiplyPoint(Vector3 point);
Description
Transforms a position by this matrix (generic).
可以将目标点进行坐标系转换。
将玩家在世界坐标的坐标点,转化为以传送门为坐标系的坐标。
然后将远端摄像机挂到一个空物体下,该空物体模拟远端传送门出口的点。 将上述得到的坐标点 赋值给远端摄像机。即可同步两个摄像机。
为了让面片的视角刚好符合玩家的视角,还需要将远端相机的近截面改到 相对与玩家视角的门的位置。
实现代码如下
private void Update()
{
CurrentPos = player.transform.position;
var mt = Render.worldToLocalMatrix;
PortalCamera.transform.localPosition = mt.MultiplyPoint(CurrentPos);
PortalCamera.transform.LookAt(PortalPoint);
PortalCamera.nearClipPlane = -PortalCamera.transform.localPosition.z;
const float renderHeight = 1.5f;
PortalCamera.fieldOfView = 2 * Mathf.Atan(renderHeight / 2 / PortalCamera.nearClipPlane) * Mathf.Rad2Deg;
}