传送门实现思路
免责声明:本篇不算教程,算是一个我个人的学习记录,记录了我做这个功能是的思考过程,仅提供参考,欢迎各位相互交流学习;
展示视频:传送门项目展示_哔哩哔哩bilibili
参考教程:
https://www.youtube.com/watch?v=TASHWpdQFwc&t=83s(不止一集)
【50CaL】传送门背后的开发原理分析 | 游戏之后 EP4 - Portal_哔哩哔哩_bilibili(原理讲得比较透彻,但不涉及具体的代码实现)

功能总结:
可以通过门看到另一个门的景象

可以传送物体,并能够卡在中间

可以传送玩家,确切来说是玩家摄像机

蓝图实现:
第一步视觉的实现,简单地说就是用两个相机渲染两张RT,并把这两张RT分别贴在两个传送门上;
通过蓝图来赋予材质

注意:以下部分均通过Sequence连接到Tick上
因为RT是通过屏幕映射的方式贴在传送门上的,所以视口的比例与RT的比例不同则会造成RT的变形,所以要实时调整RT的长宽比;
如果不是很明白uv的原理,可以看看Youtube上的视频(大概28min左右):https://www.youtube.com/watch?v=Ju23BFU5TNI&t=2134s


传送门需要另一个门配对,可以不用我这种方法,手动选取也可以,只要保证能找到另一个连接的门就行;

实时计算玩家相机变换后的Transform,并将Transform赋予捕获摄像机,并根据摄像机与门的距离计算近裁切平面的距离,防止被其它物体遮挡;

这里用了一个自己写的纯函数,原理也很简单(我一共用了三个纯函数,都是计算变换的,长得也差不多)

对坐标变换原理不了解的可以看看这个Up的视频;
【50CaL】传送门背后的开发原理分析 | 游戏之后 EP4 - Portal_哔哩哔哩_bilibili

第二步,传送物体的原理也不难,就是在另一个门后复制一个一摸一样的物体,并且完全继承本体的Transform,当本体传送过去后,删除复制体。但是UE的蓝图里好像并没有完全复制一个Actor的功能,之后通过类生成Actor,但属性无法继承,所以,我就用了C++写了一个组件完成这部分功能,并把函数公开到蓝图(Clone Actor、Clone Static Mesh Actor);
创建C++类的方法我就不讲的,因为我自己也不是很懂,怕误人子弟,各位还是去看看别的Up或者Youtuber的教程吧,这里只贴一下我的C++代码;
如果不是很理解这个原理的,也可以看看这个Up的视频,基本所有的原理都有讲【50CaL】传送门背后的开发原理分析 | 游戏之后 EP4 - Portal_哔哩哔哩_bilibili


别问为什么不用Collision,惨痛的教训。因为Collision用的是事件,而事件是异步执行的,也就是你完全不能预估事件执行的顺序,这对于需要引用前面变量的值的程序来说是致命的,所以不能这么用,还是老实用射线检测吧;



这部分的判断看起来确实是有点乱,实际上也确实是有点乱,还有更乱的在后面。这里主要是为了避免Actor传送过去了,但因为距离原因又传送回来,从而变成一个无限循环的情况。还有一个就是为了让已经一半身子进入传送门的Actor能够顺利出来(反悔)

这里标红的,设置速度的,因为不是所用Actor都像静态网格体一样模拟物理的,比如第一人称模板里的子弹,就是加了发射物组件的,所以这里需要多要解决方案,像白框那里一样,在后面加上去就好;


第三步,传送角色。这里不仅包括玩家Pawn,我把所有Character类都与其它Actor类分开来写,但整体上思路没有太大区别,就多了一个调整克隆体的姿势的步骤而已,还有就是玩家Pawn需要一些格外处理;
Pawn的话,主要的还是相机,毕竟相机才是玩家的本体。瞬移没太多要讲的,和普通的Actor差不多,不过相机一般不会绕X轴旋转。判断是否传送,这里主要是通过门到相机的向量与门的前向量叉乘判断的,加上一个球型的范围限定,防止在大老远就被误传送;



这里的主要难点是,玩家的传送需要事实上的无缝,和Actor不同,Actor可以在距离门一段距离后再传送,以至于不会重复触发。所以需要多加一个变量判断Pawn在传送后是否离开了一定距离。




这个需要多一步,同步骨骼网格体的姿势;

因为考虑到AI,所以需要和玩家分开判断,就显得有点复杂了;



补丁,如果是第三人称镜头,就会出现镜头距离角色太远,而不能很好的传送的问题,所以需要在接近传送门时调整弹簧臂的长度,不过还是因为异步的原因,所以视觉效果有点问题,不过能用。碰撞的设置是为了避免在第三人称镜头下,因为摄像机碰到了传送门而发生传送的误操作情况,需要在项目设置里加多一个Object;

不足:不足的地方太多了,甚至不知道从哪说起,我就列三个比较明显的吧;
在第三人称下,人物移动时镜头会出现抖动的情况,虽然玩家视角看着好像没有,但数据告诉我确实是有,所以导致了变换Transform的捕捉相机也出现抖动,从而使得RT的抖动会比较明显,第一人称倒没事;
目前传送门只能水平放置,不能倾斜,倾斜的话,其它Actor可以照常工作没啥问题,但是Pawn就会出现镜头问题,虽然能用,但是不太好用;
还有一个问题就是相机的近裁切面,因为才切面不一定会与传送门平行和重合,所以就导致了画面的不连贯,观感不好,这个问题用不对成视锥体可以解决,但是我不会。关于这个问题也可以去看看这个Up的视频,他也有讲【50CaL】传送门背后的开发原理分析 | 游戏之后 EP4 - Portal_哔哩哔哩_bilibili;
