要实现角色拾取功能,我们需要实现蓝图接口功能,蓝图接口主要提供的是蓝图和蓝图之间可以通信,接下来,跟着教程,实现一下角色的拾取功能。
首先,我们要实现一个就是可视区的物品在朝向它的时候,会有一个描边效果,先说一下这个功能的实现逻辑:
- 创建一个蓝图接口,蓝图接口内增加两个函数显示描边和隐藏描边。
- 创建一个可视区物品的父类,添加蓝图接口,然后制作这两个接口函数的实现
- 在角色蓝图中,去获取应该设置描边的模型,然后调用接口,去实现效果。
- 最后创建后处理,通过后处理去实现模型的描边渲染效果。
这样就实现了需要拾取的物品高亮显示的效果。
创建蓝图接口
右键创建蓝图接口
然后再蓝图接口中,定义三个函数,不需要实现,只需要定义函数名
就创建完成了蓝图接口内容,函数的实现,我们在蓝图里面实现即可。
创建可拾取物品的蓝图父类
首先创建一个可以拾取的物品的蓝图父类,父类里面,我们需要创建两个组件,一个是用于显示模型的骨骼网格体组件,另一个是用于碰撞检测的球型碰撞体
在类设置里面设置
在项目设置中,找到碰撞,设置一个新通道 Pickup,用于相应拾取通道,默认值为忽略,只有在对象碰撞上面开启了碰撞,才会在这个通道产生作用,也是为了性能考虑
然后将拾取蓝图的父类的球体碰撞体的碰撞属性里面的这个通道设置成阻挡
在事件里面,鼠标右键,实现描边的函数创建,注意是添加事件,不是调用函数或者调用函数接口
将函数创建完成
然后制作对函数的实现,这里的函数,其实只是实现了对模型的自定义深度渲染的开关。原因在于描边的实现也是根据深度进行的描边绘制。
在角色蓝图中实现模型检测功能
首先在角色蓝图中创建一个拾取范围检测的函数,这个函数是基于相机视角进行拾取的,根据相机位置和相机朝向,可以创建一个范围,然后按通道进行球型拾取,会生成一个胶囊体的区域,将拾取结果返回。注意,通道拾取的通道是我们上面刚创建的Pickup通道,这样可以减少拾取内容。
这里我debug了一下, 可以看一下拾取区域具象化
接下来,我们要对拾取到的物体进行逻辑判断,实现一个拾取物体描边效果事件。事件首先调用函数,获取拾取结果。然后判断是否拾取到物体
如果没有拾取到,我们将取消所有物体的描边,主要是为了bug,其实如果处理的好,只需要将上一次拾取到的描边取消就行了,取消描边其实就是调用接口事件,然后拾取物体那边的事件就能够被调用触发。
如果拾取到了,就要判断是否和上一次拾取到的是否相同
如果相同,则不用处理,不同的话,先把之前的描边关闭,然后重新设置变量,并设置新的变量对象模型的描边效果
最后,这个在每一帧调用,即可实现。
添加后处理实现描边
首先添加一个后处理体积
将后处理范围设置为全局
添加后处理相关材质,用于实现后处理渲染
创建一个拾取物品子类
添加模型,并调整位置
设置碰撞球体的半径
然后放到场景内测试
创建拾取物品的类别
接着,后面我们需要实现将物体附加到角色身上,那么我们需要确定物品的类型以及所需的数据。
首先,我们需要创建一些枚举
这些枚举能够实现在角色事件中判断当前拾取的物件到底是个什么东西。
然后我们还需要一个结构体,用于存储上面的枚举类型还有一些附加到角色身上的数据
PickupType 拾取类型为判断当前为武器或者身上的衣物
WeaponType 武器类型为判断是什么类型的武器,拾取类型为武器时,才会有用
ClothesType 衣服类型为判断物品附加到身上的什么部位,拾取类型为衣服是起作用。
Mesh 骨骼网格体位衣服的骨骼网格体,如果是衣服的某个部位,只需要将衣服附件到角色身上,所以只需要在这里设置即可。
Class 类为实例化武器的类,用于实例化武器即可,我们之前创建的武器都是通过类实例化的。
所以,如果是一个衣服物件 我们需要设置PickupType ClothesType Mesh
如果是一个武器 我们需要设置 PickupType WeaponType Class
有了这些内容,我们就可以实现将拾取的物品附加到角色身上。
拾取功能的实现
在增强输入中增加一个输入
在角色蓝图中设置拾取事件,首先判断状态,我们之前实现了描边功能时,已经保存到了变量里,只需要判断变量里面的内容是否存在即可,然后发送事件通知。
在拾取物品父类里面,我们要在里面调用父类实现将拾取物品数据传递给角色蓝图,并在角色动画播放到拾取时,将自身销毁掉。
在角色蓝图里面,首先设置变量
这种方式是比较简单的方式,其实可以直接将整个结构体存下来比较好,然后在使用的地方break结构体获取数据。
然后修改状态,并设置动画蓝图为拾取状态
然后设置两个队列,第一个队列实现拾取逻辑,在拾取的一瞬间,调用附加到身体上函数。另一个队列则是在退出动画时,退出拾取状态
物品附加到角色身上逻辑
实现物品逻辑附加到角色身上,首先需要判断当前是何物品
如果是身上的衣服,我们只需要将衣服的网格体放置到对应的部位
能实现这个,首先角色模型下面有相应的模型部位
然后还设置了相应的事件能够让骨骼组件去更新当前模型
而在武器这里,我们之前创建过武器的类,并且将武器直接创建到了角色身上,现在,需要修改为拾取功能,所以,将武器附加的那套,不可以直接事件开始时运行,而是,修改为在拾取时运行
然后运行之前书写的那一套逻辑即可,区别就是修改了参数。
这里只是实现一下附加的简单实现,实际项目中还有很多数据判断,甚至和ui之间的交互,毕竟拾取背包增加身上物品容量,拾取衣物增加防御等
拾取动画实现
在拾取动画里面,使用了一个混合空间,主要是为了实现拿着武器和不拿武器播放的动画不同,站立和蹲着播放的也不相同,所有,实现了四个动画的混合,然后根据判断实现。并且将动画的播放事件都调整成了固定时间,这样方便退出拾取状态时,动画都是一同播放完成的。
然后再功能状态机里,创建一个切换到拾取状态。切换条件是由是否拾取的状态判断。
有可能遇到每次拾取未完成时,又进入了拾取状态,所以在状态上面配置项上每次进入从新开始播放
状态里,播放拾取动画,使用之前设置好的拾取动画,由于使用的混合空间,需要设置是否站立和是否持有武器,这里我使用布尔值变换浮点数的方式实现,布尔值转换数字,false就是0,true就是1
这就是拾取功能的大概逻辑。