zoukankan      html  css  js  c++  java
  • 虚幻蓝图学习笔记 制作第一人称(实现功能:捡枪,换枪,扔枪,仍炸弹等)(一)

    一,创建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; )

     

  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/qq964107326/p/15165399.html
Copyright © 2011-2022 走看看