一、环境布置
第一人称模式:
二、新建脚本命名为任务指示器
Arrow:箭头图像 |
target:指示目标 |
8/9行通过lambad表达式,方便获取它们的对应属性 |
静态的rect对象作用是简化代码 |
13:判断是否存在对象,防止空引用报错 |
14:使用摄像机的方法,将世界坐标系中的目标位置转换为摄像机的视口坐标系 |
17:判断它是否在这个范围内,就知道玩家是否看到指示目标 |
19:通过计算将视口坐标转换为以屏幕为中心的原点的UI坐标系(因为UI坐标是以屏幕中心为原点所以要减去0.5)(转换范围为-0.5—0.5乘以屏幕宽高得到正确的像素坐标) |
21:同时箭头不旋转,直接指向目标 |
在视野之外的时候
用2D向量计算出和边缘的相交点就行
25:最先计算出屏幕的中心坐标 |
26:获得目标映射到屏幕上相对于UI的坐标 |
32:通过向量减法获得标准方向向量 |
33/35:由于屏幕宽高比不一定是1:1 ,所以我们需要对Y分量进行缩放,防止箭头位置出现偏差 |
36—40:从屏幕中心沿着目标方向移动多少距离就可以到达屏幕的边缘,用X、Y保存,取二者最小值,确保箭头不会超出屏幕 |
27—31:需要判断一下是不是在摄像机的正前方 |
45-47:用正反切函数,计算出相对于原点的极坐标角度,有了这个角度就可以让箭头指向目标了 |
标记是以UI的形式处理的,在第一人称模式下是可以的,但是在第三人称视角下,就会不能够被主角阻挡
第三人称视角下:
只需要将看到的目标时侯的处理的指示标记换成3D空间即可
首先创建一个材质
增加两个3D变量, 一个是3D版本的箭头,一个是之前的目标保存,用于处理目标的改变
只需要改写在视觉范围内的代码即可
21:最开始判断是否和之前的目标一样 |
23-25:如果不一样,就把3D箭头添加到新的目标上,并且保存新目标 |
27:之后,就可以计算目标点和相机之间的向量 |
28:这就是一个方向,直接赋值给3D箭头的前向量,这样它就一直朝向着摄像机了 |
29:为了保证它在远近距离的大小,将它限制在0.1到1的本地放缩 |
最后根据是否在视口中,显示和隐藏箭头
这个脚本由于处理了目标不同的情况,因此可以复制多个替代物,来测试切换目标的效果