https://www.youtube.com/watch?v=rXbthauNye0&t=54s
Bug Blaster UEFN Full Course - Build An Entire Fortnite Creative 2.0 Gameを見たうえでのEpic Boss Battles In Fortnite Creative 2 UEFNのメモ。
コリジョンのためにモデリングモードのBoxを作成。
Boxを作成するとMeshesフォルダも作成され、そこに作ったBoxがある。
Boxを開き、コリジョンを追加。
Boxをスケルタルメッシュの子にして、ソケットを指定し、トランスフォームを調整する。
これでスケルタルメッシュに追従するようになる。
全身に配置する。
全てのBoxをマテリアルで透明にする。
そしてヒットイベントを有効にし、コリジョンプリセットを「FortBuildingMeshPhysics」にする。
アニメをIdleにしたら結構ずれたので調整。
前のようにinitでsoldierを使わず、プロップマニピュレーターを使い耐久力を設定した。
これで敵に攻撃できるようになった。
ダメージボリュームを設置した後に、レベルシーケンスを作成。
シーケンサにボスのBPを追加。
トラックに攻撃アニメを追加。
シーケンサーにダメージボリュームを追加。
親子付けのアタッチオプションで「現状を保持」にして、ボスBPの部位を選択する。
その部位に合わせてダメージボリュームが動くようになった。
ダメージボリュームのスタティックメッシュにあるスタティックメッシュをクリアすると土台が消えた。
VisibleはFalseにできなかったのでそうする必要がある。
自動的にキーを追加するようにして、回転などを調整。
シーケンサを再生するとダメージボリュームが見えないので、赤いものを動かして確認するほうがいい。
Damage_RightFistも同じように追加。
攻撃シーケンサーを複製して、Walkアニメに変える。
ルートモーションを使うと問題があるので、その場で歩くアニメを使う。
シーケンサーを使うためにムービーシーケンスの仕掛けを設置。
作った攻撃と歩行のシーケンスをセット。
boss_battle.verseを作成。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/SpatialMath }
boss_battle := class(creative_device):
# 2つのシーケンス
@editable BossSmashAttackCinema : cinematic_sequence_device = cinematic_sequence_device{}
@editable BossWalkCinema : cinematic_sequence_device = cinematic_sequence_device{}
# boss
@editable Boss : creative_prop = creative_prop{}
# Runs when the device is started in a running game
OnBegin<override>()<suspends>:void=
loop:
RotateBossTowardPlayer()
BossWalkAnimetion()
BossSmashAnimetion()
BossWalkAnimetion()<suspends>:void=
# BossWalkCinemaを再生。
BossWalkCinema.Play()
# プレイヤーを取得。
AllPlayers := GetPlayspace().GetPlayers()
if(Player := AllPlayers[0], Agent := agent[Player], Fort := Agent.GetFortCharacter[]):
# プレイヤーの位置を取得。
PlayerTran := Fort.GetTransform()
# ボスを動かす。1.4はWalkアニメの秒数。
Boss.MoveTo(PlayerTran.Translation, Boss.GetTransform().Rotation, 1.4)
BossSmashAnimetion()<suspends>:void=
# BossSmashAttackCinemaを再生。
BossSmashAttackCinema.Play()
# SmashAttackアニメの秒数スリープ。
Sleep(3.0)
RotateBossTowardPlayer()<suspends>:void=
# プレイヤーを取得。
AllPlayers := GetPlayspace().GetPlayers()
if(Player := AllPlayers[0], Agent := agent[Player], Fort := Agent.GetFortCharacter[]):
# bossとプレイヤーの位置を取得。
PropLocaton := Boss.GetTransform().Translation
PlayerLocation := Fort.GetTransform().Translation
# ボスからプレイヤーへの向きを取得。
if(LookDirection := (PlayerLocation - PropLocaton).MakeUnitVector[]):
Yaw := RadiansToDegrees(ArcTan(LookDirection.Y, LookDirection.X)) - 90.0
Pitch := RadiansToDegrees(ArcTan(LookDirection.Z, Sqrt((LookDirection.X * LookDirection.X) + (LookDirection.Y * LookDirection.Y))))
Roll := 0.0
NewRotation := MakeRotationFromYawPitchRollDegrees(Yaw, Pitch, Roll)
# ボスをNewRotationに回転させる。
Boss.MoveTo(Boss.GetTransform().Translation, NewRotation, 2.0)
boss_battleを設置して、シーケンスとボスをセット。
シーケンサにオーディオトラックを追加。
Stomp攻撃を追加。
コードを追加する。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Random }
boss_battle := class(creative_device):
# 3つのシーケンス
@editable BossSmashAttackCinema : cinematic_sequence_device = cinematic_sequence_device{}
@editable BossStompAttackCinema : cinematic_sequence_device = cinematic_sequence_device{}
@editable BossWalkCinema : cinematic_sequence_device = cinematic_sequence_device{}
# boss
@editable Boss : creative_prop = creative_prop{}
# Runs when the device is started in a running game
OnBegin<override>()<suspends>:void=
loop:
RotateBossTowardPlayer()
BossWalkAnimetion()
PlayRandomBossAttack()
# ランダムで攻撃させる。
PlayRandomBossAttack()<suspends>:void=
# 0か1をランダムで生成。
if(GetRandomInt(0,1) = 0):
BossSmashAnimetion()
else:
BossStompAnimetion()
BossWalkAnimetion()<suspends>:void=
# BossWalkCinemaを再生。
BossWalkCinema.Play()
# プレイヤーを取得。
AllPlayers := GetPlayspace().GetPlayers()
if(Player := AllPlayers[0], Agent := agent[Player], Fort := Agent.GetFortCharacter[]):
# プレイヤーの位置を取得。
PlayerTran := Fort.GetTransform()
# ボスを動かす。1.4はWalkアニメの秒数。
Boss.MoveTo(PlayerTran.Translation, Boss.GetTransform().Rotation, 1.4)
BossSmashAnimetion()<suspends>:void=
# BossSmashAttackCinemaを再生。
BossSmashAttackCinema.Play()
# SmashAttackアニメの秒数スリープ。
Sleep(3.0)
BossStompAnimetion()<suspends>:void=
# BossStompAttackCinemaを再生。
BossStompAttackCinema.Play()
# SmashAttackアニメの秒数スリープ。
Sleep(1.8)
RotateBossTowardPlayer()<suspends>:void=
# プレイヤーを取得。
AllPlayers := GetPlayspace().GetPlayers()
if(Player := AllPlayers[0], Agent := agent[Player], Fort := Agent.GetFortCharacter[]):
# bossとプレイヤーの位置を取得。
PropLocaton := Boss.GetTransform().Translation
PlayerLocation := Fort.GetTransform().Translation
# ボスからプレイヤーへの向きを取得。
if(LookDirection := (PlayerLocation - PropLocaton).MakeUnitVector[]):
Yaw := RadiansToDegrees(ArcTan(LookDirection.Y, LookDirection.X)) - 90.0
Pitch := RadiansToDegrees(ArcTan(LookDirection.Z, Sqrt((LookDirection.X * LookDirection.X) + (LookDirection.Y * LookDirection.Y))))
Roll := 0.0
NewRotation := MakeRotationFromYawPitchRollDegrees(Yaw, Pitch, Roll)
# ボスをNewRotationに回転させる。
Boss.MoveTo(Boss.GetTransform().Translation, NewRotation, 2.0)
ランダムで攻撃方法が変わるようになった。
小道具を無敵にしてコードを追加している。
ボスのHPバーを作成。
動画のようにhealth_barを使ったが見つからないみたい。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Random }
using { /Fortnite.com/UI }
boss_battle := class(creative_device):
# 3つのシーケンス
@editable BossSmashAttackCinema : cinematic_sequence_device = cinematic_sequence_device{}
@editable BossStompAttackCinema : cinematic_sequence_device = cinematic_sequence_device{}
@editable BossWalkCinema : cinematic_sequence_device = cinematic_sequence_device{}
# boss
@editable Boss : creative_prop = creative_prop{}
# prop_manipulator_device
@editable BossPropManip : prop_manipulator_device = prop_manipulator_device{}
# bossのhealth_bar
# health_barがないらしい。
#BossBar : health_bar = health_bar{}
# Runs when the device is started in a running game
OnBegin<override>()<suspends>:void=
# DamagedEventをOnTheBossDamagedに関連付ける。
BossPropManip.DamagedEvent.Subscribe(OnTheBossDamaged)
# BossBarを初期化。
#BossBar.Init("Bulgnar the belcher". 3000.0)
# BossBarを表示。
AllPlayers := GetPlayspace().GetPlayers()
if(Player := AllPlayers[0]):
#BossBar.ShowUIForPlayer(Player)
loop:
RotateBossTowardPlayer()
BossWalkAnimetion()
PlayRandomBossAttack()
OnTheBossDamaged(Agent : agent):void=
#apply damage
#BossBar.TakeDaamge(10.0)
# ランダムで攻撃させる。
PlayRandomBossAttack()<suspends>:void=
# 0か1をランダムで生成。
if(GetRandomInt(0,1) = 0):
BossSmashAnimetion()
else:
BossStompAnimetion()
BossWalkAnimetion()<suspends>:void=
# BossWalkCinemaを再生。
BossWalkCinema.Play()
# プレイヤーを取得。
AllPlayers := GetPlayspace().GetPlayers()
if(Player := AllPlayers[0], Agent := agent[Player], Fort := Agent.GetFortCharacter[]):
# プレイヤーの位置を取得。
PlayerTran := Fort.GetTransform()
# ボスを動かす。1.4はWalkアニメの秒数。
Boss.MoveTo(PlayerTran.Translation, Boss.GetTransform().Rotation, 1.4)
BossSmashAnimetion()<suspends>:void=
# BossSmashAttackCinemaを再生。
BossSmashAttackCinema.Play()
# SmashAttackアニメの秒数スリープ。
Sleep(3.0)
BossStompAnimetion()<suspends>:void=
# BossStompAttackCinemaを再生。
BossStompAttackCinema.Play()
# SmashAttackアニメの秒数スリープ。
Sleep(1.8)
RotateBossTowardPlayer()<suspends>:void=
# プレイヤーを取得。
AllPlayers := GetPlayspace().GetPlayers()
if(Player := AllPlayers[0], Agent := agent[Player], Fort := Agent.GetFortCharacter[]):
# bossとプレイヤーの位置を取得。
PropLocaton := Boss.GetTransform().Translation
PlayerLocation := Fort.GetTransform().Translation
# ボスからプレイヤーへの向きを取得。
if(LookDirection := (PlayerLocation - PropLocaton).MakeUnitVector[]):
Yaw := RadiansToDegrees(ArcTan(LookDirection.Y, LookDirection.X)) - 90.0
Pitch := RadiansToDegrees(ArcTan(LookDirection.Z, Sqrt((LookDirection.X * LookDirection.X) + (LookDirection.Y * LookDirection.Y))))
Roll := 0.0
NewRotation := MakeRotationFromYawPitchRollDegrees(Yaw, Pitch, Roll)
# ボスをNewRotationに回転させる。
Boss.MoveTo(Boss.GetTransform().Translation, NewRotation, 2.0)