ダークソウル3駅伝くじ担当後記
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

ダークソウル3駅伝くじ担当後記

2018-02-15 10:46

     あちこちの TS を覗き見してたら、ルーレットのソフトに関して "MOD" "スカイリム" という話やコメがあった。その方々はここなんてまあ見てないと思うけど、一応念押ししておく。

     もう、去年の夏頃から SkyrimMOD じゃないですよ。

     ゲームエンジン Unity で作ってます。何か直すたびに Skyrim 立ち上げなおしてチェック、その都度数分待たされる状況に耐えられなくて、MOD はやめました。Skyrim の名残は、弓のグラフィックだけです。(いい加減ダークソウルのものに変えてもいいんだけど、特に必要ないのでやらない)



     今回は時間もあまり取れず、ルールに則して作るものの構想は練っていたものの、作業自体は2日くらいしかかけられなかった。

     で、その中で新たに作ったものは盾くらいかな。ほかは、前回のプレ駅伝同様、ダークソウルSteam版から持ってきたものばかり。

     おさらいも含めて作業の全容を書き記す。真似したい人は参考にどうぞ。
     でも商用データだからね、配布とか有料コンテンツ作ったらダメよ。実際、俺がやってることも、結構どグレーだと思う。(そもそもゲーム実況やマラソン企画自体がどグレーだから、毒も喰らわば、のつもりでやってまふ)
     というわけで、詳しい手順は示さない。例えそれを示しても、プログラミング初心者には越えられない壁が立ちはだかる。それを壁と感じない人でないと真似できないし、そんな人は俺が提示した情報だけで方法を探れるだろう。

     下記、下線は既存のもの。「自作ツール」としているところは俺の自作だけど、これも、探せば既存のものがあるかもね。

    ■ダークソウルからデータを抜く

     データ分解:UnpackDarkSoulsForModding を使う
      ・音声データ変換は、fsbext を使う
      ・BND, TPF の分解には、自作ツールを使う。無圧縮なので簡単
     データ分析:DSMODT が参考になる
      ・オブジェクトはエディットモードに入れば番号が分かる
      ・キャラクターはモーション番号群と hkxファイル群の状況から判断するとよい
      ・地形は総当りで一括変換してしまったほうが早い

    ■抜いたデータを parse する

     モデルデータとアニメーション:自作ツールで FBX ASCII に変換
      .flver:fmt_darksouls_flver_XML_with_root.py を Java プログラムに移植
      .hkx:対応するスケルトンとあわせて、convert-xml-hkx-kf で .kf に変換後、
       NifSkope を参考に作った上記ツールで FBX ASCII に同梱
      ・キャラクター、オブジェクト、地形のモデルデータが全て変換可能になる
      ・全て変換できれば、Normal、UV、Armature、boneWeights が揃う
     テクスチャ:
      .tpf:中身は単なる DDS。
       扱いやすくするために、自作Codec と Java の ImageIO で PNG に変換
      ・インタラクト表示やエリア名表示、アイテムアイコンなども全て .tpf に固まっている

    ■できたFBXを Unity にインポートする

     アセットリストにドラッグアンドドロップしたあと、3D空間に配置するだけ。
     地形の当たり判定として、Mesh Collider を自動的に設定するスクリプトを書いた。本来は要らない天井その他にも発生する。本格運用なら重たいかも知れないが、主観視点プレイヤーの Character Controller と、放った矢が適切にぶつかればいいだけなので無問題。

    m10_01_00_00(不死教区)区画の、"m32" から始まる地形データ群

    ■アンドレイさんのディテール
     アニメーションの再生は Animator を作って割り当てるだけなので容易だが、それだけではアンドレイさんにならない。ハンマーをアンビルに振り下ろしたと同時に音と火花を発生させたい。

     まずはアニメーションにイベント発生を追加するのだが、
     ・FBXの中にイベントを組み込めそうなのだが、書式をまだ知らない
     ・FBXアセットをいじったり分解するのが気持ち悪い
     ということで、持ってきたアニメーションには手をつけず、ループモーションと同じ長さの何もしないアニメーションファイルを別途作り、Syncレイヤーを作ってそこに入れ込み、イベントを足した。


     Base レイヤーの Working ステートに Sync して、Spark レイヤーの SparkEV アニメーションが実行される。


     だが Armature には何も作用しない。0:00 に火花、0:50 に音声再生するためのイベントを仕込んだだけ。

     アンドレイさんのハンマーがアンビルにぶつかるのは、0:00のタイミング。0:50 に音声再生するのは、抽出した音声ファイル c2640_hammer の冒頭に“遊び”があるため。0:00に再生したのでは遅延してしまう。

     音声再生には、AudioSource を使っているだけ。実物再現のため、塔の外に出てもある程度離れるまでは聞こえるよう、調整している。実際、企画中は一歩も出なかったから、意味なかったんだけど。

     火花には、Particle System を使っている。Unity Standard Assets の FireComplex (周囲の松明にも使っている)から、火花部分だけを抜き出し、周囲に飛び散るように調整しただけのもの。

    角度とかいろいろ違うんだけど、とにかく本物っぽくなった

     なお、Standard Assets (Legacy Image Effects) から Contrast Stretch, Screen Space Ambient Obscurance などを持ってきてカメラに追加し、画質向上をさせている。

    何も入れないとこんな感じ。何か安っぽくなる

    ■ルーレットのプログラム

     前回までは、「連続当選や3回以上の当選が無いよう、一部大学を抽選対象から抜く」という条件があった。

     Unity において、その都度盾の表面に図柄を書くのは難しい。
     予め SVG の原稿と Java プログラムで、想定されるすべての盾画像を自動生成し、ひとつのテクスチャファイルに収め、マテリアルの UV設定を適宜切り替えることで取り替えていた。
     面倒な手順だが、Skyrim MOD で盾を何十ヶも新規登録していたことに比べれば、遥かにマシである。

    こういうテクスチャを用意して

    こういう設定をし、あとは抽選履歴に応じて Offset の X, Y を適宜変えればよい。

     ところが今回は、当選するごとに面積が 1/2、1/4となり、3回当選するまでは抽選対象に残り続ける。盾の模様は、単純計算すると 4^5=1024通り。それだと実際にはありえない組み合わせも含まれるが、数百通りになるのは確実で、この方式では対応しにくい。

     なので今回は、盾に図柄を書くことにした。

     未当選の場合の重み付けを1、1回当選の大学は0.5とする。これを元に、各大学が 360度のうち何度を占めるかを決める。
     例:第1回抽選結果は罪の都。 
      ファラン:1/(1+1+0.5+1+1)=2/9→80deg。以下、罪の都以外は同。
      罪の都:0.5/(1+1+0.5+1+1)=1/9→40deg。

     Texture2Dを新たに生成し、ピクセルカラーを塗る。
     塗るべき円の外はオリジナルのまま。円の中は、中心点からの角度に応じて、該当する大学の色で塗る。これで下地の色が決まる。

    中心から一定以上遠いところは50%ブレンド

     テクスチャに文字を書くのが一番面倒くさい。ネイティブ環境や Java みたいに、強力な 2Dグラフィックスがあればいいんだけど、Unity標準だけだと到底出来ない。(ネイティブライブラリを呼び出しできれば描けるのかなーと思いつつ、勉強不足)
     結局どうしたかというと、文字を書いた透過テクスチャを貼り付けた Quad を、盾の表面に 5大学分用意して、適切に回転することで解決した。

    1回以上の当選の場合は、小さい文字のテクスチャに置き換える

    盾は丸みを帯びているので、Quad上に描かれた文字はうっすら浮いている

    ■LeapMotion でのエイム

     プレ駅伝でさらっと投入して、特に解説も何もしてないのだが、まあ、するべき内容も無い。LeapMotionを買って来て、Unity用のアセットをダウンロードして入れて、標準添付されてる手に弓をくっつけただけだ。
     PS4コントローラの□ボタンで弓を出現させ、盾を回転開始。リアルの左手の角度でエイムして、右手で R1ボタンを押して発射する、というだけのもの。
     右手でリアルな矢の番え、引き絞り、発射をするには、LeapMotion の認識範囲は狭すぎる。無理。残念。
     
    すべての要素のうち、この VR要素が、なんなら一番簡単

    ■その他ユーザインタフェース

     以前はソラールさんに接近して○ボタンを押すだけで、ささった矢の全消去が行なえるようにしていた。間違って触ってしまいそうであぶなっかしいので、事前確認するように修正した。

     素材は、これもダークソウルの .tpf から抜き出したもの。SVG の切抜き演算などを使って再現し、PNG素材に変換してから Unity に持ってきている。文字は似たようなフォントを使用。○ボタンのアイコンだけは無かったので、MOD Wiki にあった置換え画像から拝借。
     


    ■今後

     なんかやりたいことは全部やっちまったな、って感じ。
     くじに関するルーレット以外の案はあるけれど、それよりも、くじ以外の時間、ミラーしながらできることはないかな。
     例えば、無印のマラソン・駅伝であれば、現在進行箇所の鳥瞰図みたいなのが作れるかな、と思いつつ。転送とか骨片帰りとかがあって、ホントの駅伝のルートよりかなり複雑だからなー。
     あとは最後の結果発表。上から Softbody なボスオブジェクトが振ってきて、玉入れみたいに各大学の籠に入っていく、ちう感じの何か。その場合はクロノさんのPCで動かしてもらわんといけんけどね。

    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。