Gameware Navigation をゲームのランタイムに統合する

このドキュメントには、Gameware Navigation を Lua ゲーム コードに統合する方法が記載されています。Navigation World を追加して、ボットをスポーンする方法について学習します。

Gameware Navigation Lua スクリプト

オートデスクでは、ランタイムでナビゲーションを統合するための一連の Lua スクリプトを提供しています。これらのスクリプトは core/gwnav/lua/runtime に配置されているため、プロジェクト内で利用できます。

Navigation World

統合するためのメイン コンポーネントは Navigation World です(navworld.lua が必要)。

このオブジェクトから以下を実行できます。

初期化

レベルの初期化中に NavWorld オブジェクトを作成します。

function MyGame:init()
    self.navworld = NavWorld(world, level)
end

各値の意味は次のとおりです。

更新

Navigation World はフレームごとに更新する必要があります。視覚的なデバッグを行うためにメインのゲーム カメラを送信することもできます。こうすると、ゲームに接続されている場合に、Navigation Lab のカメラがご使用のゲーム カメラと一致するようにできます。

function MyGame:update(dt)
    self.navworld:update(dt)
    self.navworld:visual_debug_camera(self.maincamera)
end

ワールドに NavData を追加するには:

function MyGame:init()
    local nav_data = self.navworld:add_navdata("levels/empty")
end

ワールドから NavData を除去するには:

    self.navworld:remove_navdata(nav_data)

ゲームの呼び出し中に、ナビゲーション メッシュをレンダリングするには:

self.navworld:debug_draw(gui, line_object)

インストールされた Gui および LineObject をこの関数に渡す必要があります。また、ワールドに一部の NavData を追加する必要もあります。

シャットダウン

function MyGame:shutdown()
    self.navworld:shutdown()
end

ボット

NavWorld にボットを追加するには:

local configuration = NavBotConfiguration()
-- You can change any parameters of the configuration:
configuration.height = 1.8
local navbot = self.navworld:init_bot_from_unit(unit, configuration)

NavWorld からボットを除去するには:

navbot:shutdown()

ボックスの障害物

ボックスの障害物を作成するには:

local box_obstacle = NavBoxObstacle(navworld, unit)
box_obstacle:add_to_world()
box_obstacle:remove_from_world() -- obstacles is not destroyed, just no longer present in world

navworld は、この障害物が存在する NavWorld です。unit は、ボックスの障害物を関連付ける Unit です。これは次のスクリプトデータに従って設定されます。

円柱の障害物

円柱の障害物を作成するには:

local cylinder_obstacle = NavCylinderObstacle(navworld, unit)
cylinder_obstacle:add_to_world()
cylinder_obstacle:remove_from_world() -- obstacles is not destroyed, just no longer present in world

navworld は、この障害物が存在する NavWorld です。unit は、円柱の障害物を関連付ける Unit です。これは次のスクリプトデータに従って設定されます。

障害物を破壊するには:

box_obstacle:shutdown()
cylinder_obstacle:shutdown()