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


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296251.html
標籤:其他
