BeamNG.driveでレースをする方法をまとめてみました。
扱いやすさとレースっぽさのバランスを考えるとこの3つだと思っていますが、もし、これ以外の方法でオススメがあれば教えてほしいです。
シナリオ (公式&Mod) | ScriptAI | AI パスモード | |
---|---|---|---|
使い方 | 簡単 | めんどい | めんどい |
AIの挙動 | イマイチ | 頑張ればレースっぽい動きにはなるが… | イマイチ |
UI | レースっぽいUI | 無し | 無し |
自由度 | 予め用意されたもののみ | 高い | 高い |
1.公式・Modのシナリオでレースをする
これはもう説明不要ですが、[Main Menu]->[Scenarios]で、レースのシナリオを選択するだけです。
例えば、以下のようなものがあります。
一番簡単で一番レースっぽいレースができます。
また、Modであれば、”Scenarios”のカテゴリで検索すると出てきます。
○○Race Week等が有名かと思います。
このようにとても簡単にレースが楽しめるこの方法ですが、一つ欠点があります。
それは
「公式やModで用意された設定でしかレースができない」
という点です。
シナリオを改造すればカスタマイズは可能かもしれませんが、改造するくらいであれば、後述の方法の方がまだ簡単な気がします。
2.Script AIを使用する
次は、BeamNG.driveの公式機能であるScript AIを使って、AIとレースをする方法です。
Script AIは、プレイヤーが走ったルートをAIが真似して走ってくれる、という機能です。
これを使ってレースの動きをAIに設定しておくことで、AIと疑似的にレースを行うことが可能となります。
ただ、この方法には2つ欠点があります。
- ここで設定したAIはプレイヤーが設定した速度・ルートを忠実に再現しようとするため、「車を避ける」といった動作はできません。
- AIの動きに凝り始めると設定にクッソ時間がかかります。
このように欠点はあるのですが、凝った設定ができると一番レースっぽい画が撮れるので難しいところです。
では、Script AIの設定方法を説明していきます。
Script AIの使い方
Script AIを設定するためには、Script AI Managerを使用します。
まずは、Script AI Managerの開き方です。
Script AI Manager
①ゲームを開始している状態で、F11キーを押し、World Editorを開きます。
②World Editorを開いたら、[Window] -> [Gameplay] -> [Script AI Manager]を選択します。
これで、Script AI Managerが使えるはずです。
なお、Script AI Managerのインターフェイスは以下の通りです。
Script AIの設定
あとは、車両にAIの設定を行うだけです。
AIの設定は、Script AI Managerを使えばとても簡単です。
①●をクリックして記録開始
②AIに走ってほしいルートを自分で運転
③■をクリックして記録終了
これで設定は完了です。
とっても簡単ですね。
あとは、▶をクリックするとAIがルートを真似して走ってくれますので、この状態で別車両を出して自分で走れば疑似的なレースができます。
ただ、冒頭でも言いましたが、パスの設定(②の運転の仕方)でAIの動きがかなり変わるため、凝り始めると無限に時間がかかります。
適度に妥協しつつ設定しないとあっという間に時間が溶けるのでくれぐれもご注意ください。
3.AIのパスモードを使用する
最後は、BeamNG.driveのAIのパスモードを使用する方法です。
これは指定した座標をAIに順番に走ってもらうモードです。
これで例えばサーキットに設定された座標を順番に走るように設定するとAIとレースができる、という訳です。
ただ、↑で紹介したScriptAIの方法と比べると、走行ラインや速度がイマイチです。
また、座標を設定する必要があるためScript AI同様、設定が手間です。
その反面、車両を避ける動作を設定できたり、一度ルートさえ決めてしまえば、あとはコピペするだけで何台にも設定できたりと、複数台でのレースの場合はこちらに軍配が上がるかもしれません。
AIパスモードの設定方法
座標(waypoint)のIDを控える
この方法では、AIに座標(waypoint)を設定する必要があるため、まずはそのIDを調べます。
これはWorld Editor(F11キー)でNavigraphをデバッグ表示することで見ることができます。
ここで調べたIDは次のコマンドで使用するのでメモしておいてください。
- “DecalRoad12345_67″のようなIDはゲームの起動毎に前半の12345の部分が変わります。再起動時は、前半部分だけ再度調べて一括置換するようにしてください。
- IDは走らせたいルート上のID全てを控える必要はありません。
ただし、複数のルートが存在する場合は、どちらのルートを通ってほしいかが分かるようにIDを指定する必要があります。- 例えば、以下のようなルートがあった場合、1と10だけを指定すると、AIは①のルートを選択してしまいます。
②を通らせたい場合は、1-7-10のように指定してあげる必要があります。
・①1-2-3-4-10
・②1-5-6-7-8-9-10
- 例えば、以下のようなルートがあった場合、1と10だけを指定すると、AIは①のルートを選択してしまいます。
AIをパスモードで走らせるコマンドを作成
次に、AIをパスモードで走らせるコマンドを作成します。
コマンドのフォーマットは以下の通りです。
ai.driveUsingPath{<パラメータ(下表参照)>}
パラメータ名 | 意味・設定例 |
---|---|
wpTargetList | 指定必須。AIに走らせたいルートのIDを指定する。 例:{‘ID1’, ‘ID2’, ‘ID3’} |
wpSpeeds | ルートのIDを通過する速度を指定する。単位は[マイル/秒]。 例:{ID1 = 10, ID2 = 20, ID3 = 30} |
noOfLaps | 周回数を指定する。 ※wpTargetListで閉じたルート({‘ID1’, ‘ID2’, ‘ID3’, ‘ID1’} )を設定しないと無効なので注意 例:noOfLaps = 3 |
driveInLane | 逆走やレーンのはみ出しを意識するかどうかを指定する。 例:driveInLane = ‘on’ |
avoidCars | 他車を避けるかどうかを指定する。 例:avoidCars = ‘on’ |
aggression | AIの運転の積極性を指定する。 0.3-1.0の範囲で指定可能。0.3→日常の運転、1.0→(AIの)限界走行。 ※と書いてあったけど、1.0を超えた値を設定すると更に運転が過激になる気がする。 例:aggression = 1.0 |
すべてのパラメータを指定すると、以下のようなコマンドとなります。
ai.driveUsingPath{wpTargetList={'ID1', 'ID2', 'ID3', 'ID1'}, wpSpeeds={ID1=50, ID2=60, ID3=40}, noOfLaps = 3, driveInLane = 'off', avoidCars = 'on', aggression = 1.0}
コマンド実行
コマンドが完成したら、あとはSystem Consoleでコマンドを実行するだけです。
AIを設定したい車両を選択し、コマンドを貼り付けて[execute]をクリックします。
以前記事にまとめたのでご参考ください。
https://games.mathkuro.com/2022/01/beamng-commands/
これで、パスモードのAIとレースっぽいことができます。
と、さも簡単そうに方法を説明しましたが、皆様お気づきの通り、この方法はIDを調べるのがとても面倒なんです。
それに、wpSpeedsで速度に凝り始めるとScriptAI同様沼にはまります。
「動きがScriptAI以下でScriptAI並みに面倒ならイマイチじゃね?」と思われるかもしれませんが、
複数台の設定だとコピペが効く分この方法の方が少し楽なんです。。。
最後に、コピペの恩恵を皆様にもおすそ分けです。
私が使ったことがあるパスをメモしましたので、コマンド作成のベースにご利用いただければと思います。
おまけ:コピペ用のコマンド
- XXXの部分はゲームを起動するごとに値が変わる可能性がある部分です。
(適宜置換してください) - IDはBeamNG.drive v0.24.1.1時点のものです。
Hirochi Racewayの8の字コース(figure8)
開始位置は入り口側でHirochi Racewayの看板方向にスタートです。
ai.driveUsingPath{wpTargetList={'derby_wp4', 'derby_wp5', 'derby_wp6', 'derby_wp7', 'derby_wp8', 'derby_wp9', 'derby_wp10', 'derby_wp11', 'derby_wp12', 'derby_wp13', 'derby_wp14', 'derby_wp15', 'derby_wp16', 'derby_wp17', 'derby_wp18', 'derby_wp19', 'derby_wp20', 'derby_wp21', 'derby_wp22', 'derby_wp23', 'derby_wp24', 'derby_wp25', 'derby_wp26', 'derby_wp27', 'derby_wp1', 'derby_wp2', 'derby_wp3', 'derby_wp4'}, noOfLaps = 3, driveInLane = 'off', avoidCars = 'on', aggression = 1.0}
Hirochi Raceway(フルレイアウト)
開始位置はホームストレートでグリッドに並べるといい感じにスタートします。
ai.driveUsingPath{wpTargetList={'hr_start', 'DecalRoadXXX_10', 'DecalRoadXXX_21', 'DecalRoadXXX_30', 'DecalRoadXXX_40', 'DecalRoadXXX_50', 'DecalRoadXXX_60', 'DecalRoadXXX_70', 'DecalRoadXXX_80', 'DecalRoadXXX_90', 'DecalRoadXXX_100', 'hr_bridge1', 'hr_bridge4', 'quickrace_wp4', 'quickrace_wp11', 'hr_start'}, noOfLaps = 3, driveInLane = 'off', avoidCars = 'on', aggression = 1.0}
grid_map_v2のオーバル(西側にある奴)
開始位置はMAP中央寄りのストレートで左回りです。
ai.driveUsingPath{wpTargetList={'DecalRoadXXX32_1', 'DecalRoadXXX31_1', 'DecalRoadXXX36_53', 'DecalRoadXXX36_2', 'DecalRoadXXX34_54', 'DecalRoadXXX34_2', 'DecalRoadXXX32_1'}, noOfLaps = 3, driveInLane = 'off', avoidCars = 'on', aggression = 1.0}
Industrial Siteのサーキット(ロードコース外周)
開始位置はホームストレートで右回りです。
ai.driveUsingPath{wpTargetList={'DecalRoadXXX_30', 'DecalRoadXXX_31', 'DecalRoadXXX_32', 'DecalRoadXXX_33', 'DecalRoadXXX_35', 'DecalRoadXXX_1', 'DecalRoadXXX_2', 'DecalRoadXXX_3', 'DecalRoadXXX_4', 'DecalRoadXXX_5', 'DecalRoadXXX_6', 'DecalRoadXXX_7', 'DecalRoadXXX_8', 'DecalRoadXXX_9', 'DecalRoadXXX_10', 'DecalRoadXXX_11', 'DecalRoadXXX_12', 'DecalRoadXXX_13', 'DecalRoadXXX_14', 'DecalRoadXXX_15', 'DecalRoadXXX_16', 'DecalRoadXXX_17', 'DecalRoadXXX_19', 'DecalRoadXXX_20', 'DecalRoadXXX_21', 'DecalRoadXXX_23', 'DecalRoadXXX_24', 'DecalRoadXXX_25', 'DecalRoadXXX_26', 'DecalRoadXXX_27', 'DecalRoadXXX_29', 'DecalRoadXXX_30'}, noOfLaps = 3, driveInLane = 'off', avoidCars = 'on', aggression = 1.0}
west USAでストリートレースの例
開始位置はデフォルトのスポーン地点からスタートするといい感じになります。
ai.driveUsingPath{wpTargetList={'wpTown_6', 'wpTown_19', 'wpTown_2', 'wp_town10', 'wp_town11', 'wpTown_6'}, noOfLaps = 3, driveInLane = 'off', avoidCars = 'on', aggression = 1.0}
※街にコースを設定する場合は交差点毎にポイントを設定すれば良い感じに走ってくれる気がします。
west USAのサーキット(フルレイアウト)
開始位置はホームストレートでグリッドに並べるといい感じにスタートします。
ai.driveUsingPath{wpTargetList={'DecalRoadXXX_1', 'DecalRoadXXX_10','DecalRoadXXX_20', 'DecalRoadXXX_30', 'DecalRoadXXX_40', 'DecalRoadXXX_51', 'DecalRoadXXX_60', 'DecalRoadXXX_70', 'drag_5', 'drag_7', 'DecalRoadXXX_85', 'DecalRoadXXX_95', 'DecalRoadXXX_105', 'DecalRoadXXX_115', 'DecalRoadXXX_125','DecalRoadXXX_135', 'DecalRoadXXX_145', 'DecalRoadXXX_155', 'DecalRoadXXX_160', 'DecalRoadXXX_1'}, noOfLaps = 3, driveInLane = 'off', avoidCars = 'on', aggression = 1.0}
west USAのオーバルコース
開始位置は入り口側のストレートで、左回りです。
ai.driveUsingPath{wpTargetList={'DecalRoadXXXXX_7', 'DecalRoadXXXXX_8', 'DecalRoadXXXXX_12', 'DecalRoadXXXXX_16', 'DecalRoadXXXXX_17', 'DecalRoadXXXXX_20', 'DecalRoadXXXXX_1', 'DecalRoadXXXXX_5', 'DecalRoadXXXXX_7'},noOfLaps = 3, driveInLane = 'off', avoidCars = 'on', aggression = 1.0}
Automation trackのサーキットフルレイアウト(※バグってます)
AIのwaypointの座標がバグっていて、終盤のタイヤバリアに100%衝突します。
ai.driveUsingPath{wpTargetList={'DecalRoad12586_5', 'DecalRoad12596_7', 'DecalRoad13015_2', 'DecalRoad13015_3', 'DecalRoad13015_4', 'DecalRoad13015_5', 'DecalRoad13015_6', 'DecalRoad13015_7', 'DecalRoad13015_8', 'DecalRoad13015_9', 'DecalRoad13015_10', 'DecalRoad13015_11', 'DecalRoad13015_12', 'DecalRoad13015_13', 'DecalRoad13015_14', 'DecalRoad13015_15', 'DecalRoad13015_16', 'DecalRoad13015_17', 'DecalRoad13015_18', 'DecalRoad13015_19', 'DecalRoad13015_20', 'DecalRoad13015_21', 'DecalRoad13015_22', 'DecalRoad13015_23', 'DecalRoad13015_24', 'DecalRoad13015_25', 'DecalRoad13015_26', 'DecalRoad13015_27', 'DecalRoad13015_28', 'DecalRoad13015_29', 'DecalRoad13015_30', 'DecalRoad13015_31', 'DecalRoad13015_32', 'DecalRoad13015_33', 'DecalRoad13015_34', 'DecalRoad13015_35', 'DecalRoad13015_36', 'DecalRoad13015_37', 'DecalRoad13015_38', 'DecalRoad13015_39', 'DecalRoad13015_40', 'DecalRoad13015_41', 'DecalRoad13015_42', 'DecalRoad13015_43', 'DecalRoad13015_44', 'DecalRoad13015_45', 'DecalRoad13015_46', 'DecalRoad13015_47', 'DecalRoad12509_2', 'DecalRoad12510_2', 'DecalRoad13015_49', 'DecalRoad13015_50', 'bridge_dam_a', 'bridge_dam_b', 'DecalRoad12801_2', 'DecalRoad12801_3', 'DecalRoad12801_4', 'DecalRoad12801_5', 'DecalRoad12801_6', 'DecalRoad12801_7', 'DecalRoad12533_6', 'DecalRoad12801_9', 'DecalRoad12801_10', 'DecalRoad12801_11', 'DecalRoad12801_12', 'DecalRoad12801_13', 'DecalRoad12801_14', 'DecalRoad12801_15', 'DecalRoad12801_16', 'DecalRoad12801_17', 'DecalRoad12801_18', 'DecalRoad12801_19', 'DecalRoad12801_20', 'DecalRoad12801_21', 'DecalRoad12801_22', 'DecalRoad12801_23', 'DecalRoad12801_24', 'DecalRoad12801_25', 'DecalRoad12801_26', 'DecalRoad12801_27', 'DecalRoad12801_28', 'DecalRoad12801_29', 'DecalRoad12801_30', 'DecalRoad12801_31', 'DecalRoad12801_32', 'DecalRoad12801_33', 'DecalRoad12801_34', 'DecalRoad12801_35', 'DecalRoad12801_36', 'DecalRoad12801_37', 'DecalRoad12801_38', 'DecalRoad12801_39', 'DecalRoad12801_40', 'DecalRoad12801_41', 'DecalRoad12801_42', 'DecalRoad12801_43', 'DecalRoad12801_44', 'DecalRoad12801_45', 'DecalRoad12801_46', 'DecalRoad12801_47', 'DecalRoad12801_48', 'DecalRoad12801_49', 'DecalRoad12801_50', 'DecalRoad12801_51', 'DecalRoad12801_52', 'DecalRoad12801_53', 'DecalRoad12801_54', 'DecalRoad12801_55', 'DecalRoad12801_56', 'DecalRoad12801_57', 'DecalRoad12801_58', 'DecalRoad12801_59', 'DecalRoad12801_60', 'DecalRoad12801_61', 'DecalRoad12801_62', 'DecalRoad12801_63', 'DecalRoad12801_64', 'DecalRoad12801_65', 'DecalRoad12801_66', 'DecalRoad12801_67', 'DecalRoad12801_68', 'DecalRoad12801_69', 'DecalRoad12801_70', 'DecalRoad12801_71', 'DecalRoad12801_72', 'DecalRoad12801_73', 'DecalRoad12801_74', 'DecalRoad12801_75', 'DecalRoad12801_76', 'DecalRoad12801_77', 'DecalRoad12801_78', 'DecalRoad12801_79', 'DecalRoad12801_80', 'DecalRoad12801_81', 'DecalRoad12801_82', 'DecalRoad12801_83', 'DecalRoad12801_84', 'bridge_pit_a', 'bridge_pit_b', 'DecalRoad12586_2', 'DecalRoad12507_1', 'DecalRoad12586_4', 'DecalRoad13039_1', 'DecalRoad12511_1', 'DecalRoad12586_5'}, noOfLaps = 1, aggression = 1.2}
コメント