インターフェイスをつかいNPCを目標地点まで移動させてみよう

①はじめに

verseをつかい、新しい仕掛けをつくることができます。

あわせて読みたい
verseで新しい仕掛けをつくってみよう UEFNでゲームをつくるときに必ずといっていいほど使用するのが、”仕掛け”です。例えば、アイテムスポナーの仕掛けや、ミューテーターゾーンの仕掛けなどで、UEFNにあら...

仕掛けをクラスとよび、クラスがもつ機能を使い、新しい効果をもたらすクラスをつくったわけです。

クラスがもつ機能だけでは満足できないときは、”インターフェイス”を使います。

②インターフェイスとは

クラスとは違う存在ですが、”機能”をもつ心強い存在です。機能とは、例えばNPCを目標地点へ移動させるとかです。

クラスとかインターフェイスがはいった道具箱をusingとして書いています。スクリプトの一番上にいつも書いているやつです。”モジュール“と呼びます。

モジュールもいろいろな種類があって、中にはいっているクラスやインターフェイスの顔ぶれも違います。

例えば、仕掛けをつくりたいときのモジュールと、NPCの動きをつくりたいときのモジュールは違います。仕掛けをつくるときには、using { /Fortnite.com/Devices }というモジュールを使います。NPCの動きをつくるときには、using { /Fortnite.com/AI }というモジュールを使います。

using { /Fortnite.com/AI }のなかにはNPCを目標地点へ移動させるインターフェイスがはいっていますが、using { /Fortnite.com/Devices }のなかにははいっていません。

③インターフェイスをつかってみる

インターフェイスもいろいろな種類があります。

今回はNPCをゲーム内でコントロールするためのfort_characterインターフェイスと、NPCを目標地点へ移動させるnavigatableインターフェイスを使ってみます。

verseテンプレートNPC Behavior Basicをひらき、下のスクリプトをコピー&ペーストしてください。#メモに補足説明をしています。ご確認ください。

using { /Fortnite.com/AI }
using { /Verse.org/Simulation }
#モジュールを2つ追加します。
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/SpatialMath }
 
#NPCの動きに関する新しいクラスを作成します。クラス名をnew_npc_behavior_basic_moveとします。
new_npc_behavior_basic_move<public> := class(npc_behavior):

    #NPCがスポーンしたときに発生するイベントを書きます。
    OnBegin<override>()<suspends>:void=
        #画面左上にNPCがでてきたよ!とテキスト表示させます。プログラムがちゃんと作動しているか確認する意味でもコードとして残しておく(デバッグ)
        Print("NPCがでてきたよ!")

        #ゲーム内のNPCの存在をデータとして取り扱う。NPCがいないかもしれないからif文という条件式をつかう。
        if:
            #ゲーム内のNPCの存在をデータとして持っておく。Agentという箱にいれておく。
            #先述しましたが、NPCがいないかもしれないので、if文でくくっています。データないかも・・という考えをもとにしたコードを失敗式とか呼びます。
            Agent := GetAgent[]
            #fort_characterインターフェイスを使い、ゲームプレイデータにアクセスできるようにします。NPCをコントロールできるようになります。
            #fort_characterインターフェイスを使うときは、モジュールusing { /Fortnite.com/Characters }を追加します。
            Character := Agent.GetFortCharacter[]
            #navigatableインターフェイスを使い、NPCを目標地点へ移動させます。navigatableはusing { /Fortnite.com/AI }のなかにあります。
            Navigatable := Character.GetNavigatable[]
            #NPCがスポーンした位置データをNPCSpawnPointへ格納します。
            NPCSpawnPoint := Character.GetTransform().Translation
            #NPCSpawnPointからY軸だけずらした新しい位置情報をNPCNewPointとします。
            #位置情報はベクトルという数学の考え方で表現します。数学的表現を使いたい場合は、モジュールusing { /UnrealEngine.com/Temporary/SpatialMath }を追加します。
            NPCNewPoint := NPCSpawnPoint + vector3{X:=0.0 ,Y:=-3000.0, Z:=0.0}

            #デバッグとして、位置情報を画面に表示したい。{}で囲うとNPCSpawnPointのなかにある位置データをみることができます。
            #デバッグその1NPCSpawnPoint
            #Print("{NPCSpawnPoint}")
            #デバッグその2NPCNewPoint
            #Print("{NPCNewPoint}")

        then:
            #NPCが移動する目標地点をNPCNewPointとします。MakeNavigationTargetで定めて、データをNavigationTargetへ格納します。
            NavigationTarget := MakeNavigationTarget(NPCNewPoint)
            #NavigateToというのがnavigatableインターフェイスの機能です。
            NavResultGoTo :=Navigatable.NavigateTo(NavigationTarget)

        #NPCはNavigationTarget地点に到着したら、次の指令がないためブラブラしはじめます。

    #NPCがデスポーンするときに発生するイベントを書きます。
    #今回は使わない
    OnEnd<override>():void=
        #デバッグ
        Print("Goodbye, NPC!")

ポイントは、2つインターフェイスを使用していることです。

Character := Agent.GetFortCharacter[] →NPCをコントロールすることができるようになる。

Navigatable := Character.GetNavigatable[] →NPCを目標地点へ移動させることができるようになる。

④目標地点をつくる

このverseスクリプトを適用したNPCキャラクター定義をレベル上に配置します。配置する位置はどこでも良いです。

NPCキャラクター定義の設定は以下のようになります。NPC動作スクリプトにいま作成したverseファイルを適用してください。

目印となる旗を設置していきます。

コンテンツブラウザで、Fortniteフォルダでflagと検索して、NPCキャラクター定義を配置した場所に配置します。だいたいで大丈夫です。

つぎに、目標地点に旗を設置します。

スクリプトに記載していますが、目標地点の位置情報を以下のように設定しています。

NPCNewPoint := NPCSpawnPoint + vector3{X:=0.0 ,Y:=-3000.0, Z:=0.0}

つまり、NPCキャラクター定義を配置した場所からY軸(ギズモ緑色の矢印)のみ-3000移動した場所が目標地点となるわけです。そこに旗を設置しましょう。下の動画のように、Y軸(ギズモ緑色の矢印)のみ移動させます。だいたいで大丈夫です。

⑤セッションを開始する

NPCがスポーンして、期待通りの位置まで移動したら大成功です。NPCは移動したあとブラブラしますが、スクリプトで新しく指示をだせば動いてくれます。

⑥まとめ

NPCが動いてくれました。

とても面白いですよね。

NPCの魅力は奥深いです。

クリエナビでその魅力を一つでも多くお届けできるようにしたいと思います。

お疲れさまでした。

ご質問やご感想はお気軽にコメント欄まで!

コメントする