jaijai’s blog

Cities Skylinesアセット作成に関するメモ・考察

犬テンプレート

バニラの犬は超デカイなと常々感じていたので先日コーギーを作成しました。同じように感じていた方々が多かったのかはわかりませんが、思いのほか反響は大きく犬需要は高いようです。

Citizenの犬

犬のアセット数は非常に少なく、これの理由として作成難度が高いのではないかと想像していましたがそうでもありませんでした。ただ、建物や乗り物とはお作法が幾分違います。わかってしまえばけっこうあっさりできちゃいます。犬アセットがもっと増えることを願って、ここに作成方法をまとめるとともにBlender2.9用ファイルをテンプレートとして公開します。

Citizenアセットの作成方法についてはSteam Community :: Guide :: Citizen Asset Editor Tutorialを大いに参考にしています。基本的に上記のガイドを読めばテンプレートに頼らずとも作成できます。先達の方々に感謝します。

用意すべきファイル群

メッシュ

メインメッシュとなるFBXファイルにはアーマチュア(ボーン)を含んでいる必要があります。エクスポート設定については後述。

テクスチャ

_iを使わない以外は通常と同じです。_cも機能します。

LoD

LoDは正しく機能させるには通常通りLoDを用意した後にスクリプトを走らせる必要があります。また、LoDはアニメーションしませんので歩いている状態が好ましい(らしい)。

テンプレート

DogTemplate1.zip - Google ドライブからダウンロードしてください。Blenderファイルが1つとPNGファイルが2つ含まれています。Blenderファイルはバージョン2.9で保存したものなので2.7x系では読み込めません。

steamcommunity.com 柴犬のファイルも公開しています。shiba.zip - Google ドライブ
こちらのファイルでは頂点ウエイトを全般的に見直しておりアニメーション品質が向上しています。localScaleは0.68です。

このテンプレートをそのままアセット化するとバニラ犬とほぼ同じになります。左側がテンプレートによるもので右がバニラ犬です。よく観察すると解像感や色合いの違いがわかります。

バニラではテクスチャサイズは128x128ですがこのテンプレートでは256x256です。バニラテクスチャをwaifu2xによってリサイズし明度彩度の調整を加えています。

Blenderで読み込む

Blenderdog_template1a.blendファイルを開いた状態です。

既にリギング(アーマチュアとの関連付け)とウェイトペイントは完了しているので後はメッシュを好き勝手していくだけです。

メッシュを変更したらアーマチュアでポーズモードにして実際にボーンを動かして確認します。

BlenderではCtrl+Tabで簡単にウェイトペイントモードに移行できます。アーマチュアにおいてもCtrl+Tabでポーズモードの切り替えが手早く行えます。

アーマチュアの制限

CSLにインポートするとボーンの位置、角度と大きさはCSLのものが使われるのでBlenderではアーマチュアを編集しないことを強く推奨します。またモーションも変更できません。つまり、バニラのボーンにいかに上手に自分のメッシュを合わせるかが重要になってきます。ウェイトペイントの結果はインゲームで何度も確認することになります。

全体のスケールだけはインポート時に変更可能なのでひとまずここではボーンに合わせてメッシュを作ります。

LoD

インポート時に自動生成されるLoDは明らかに異常なので必ず自前で用意する必要があります。テンプレートにはバニラ犬をダンプしたメッシュが含まれています。

エクスポート

メインメッシュとアーマチュアが選択された状態で次の設定でエクスポートしてください。

インポート

  1. ファイル群
    最低限メインfbx_dが必要です。必要に応じて_s_n_cを追加してください。

  2. テンプレート選択
    必ずCitizenのDogを選びます。

  3. モーション確認
    インポートすると巨犬が出現しますがCitizenはこうなるらしいので気にしないでください。
    時間を動かすとモーションも動きます。ドシンドシン
    Preview animationを変更して違うモーションでも正しく動くのか確認します。

  4. 大きさを変える
    Ctrl+Eを押してModToolsのScene Explorerを開きShow edited prefabを押し現在のPrefabを表示します。

    transformのEvaluateを押して展開します。

    localScaleのxyzそれぞれの値を変更します。半分にするなら0.5です。

    アセットエディタ上でも直ぐに反映されて小さくなりました。これでバニラ犬の半分のサイズです。

  5. LoD
    通常通りインポート時に読み込ませます。その後、次のスクリプトを走らせます。
    CitizenInfo citizen = ((CitizenInfo) ToolsModifierControl.toolController.m_editP - Pastebin.com
    注意点として、上述のlocalScaleの変更はLoDには影響しません。よって、localScaleによる変更後の大きさに合わせてLoDを作る必要があります。

  6. 保存
    特に変わりません。通常通り保存します。

  7. インゲームで確認する
    実際にゲームをプレイし正しく動作するのか確認します。
    小さい犬が出現し動作しています。

最後に

今までまともにボーンをいじったこともなくCitizenを作るのは初めてで、紹介した方法よりもっといいやり方があるかもしれません。間違いや改善の指摘は遠慮なくTwitterもしくはDiscordまで。