这节我们继续完善传送门逻辑,实现同场景下的传送。
1. 场景控制器
我们首先实现场景传送的功能,新建 C# 脚本,命名为 SceneController。该类也是一个单例类,以便方便得跨类调用。
如代码清单 1 所示,TransferToDestination 函数实现传送的功能,先实现同场景分支的功能。同场景传送核心实现是 SetPositionAndRotation() 函数,设置角色人物的位置和朝向。实现函数通过协程完成。
如何获取人物目的点的位置和朝向:这些信息我们已经在之前的传送门空对象坐标点设置过了,所以现在的人物就是获取到空对象所对应的目标点。对应的函数为 GetDestinationPortal(),我们通过 FindObjectsOfType()遍历所有传送门,寻找目标点对应的传送门实例。
在进行传送前,需要把人物的 agent 停止掉,要不会出现人物漂移的情形。和当时击退的逻辑类似,这边的做法是把 agent 停止掉(第 26 行)。
角色人物的对象在初始化时就获取会出问题,我们设置逻辑让其只获取一遍(第 20 至 24 行)。
代码完成后,我们在 Hierarchy 窗体中新建一个空对象存放这个单例脚本,以便可以运行到它。
2. 实现传送逻辑
场景控制器实现好了之后,我们就可以调用其中的传送功能了。如代码清单 2 所示,如果进入了传送门区域,并且按下了键盘 E 键,就可以进行传送。
2.1 鼠标设置
鼠标放在传送门上也需要特别的样式指定,可以看之前的 《Unity3D RPG Core | 06 设置鼠标指针》 文章温习一下。
代码清单 3 中设置了传送门对应的鼠标样式,以及点击传送门的逻辑。传送门需要设置新的标签 Portal。
还有需要注意的一点是,因为传送门比较高,碰撞区域也设置的很高的鼠标射线也会相交的比较远,导致走不进传送门。所以如图 1 所示,我们将传送门的碰撞区域设矮一点。
最终的传送效果如图 2 所示,注意设置对传送门的名字。