今回のコードはドキュメントのスニペットから引用しています。
このような仕組みを実装していきます。
コードの全体
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
invisible := class(creative_device):
@editable
cond_btn: conditional_button_device = conditional_button_device{}
@editable
mutator: mutator_zone_device = mutator_zone_device{}
HoldingEvent( Agent : agent) : void =
if(FortCharacter := Agent.GetFortCharacter[]):
if(cond_btn.IsHoldingItem[Agent]):
FortCharacter.Hide()
else:
FortCharacter.Show()
OnBegin<override>()<suspends>: void =
loop:
mutator.Enable()
mutator.AgentEntersEvent.Subscribe(HoldingEvent)
Sleep(0.1)
mutator.Disable()
Sleep(0.1)
コードの解説
冒頭
今回の仕組みではデバイスの条件付きボタンとミューテーターゾーンを使うため、@editableを前につけて定義します。
関数宣言
17行目からHoldingEvent関数を定義しています。
パラメータが(Agent:agent)となっているのは後ほど出てくるAgentEnterEventの情報がagent型だからです。
18行目ではifが使われていますが、これは条件分岐をしたいから使われているというよりは、 FortCharacter := Agent.GetFortCharacter[]が失敗する可能性のある式であるため、失敗コンテキストであるifの条件節(括弧内のこと)で書くために使われています。
後ほど出てくるShow、Hideの対象がfort_character型であり、agent型からfort_character型へ変換したいため、この式が必要になります。
19行目のifは行目のifとは違い条件分岐を行うためのifです。
20行目~22行目の意味は以下の通りです。
- もし、Agentがアイテムを所持しているならば、ForCharacterを隠す。
- そうではないならば、ForCharacterを見せる。
ここでは、IsHoldingItem、Hide、Showの3つのメソッドが使われています。
IsHoldingItemはagent型の情報を必要とするため、[] 内でagent型であるAgentを書いています。これにより、アイテムを保持しているプレイヤーを判別しています。
Hide、Showは前述した通り、fort_character型を対象とするため、メソッドの前にfort_character型のFortCharacterを書きます。
これで関数定義は完了です。
On Begin~
25行目からは、ゲーム開始後に実行されていく式です。
loopはコードブロック内にある式を繰り返し実行するものです。
コードブロックの式の意味は以下の通りです。
loopで以下を繰り返し
- ミューテーターゾーンを有効化
- ミューテーターゾーンにAgentが入っているのならば、HoldingEvent関数を実行
- 0.1秒処理を停止
- ミューテーターゾーンを無効化
- 0.1秒処理を停止
27行目のEnableと30行目のDisableはメソッドで、有効化と無効化を行っています。
28行目は「~が起きた時、関数をを実行する」という場合によく使われる文法です。
ここでは、AgentEnterEventが起きた時に、定義したHoldingEventを実行するという意味になります。
前述した通り、AgentEnterEventではagent型の情報が必要なため、HoldingEventのパラメータでAgent:agentとしています。
コード全体で見てみると、以下 を高速で繰り返し、この仕組みを実現しています
- ミューテーターゾーンに入っているならば、アイテムを持っているか確認
- 持っているならばプレイヤーは消える
コメント