takeyohのおぼえがき

気になったこと、試したことの記録です。

エンジンスタートを実現する!

アセットコルサ(無印)はエンジンスタートの機能がありません。

最初からエンジンがかかっている状態です。(ACCにはそういう機能がついているみたいなんですが。)

エンストはするのですが、アクセルを踏むと自動で復活してしまうので、エンジンが止まった状態が作れないんですね。

 

なんかいい方法ないかな~、と調べていたら見つけたので、実際にやってみました。その覚書です。

 

まず、見つけたのはいつものWIKIです。

github.com

これ、車の物理制御を可能にするCSPの拡張機能です。

ac.accessCarPhysicsというファンクションを経由して、車の物理機能を制御することが出来ます。その代わりCSPのバージョンは0.1.77(一部機能は0.1.78)以降であることが必須条件です。

制御できるのは、車のステータスとして取得できるパラメータ全般です。

アクセルペダル(gas)やブレーキ、エンジンの回転数RPMなんかも可能です。

エンジンスタート(イグニッション)を実現するためには、

1)エンジンの回転数を0(停止)状態にすること

2)何かをトリガーにRPMを制御できること

3)それに合わせて、音が再生できること

が必要です。

今回は1、2と3に分けて、それぞれ実装しました。

あ、先にお伝えしておきますが、この方法は、dataフォルダに手を加えます。

ですので、オンラインサーバに入るときに使うcar modでは編集しない方が良いです。オンラインサーバに入れなくなります。

もしやりたいときは、car modを複製して、複製した方でお試しください。

 

まず、1,2の方です。

やり方は、dataフォルダにscript.luaというファイルを作って、下の内容を追記します。

(dataフォルダが無い場合は、data.acdを展開して、data.acdファイルをリネームします)

script.luaの中身

local counter = 0

function script.update(dt)
  if not car.isAIControlled then
    if not car.extraD then
      ac.accessCarPhysics().rpm = 0
      counter = 0
    elseif counter < 1.5 then
      if counter < 0.5 then
        ac.accessCarPhysics().rpm = 0
      else
        ac.accessCarPhysics().gas = 0.3
      end
      counter = counter + dt
    end
  end
end

今回イグニッションキーはextraDに割り当てをしています。

extraDがオフの状態(デフォルト)は、

ac.accessCarPhysics().rpm = 0

で、エンジンの回転数0をキープします。

これは、自分が操作するアクセルやブレーキよりも優先されるので、アクセルを踏んでも前に進みません。(エンジンが止まった状態を再現)

  elseif counter < 1.5 then ←(1)
    if counter < 0.5 then ←(2)

で、extraDをオンにすると、0.5秒間(上記(2))待った後、1秒間、アクセルペダルを30%踏むという処理をしています。(上記(1)はこの0.5+1秒間で1.5ということです。)

これによって、イグニッションが回った後、軽く回転数が上がってからアイドリングに戻る感じが再現できます。イグニッションの時間が仮に1秒の場合は、上記(2)を1、(1)を2に設定すればOKです。

で、extraDをオフにするとエンジンが止まった状態に戻ります。

(2023/2/15 追記)

  if not car.isAIControlled then

この条件文はこのcar modがAI車両として動く場合は、それ以降の処理を行わないようにするためです。AI車両として使う予定がないcar modでは必要無い処理ですが、入っていても動作に影響はありません。

 

そして、このdataフォルダ内に作ったluaスクリプトを動作させるには、car.iniのヘッダセクションを変更する必要があります。

[HEADER]
VERSION=extended-2

extended-2という拡張バージョンに設定する必要があります。標準の1や2だと、luaスクリプトは動きません。

これで車の物理制御はOKです。

ちなみに、extended-2に変えたら、タイヤが空転して前に進まないという事象が発生することがあります。

これは、タイヤ設定(tyres.ini)のバージョンが低いことが原因です。extended-2で利用可能なのはtyres.iniのHEADERが”VERSION=10"のものです。
7とかそれ以前の車もあると思います。ただ、VERSIONを単純に10にしただけでは改善しません。VERSION10用の設定が不足しているためと思われます。

が、それが細かく特定できていないので、VERSION10が設定されている車のタイヤ設定に差し替えた方が早いです。

 

次に音です。

これは、可能であればsfxにあるbankファイル(音源ファイル)を自作できる方であれば、internal externalのそれぞれのエンジン音に組み込んで実装する方が車内車外で音が切り替えられますし、スマートなやりかただと思うのですが、bankファイルを作るのは難しいよね~とか、他の車のbankファイル使ってるから編集はできないんだよね~ということもよくあるかと思いますので、今回は音の方もluaスクリプトで制御します。

まずエンジンスタート時の音源を用意します。(これはご自身で作るなり、どこかから持ってくるなりでお願いします。)

エンジンをふかす音まで入れてしまうと、実際の車のエンジン音と異なり違和感が出ますので、ここで作成する音データには、イグニッションの音(キュルキュルの部分)だけを入れておくのがコツです。その後の「ブォーン」はアクセル30%1秒間の処理で勝手に音が出てくれます。

wavでもmp3でもどちらでもOKです。今回はengine_start.mp3というファイル名にしました。このファイルをextensionフォルダに格納します。

luaスクリプトをext_config.iniに直接書き込んでも良いですが、メンテのしやすさを考えて、スクリプトは別ファイルにして、ext_config.iniから呼び出す形にしました。

extenionフォルダ内にsound.lua(今回はとりあえずこの名前にしました)を作成します。テキストファイルでよいです。拡張子にご注意ください。

で、sound.luaファイルに以下を記述します。

local sound = ui.MediaPlayer()
sound:setSource('./engine_start.mp3')
sound:setLooping(false)
local flag = 0

function update(dt)
  if car.extraD and flag == 0 then
    sound:play()
    flag = 1
  end

  if not car.extraD then
    flag = 0
  end

end

単純でして、extraDがオンになったら、engine_start.mp3を再生する。というものです。でextraDがオフになったら、初期状態に戻す、です。

これで、1つ目のスクリプトでエンジンがかかると同時に、2つ目のスクリプトでエンジンスタートの音が1回再生されることになります。

sound.luaが作成出来たら、ext_config.iniにこのluaスクリプトを読み出す設定を追加します。

ext_config.iniに以下の2行を追記します。

[SCRIPT_...]
SCRIPT = "sound.lua"

これで、音が出るようになると思います。

 

同じluaスクリプトなんだから、どちらかにまとめて記載できればうれしいのですが、物理制御機能はdataフォルダでしか実装できず、音の再生はextensionフォルダでしか実装できなかったので、仕方なく2つに分けて作っています。

 

今回はextraDキーを使いましたが、他のextraキーなどへ変更することも可能です。

ちなみにextraDキーはデフォルトだとaltキー+テンキーの+(プラス)です。

または、パッドやハンコンであればキー設定すればそれでもOKです。

 

以上です。

お気に入りの車があれば、お試しください。

ファイルを編集するときは、編集前のファイルをバックアップしておくことを強くお勧めします。

最後にエンジンを始動・停止させている様子はこちら!

youtu.be

/* -----codeの行番号----- */