实现效果:
进入地上武器范围内按E,拾取武器,按G丢弃武器。 手上有武器时不能再拾取武器。
注意:人物不在武器范围内,按E无法拾取到任何武器。
重点:
蓝图通信,武器基类的创建。
一:前期准备
1、素材准备
去虚幻商场下载免费资源:冷兵器、枪、粒子特效。
本案例采用第一人称角色,需要预先删除一些模板中自带,我们又不需要的东西,做出空手状态。
只留下下图的组件(继承的组件时无法删除的),删除组件后编译会报错,找到对应的报错位置,删除节点即可。

2、需要用到的武器做好碰撞
凸包、应用、简单碰撞


二、类的封装——武器基类
静态网格体提升为根,因为静态网格体是要换的,这里先用一个立方体替代下。
预先创建好一些基本函数:被拾取、被丢弃、攻击。其中攻击,因为各类武器攻击效果时不一样的,这里不写逻辑,在子类继承后去做各自的攻击。 被拾取和被丢弃函数应该是通用的,这里需要在基类中写好,子类直接继承就行。
物理模拟需要打开,不然放在场景中的武器不会掉落到地板上。

三、实现蓝图通信
这里通过碰撞实现。
这里的逻辑和之前门的类似,通过碰撞获取到人物对象,再把自己传给人物的 当前武器 变量。
这里的is valid节点是解决一个bug的关键(该bug即:手上有武器,进入新武器的碰撞区域按E,在手上武器未被丢弃的情况下,仍然可以拾取新武器。)
因为如果没有这个节点判断,意味着即使人物手上已经拿了另外一把武器A,只要进入另一个武器B碰撞区域,就马上建立起了武器B和人物的通信,虽然手上拿了一把武器A,但是人物的当前武器变量存储的却是武器B,逻辑上出现问题,所以通过这里的判断可以避免在人物当前武器存在的情况下继续向其赋值。)
这里没有新建变量把人物存储下来是因为后面我们直接在被拾取和被丢弃函数上做了可以传入人物对象的接口。

四、被拾取和被丢弃函数
被拾取主要实现两个效果:关闭模拟物理和附加到人物类下的mesh 2P组件下的一个插槽中。
所以我们必须获取到人物对象(即接口里的 持武器者),这个接口的值是在人物蓝图中接入。
全部对齐到目标。

这里的插槽是第一人称角色自带的,如果没有也可以自己添加插槽,并且通过右键选择预览资源配合菜单的预览动画,来查看武器在手中的实际效果,不满意可以通过调节插槽来更好的实现武器和手的匹配

被丢弃:
反向操作,开启物理模拟和从对象分离。位置为保持场景。
还要注意把人物的当前武器变量设置为空,不然就算被丢弃,但是人物的当前武器变量还是有对象。会出现把武器丢了,去到一个非武器范围的位置按E,被丢弃的武器仍然会附加到手上。

五、人物蓝图逻辑
要有类型为 武器基类的 变量:当前武器
两个is Valid用来防止人物不在武器区域时不能触发拾取函数,手上没武器时不能触发丢弃函数。
在这里把人物本身传递给函数的接口:持武器者

完成。
学习参考: