このジャンルでよく使われるもう一つのプラットフォーム障害物として、絶えず進み続ける必要がある回転するプラットフォームや飛び越える必要がある前後に動くバーなど、回転するオブジェクトがあります。
オブジェクトのトランスフォームの 2 つ目のコンポーネントは回転であり、軸の周りを回転するようにオブジェクトを操作できます。回転を使用して独自のプラットフォームの課題を作成するにはいくつかの方法があり、このセクションではそれらをコーディングする方法について説明します。
回転する小道具を作成する
以下の手順に従って、小道具を回転させるコードを作成します。
-
Verse Explorer を使用して、
movable_propを継承するrotating_propという新しい Verse クラスを作成します。このクラスのプロパティが UEFN に公開されるように、<concrete>指定子を付加します。# 追加の回転によって回転するか、クリエイティブの小道具の回転に合わせて # 回転する小道具。 rotating_prop<public> := class<concrete>(movable_prop): -
using { /Fortnite.com/Devices/CreativeAnimation}およびusing { /UnrealEngine.com/Temporary/SpatialMath}文をファイルの先頭に追加して、これらのモジュールをインポートします。これらは、小道具をアニメートするために必要になります。このセクションで使用されているツールチップも以下に示しています。using { /Fortnite.com/Devices} using { /Fortnite.com/Devices/CreativeAnimation} using { /Verse.org/Simulation} using { /UnrealEngine.com/Temporary/SpatialMath} AdditionalRotationTip<localizes>:message = "RootProp に適用される回転" ShouldRotateForeverTip<localizes>:message = "RootProp が永久に回転するかどうか" MatchRotationTargetTip<localizes>:message = "RootProp が回転を合わせる対象とする小道具 (任意指定)。 AdditionalRotation が設定されていない場合は、これが使用されます" # 追加の回転によって回転するか、クリエイティブの小道具の回転に合わせて # 回転する小道具。 rotating_prop<public> := class<concrete>(movable_prop): rotating_propクラス定義の先頭に以下のフィールドを追加します。-
AdditionalRotationという編集可能なrotation。これは、小道具に適用される回転です。Move()が完了した後に、小道具の回転は、この値だけオフセットされます。# RootProp に適用される追加の回転。 @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} -
ShouldRotateForeverという編集可能なlogic。これは、小道具がリセットされずに回転し続けるかどうかを指定します。# RootProp が永久に回転するかどうか。 @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true -
MatchRotationTargetという編集可能なcreative_prop(任意指定)。別の小道具の回転に合わせて小道具を回転させる場合は、AdditionalRotationを使用するのではなく、この値を設定します。# RootProp が回転を合わせる対象とする小道具 (任意指定)。追加の回転が # 設定されていない場合は、これが使用されます。 @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false -
TargetRotationというrotation変数。小道具は現在、この回転に向かって回転しています。# 小道具は現在、この回転に向かって回転しています。 var TargetRotation:rotation = rotation{}
-
-
最終的なクラス定義は次のようになります。
using { /Fortnite.com/Devices} using { /Fortnite.com/Devices/CreativeAnimation} using { /Verse.org/Simulation} using { /UnrealEngine.com/Temporary/SpatialMath} AdditionalRotationTip<localizes>:message = "RootProp に適用される回転" ShouldRotateForeverTip<localizes>:message = "RootProp が永久に回転するかどうか" MatchRotationTargetTip<localizes>:message = "RootProp が回転を合わせる対象とする小道具 (任意指定)。 AdditionalRotation が設定されていない場合は、これが使用されます" # 追加の回転によって回転するか、クリエイティブの小道具の回転に合わせて # 回転する小道具。 rotating_prop<public> := class<concrete>(movable_prop): # RootProp に適用される追加の回転。 @editable {ToolTip := AdditionalRotationTip} AdditionalRotation:rotation = rotation{} # RootProp が永久に回転するかどうか。 @editable {ToolTip := ShouldRotateForeverTip} ShouldRotateForever:logic = true # RootProp が回転を合わせる対象とする小道具 (任意指定)。追加の回転が # 設定されていない場合は、これが使用されます。 @editable {ToolTip := MatchRotationTargetTip} MatchRotationTarget:?creative_prop = false # 小道具は現在、この回転に向かって回転しています。 var TargetRotation:rotation = rotation{} -
小道具を動かす
Move()関数をmovable_prop内でセットアップ済みであるため、このクラス内でそれをオーバーライドできます。rotating_propクラス内でMove()関数をオーバーライドします。まず、Move()内でMatchRotationTargetが設定されているかどうかをチェックし、その値をRotationToMatch変数に格納します。設定されていれば、TargetRotationをRotationToMatchに設定します。設定されていなければ、それをAdditionalRotationに設定します。# TargetRotation を適用するか、MoveTarget に向かって (設定されている場合)、RootProp を回転させます。 Move<override>()<suspends>:void= # MoveTarget が設定されていれば、TargetRotation を MoveTarget の回転に設定します。 if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation translating_propと同様に、再生するアニメーションのアニメーション モードを指定します。AnimationModeという新しいanimation_mode変数を、animation_mode.OneShotに初期化します。このモードでは、オブジェクトがターゲットに到達するとアニメーションが停止します。小道具が永久に回転する場合および一度だけ移動して停止する場合以外は、アニメーション モードを PingPong に設定します。PingPong モードを使用すると、メトロノームのバーや昇降する橋のような、前後に振動するオブジェクトを作成できます。# 再生するデフォルトのアニメーション モードを設定します。 # OneShot アニメーション モードでは、アニメーションが 1 回だけ再生されます。 var AnimationMode:animation_mode := animation_mode.OneShot # 回転の終了時に RootProp をリセットまたは停止する場合以外は、 # アニメーション モードを PingPong に設定します。 if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPongShouldResetを false に設定し、ShouldRotateForeverを true に設定すると、各アニメーションの終了時に小道具の位置が維持されて、Move()のループが続行されます。-
StartingTransformに対して、TargetRotationを渡してRotateBy()を呼び出すことで、ルート小道具が回転を合わせる対象である回転を、RotateByMoveRotationという新しい変数に取得します。その後に、MoveToEase()を呼び出します。完成したMove()関数は次のようになります。# TargetRotation を適用するか、MoveTarget に向かって (設定されている場合)、RootProp を回転させます。 Move<override>()<suspends>:void= # MoveTarget が設定されていれば、TargetRotation を MoveTarget の回転に設定します。 if: RotationToMatch := MatchRotationTarget?.GetTransform().Rotation then: set TargetRotation = RotationToMatch else: set TargetRotation = AdditionalRotation # 再生するデフォルトのアニメーション モードを設定します。 # OneShot アニメーション モードでは、アニメーションが 1 回だけ再生されます。 var AnimationMode:animation_mode := animation_mode.OneShot # 回転の終了時に RootProp をリセットまたは停止する場合以外は、 # アニメーション モードを PingPong に設定します。 if: not ShouldRotateForever? and not MoveOnceAndStop? then: set AnimationMode = animation_mode.PingPong # StartingTransform を AdditionalRotation だけ回転させることで、 # 回転を合わせる対象である回転を取得します。そして、回転を開始します。 RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation) RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode) -
prop_animator仕掛けクラス内で、RotatingPropsという、rotating_propの新しい編集可能な配列を追加します。もう一つのfor式をOnBegin()に追加し、そのループ内で、回転するすべての小道具に対してSetup()を呼び出します。更新後のprop_animatorクラスは次のようになります。using { /Fortnite.com/Devices} using { /Verse.org/Simulation} using { /UnrealEngine.com/Temporary/Diagnostics} TranslatingPropsTip<localizes>:message = "アニメーションを使用して平行移動する (動かす) 小道具" RotatingPropsTip<localizes>:message = "アニメーションを使用して回転する小道具" # 各小道具の Setup() メソッドを呼び出すことで、アニメーションを使用する小道具の移動を調整します。 prop_animator := class(creative_device): # アニメーションを使用して平行移動する小道具の配列。 @editable TranslatingProps:[]translating_prop = array{} @editable RotatingProps:[]rotating_prop = array{} # 実行中のゲームで仕掛けが開始されたときに実行します OnBegin<override>()<suspends>:void= # 各小道具に対して、Setup() を呼び出してアニメートを開始します。 for: Prop:TranslatingProps do: Prop.Setup() for: Prop:RotatingProps do: Prop.Setup() - コードを保存してコンパイルします。
小道具を仕掛けに結び付ける
エディタに戻り、小道具の平行移動のセクションで作成した小道具をいくつか削除して、別の割れ目を作り出します。FG01 Turntable base と FG01 SpinningBar Double S をレベルに追加します。ベースの名前を RotatingBase とし、バーの名前を Spinning Bar とします。バーをベースの上方に置き、両方の小道具を割れ目の上に配置します。
2 つの回転する小道具のセットアップ。回転するバーと回転するベースのどちらも、異なる速度で同じ方向に回転します。
アウトライナー で、prop animator を選択し、回転する各小道具に対する配列要素を RotatingProps に追加します。各小道具に以下の値を代入します。
| オプション | Value | 説明 |
|---|---|---|
| Additional Rotation | Z、90.0 | この小道具は、Z 軸を中心にして毎回 90 度回転する |
| RootProp | アニメートしている小道具に代入する | これはアニメートしている小道具である |
| Move Duration | 2.0、3.0 | 異なる速度で回転するように、持続時間が短い小道具のいずれかを代入する |
| Move Ease Type | Linear | これは、小道具を一定速度でアニメートする |
変更内容をプッシュし、小道具を確認します。値を変えてさまざまな回転を試し、さまざまな寸法で回転させて、さまざまなタイプの障害物を作り出してみます。
次の内容
次のセクションでは、移動と回転を組み合わせて、その両方を行うことができる小道具を作成します。
完全なコード
このセクションで作成した完全なコードを以下に示します。
rotating_prop.verse
using { /Fortnite.com/Devices}
using { /Fortnite.com/Devices/CreativeAnimation}
using { /Verse.org/Simulation}
using { /UnrealEngine.com/Temporary/SpatialMath}
AdditionalRotationTip<localizes>:message = "RootProp に適用される回転"
ShouldRotateForeverTip<localizes>:message = "RootProp が永久に回転するかどうか"
MatchRotationTargetTip<localizes>:message = "RootProp が回転を合わせる対象とする小道具 (任意指定)。 AdditionalRotation が設定されていない場合は、これが使用されます"
# 追加の回転によって回転するか、クリエイティブの小道具の回転に合わせて
# 回転する小道具。
rotating_prop<public> := class<concrete>(movable_prop):
# RootProp に適用される追加の回転。
@editable {ToolTip := AdditionalRotationTip}
AdditionalRotation:rotation = rotation{}
# RootProp が永久に回転するかどうか。
@editable {ToolTip := ShouldRotateForeverTip}
ShouldRotateForever:logic = true
# RootProp が回転を合わせる対象とする小道具 (任意指定)。追加の回転が
# 設定されていない場合は、これが使用されます。
@editable {ToolTip := MatchRotationTargetTip}
MatchRotationTarget:?creative_prop = false
# 小道具は現在、この回転に向かって回転しています。
var TargetRotation:rotation = rotation{}
# TargetRotation を適用するか、MoveTarget に向かって (設定されている場合)、RootProp を回転させます。
Move<override>()<suspends>:void=
# RotationToMatch が設定されていれば、TargetRotation をそれに設定します。設定されていなければ、
# それを AdditionalRotation に設定します。
if:
RotationToMatch := MatchRotationTarget?.GetTransform().Rotation
then:
set TargetRotation = RotationToMatch
else:
set TargetRotation = AdditionalRotation
# 再生するデフォルトのアニメーション モードを設定します。
# OneShot アニメーション モードでは、アニメーションが 1 回だけ再生されます。
var AnimationMode:animation_mode := animation_mode.OneShot
# 回転の終了時に RootProp をリセットまたは停止する場合以外は、
# アニメーション モードを PingPong に設定します。
if:
not ShouldRotateForever? and not MoveOnceAndStop?
then:
set AnimationMode = animation_mode.PingPong
# StartingTransform を AdditionalRotation だけ回転させることで、
# 回転を合わせる対象である回転を取得します。そして、回転を開始します。
RotateByTargetRotation := StartingTransform.Rotation.RotateBy(TargetRotation)
RootProp.MoveToEase(RotateByTargetRotation, MoveDuration, MoveEaseType, AnimationMode)
prop_animator.verse
using { /Fortnite.com/Devices}
using { /Verse.org/Simulation}
using { /UnrealEngine.com/Temporary/Diagnostics}
TranslatingPropsTip<localizes>:message = "アニメーションを使用して平行移動する (動かす) 小道具"
RotatingPropsTip<localizes>:message = "アニメーションを使用して回転する小道具"
# 各小道具の Setup() メソッドを呼び出すことで、アニメーションを使用する小道具の移動を調整します。
prop_animator := class(creative_device):
# アニメーションを使用して平行移動する小道具の配列。
@editable
TranslatingProps:[]translating_prop = array{}
@editable
RotatingProps:[]rotating_prop = array{}
# 実行中のゲームで仕掛けが開始されたときに実行します
OnBegin<override>()<suspends>:void=
# 各小道具に対して、Setup() を呼び出してアニメートを開始します。
for:
Prop:TranslatingProps
do:
Prop.Setup()
for:
Prop:RotatingProps
do:
Prop.Setup()