一,创建Game Mode, Controller, Characters与Interface;定义好键盘映射;
在接口中定义前后,左右,视线的上下左右,跳,奔跑,开火,换枪,扔枪,换子弹,瞄准等事件;
在controller中把Interface接口事件与键盘映射进行绑定;在Controller->event BeginPlay中保存当前的Pawn(Get Controlled Pawn)
2)在角色Characters类型中绑定接口并实现事件,添加相机Camera,人物骨骼SkeletalMesh,并绑定动画Animation-> Animation Mode, Anim Class ; Scene用来发射手雷的初始位置,Spline用来描述投掷线,添加Character Movement设置移动
3)在Event BeginPlay 设置加载时设置弹药并获取人物动画Skeletal Mesh ->get Anim Instance-> cast to 动画蓝图类并保存至变量,并在人物在人物骨骼中创建插槽;预览
4)创建枪的蓝图类(连发枪与榴弹枪),与榴弹的子弹蓝图类和手雷的蓝图;
(1)创建Actor蓝图类添加SkeletalMesh 枪模型,Scene用来表示发射射线的位置,添加触发器提升到根组件其余枪支都是继承这个蓝图类; 子弹类添加发射物移动组件ProjectileMovement, 添加触发器,ParticleSystem粒子效果, Radia Force提供冲力组件
(2)子弹类蓝图,在构造函数中为子弹添加重力ProjectileMovement->ProjectileGravity; 初速度ProjectileMovement->Initial Speed;
在Event Hit事件中设置贴花 Spawn Decal at Location,并把贴花依附到击中的物体上AttachComponentToComponent;并产生灯光SpawnActor, 同时产生一个范围伤害Apply Radial Damage With Falloff,并产生冲击力Radial Force->Impluse Strength(Radial Force->Fire Impulse),最后销毁子弹DestroyActor;创建子类用于炸弹蓝图添加StaticMesh炸弹模型;
(3)在角色蓝图中,实现捡枪事件定义一个集合Weaponss,用来存储现在包含的枪,在Event Hit中检测我们是否遇到了枪并添加到集合中
首先判断HIt->Other-> cast to 枪的蓝图,并判断现有集合中是否有枪Weaponss->length>0?branch,
如果集合中没有枪将这边枪保存至变量AsBpWeapons One,这个变量存储当前使用的枪支,并解除它的碰撞Set Actor Enable Collision,同时解除触发器的物理属性Set Simulate Physics,并把枪依附到骨骼的插槽中AttachActorToComponent,并添加到集合Weaponss->Add,并设置拥有者Set Owner为self
如果现在手上有枪,则把这个枪在场景中隐藏Set Actor Hidden in Gmae,同样解除碰撞,解除触发器,依附到骨骼中,并添加到集合,设置拥有者为自己
(4)瞄准与换枪蓝图;
瞄准先判断手上是否有枪AsBpWeaponsone->?isValid,之后设置动画Anmin-> is Targeting,在设置相机视角Camrea->Set Field Of View
换枪,首先判断集合中是否有两边枪weaponss->length,同时判断现在手上是否有枪AsBPWeaponsOne->?Is Valid,停止开火Stop Fire(在枪基类定义的方法)同时播放换枪动画Anim->Montage Play,并且帮当前的枪隐藏Set ActorHidden in Game,
判断获取下一把枪定义变量表示当前集合的下标subscript,每次换枪时自动加一,同时对总数取模,得到下一把枪并重新赋值subscript,在集合中获取并把枪赋值给变量设置为当前的枪Weaponss->Get->AsBPWeaponsOne,同时显示处理Set Actor Hidden In Game
(5)扔枪蓝图,判断集合是否有枪Weaponss->Length>0?Branch,如果有枪脱离依附Weaponss->Get->DetachFromActor,并把拥有者设为空 Owner Character;并恢复碰撞Set Actor Enable Collision,与物理模型box->Set Simulate Physics,同时给一个向前的力camera->Get Forward Vector->Add impulse;并在集合中移除Weaponss->Remove index同时重新设置当前下标变量Subscript%Weaponss->Length==Subscript; ,并获取此下标在集合中是否有枪get->is valid?,如果有赋值给当前枪的变量as bpWeapons one,同时显示,如果没有当前变量赋值为空
(6)开火蓝图在角色中判断手上是否有枪,并且判断是否有弹药,并判断枪的拥有者是否有效,之后调用在枪中定义的开火事件;
(7)在枪基类定义是否是否连续开火变量Fire Looping与是否是穿透类型MultiLineTrace,冲击力impulse;主要区别来复枪与狙击枪
先判断是否是开枪,不是将停止开火自定义StopFire, 清除计时器Clear and invalidae Timer by Handle, 判断是否有粒子Fire Emitter->?Is Valid .如果有将销毁粒子,并判断是否是连续开火,如果是将停止播放开火动画OwnerCharacter->anim->Montage Stop
先判断是否是连续射击,如果是连续射击,调用Set Timer By Event, 并自定义开火间隔Fire Rage;
如果不是连续开火,直接调用一次此定义开火事件FireLoops,
首先判断是否是穿透事件如果,并获取当前角色的相机位置GetWorldLocation->Start与当前向量 Get ForwardVector 并乘以定义的射出变量Field, 加上当前位置向量到End; 同时设置忽略的角色与射线类型Trace Channel;
并判断是否击中物体,如果击中将out Hit升级为变量保存;
使用Sequence并行处理多个事件
1.判断是否连续开火,如果是将播放开火动画
2.在out Hit事件中获取impactNormal与location,impact Point,播放粒子Hit Bone Name,Hit Component
使用SpawnEmitter at Location在击中的位置播放粒子特效, 参数Location,Impacp Normal->RotationFormXVector;
并设置贴图Spawn Decal at Location, 参数Impact Point , Impacp Normal->RotationFormXVector; 并把贴图附加在击中的物体上AttachComponentToComponent ,参数,HitComponent,HIt BoneName
并判断现在是否有Fire Emitter?如果没有在Scene产生一个开火特效Spawn Emtter Attached;LocationType->Snap to Target,Keep World Scale并把值赋给FireEmitter,
在判断是否有效Is Valid?如果有效判断是否是连续开火如果不是延迟Delay,后销毁DestroyComponent
3.判断是否具有物理属性Is Simulating Physics ,如果不具有判断是否可以破坏GetClass->DestructibleComponent, 如果具备一项,将添加冲击力Add impulse at Location(这里获取当前镜头的方向向量Camera->GetForwardVector) ,如果击中AI将自定义方法BEHIt(前几篇文章有关于AI的目的是将AI段支),并添加伤害Apply Damage ,最后发出声音Report Noise Evnet(参数位置与,发出声音的目标Instigator)
(8)在发射榴弹的枪的蓝图是继承来复枪的蓝图,重写GunFire方法
判断是否连续开火FireLooping->Branch,如果不是 判断是否在装弹isReload,如果如果是将播放装弹动画Character->Anim->MontagePlay,延时RetriggerableDelay 后将IsReload设置为false,
如果不是停止播放动画Montage Stop,并发射子弹SpawnActor,并播放发射动画MontagePlay,同时设置装弹Is Reload 为ture;Scene->GetWorldTransform
(9)仍手榴弹流程;在Tick中判断是否仍炸弹如果是先清除瞄准线路ClearArc,在计算除线路抛物线TraceTrowLocation, 在关卡绘制抛物线UpdateArcSpline,并未添加瞄准范围Set WordlsTransForm;
设置按键F, 设置仍炸弹状态, 并添加范围组件, 在释放F是,把仍炸弹状态设置未false同时发射出SpawnActor, 并销毁范围组件,同时调用清除辅助线ClearArc
1.清除辅助线ClearArc:
先清除Spline Meshes数组中的组件DestroyComponent,并清空数组Clear,之后清空Spline的点ClearSplinePoints
2.计算抛物线线路Trace TrowLocation
通过Predic Projectile Path BY TraceChannel
预测受重力影响的虚拟射弹的弧线,并沿弧线进行碰撞检查。返回模拟弧的位置列表和模拟到达的目的地。如果它击中某物(如果跟踪碰撞),则返回 true。
获取Scene位置与前置向量GetWorldLocation/GetForwardVector; 把计算出的点的集合Out Path Positions与out HIt, Return Value返回出去
3.更新辅助线Update Arc Spline
根据Out Path Positions集合向Spline 中循环For Each Loop添加点Add Spline Point; 在完成后, 获取Spline中的所有点Get Number Of Spline Points,减去头部与尾部,再次循环添加辅助线组件Add Spline Mesh Component,同时添加到集合SplineMeshes中;
根据下标添加组件,Set Start and End(index->Spline->Get->Start Pos; Spline->Get Tangent at Spline Point->Start Tangent; )