• ダークソウル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で動かしてもらわんといけんけどね。

  • 広告
  • ブラッドボーンゼロゼロ物件、Lv4よいこらせ

    2018-01-09 03:26
    以前のエントリの続き。DLCのボス撃破、NPC撃破、アイテム取得がようやく終わった。

    【ボス】
    ・失敗作たち  そこそこ苦戦
    ・マリア    かなり苦戦
    ・ローレンス  普通に苦戦
    ・ゴースの遺子 大苦戦(特盛)

     マリアはパリィなしでの勝利を目指していたが、諦めた。最終形態には、せいぜい1回くらいしかいけなかったと思う。パリィありに切り替えてからは、苦戦というほどでもなく勝利。パリィ禁止は、壊れ無強化のときに、必ずやろう(というか、拳銃は壊せないので使用不可。レイテルを使わない限りパリィできないのよね)。
        
     ゴースの遺子を倒すにあたって、相当量のマラソンを敢行。愚者の血晶石×3、貧者の血晶石×1を入手。聖杯のものほどではないが、かなり心強い状態にできた。そろそろ、そんなん無くても勝てる腕前があると思ってたが、甘かったー。一発死だらけはやっぱりきつい。

     で、その血晶石を持って、保留しておいたNPC達を悠々とやっつけにいく、大人気ないおじさん。

    【NPC等】
    ・ガトリング   初戦勝利。隠れ続けて溜め→L1の繰り返しですぐ勝てた
    ・血に乾いた獣  そのままハシゴして、こっちも初戦勝利
    ・オト狩人証持ち 苦戦。最後は斧槍でぶーんぶーん。リーチのあるもんが勝つんじゃあ!
    ・教会の槍    初戦?勝利。扉ハメじゃあ!
    ・聖堂の2人   苦戦。1人ずつ頑張って倒した
    ・お兄さん    妹のところで戦ってたら落ちていったので、
             以後かくれんぼなどしつつ楽しく攻略
    ・ブラドー    取れる"だろう”パリィ祭り
    ・井戸巨人    大苦戦。祭祀者の骨の刃に手を出すが、活用しきれず。
             結局、2体の状態を経て普通に攻略

     漁村の方々は炎に弱めなので、まずメンシスの悪夢で放射型の炎をせしめてきて、鉈に投入(放射全強化15%、放射炎12%、欠け型炎12%)。

     ・灯り付近で弾丸補充→井戸にダッシュして落ちる、で大ダメージ状態
     ・パリィ or バクスタ→歓び×2+爪痕で完全回復
     ・致命は積極的に取らず、周囲をくるくるしながら削る。その方が早い
     ・HP半分になって一旦逃げて帰ってきたところに油壺
     ・炎の鉈+10でうまく溜め攻撃が入ると、油壷効果で約1200入る

     という流れ。逃げて帰ってきた時点でHPは2700くらい? なので、「油壷+溜め」2回+αで削れる。ばたばたしてしまって削りきれず、2体同時に相手することになってしまったが、あとは運を天に任せて何とか勝った。やっててよかったメンシスマラソン。
     最初は、DLCで拾える傾炎も入れた斧+9を使うつもりで居た。それだと1300超えるんで期待してたんだけど、スタミナ食うし溜めが遅いし、イマイチだった。

    ■次回本編に戻る

     ヴァルトール・マダラスを倒す。DLCと同時期に追加されたけど、一応本編要素っつーことで、血晶石は本編の物だけを使う。DLCの血の岩で鉈+10をもうひとつ作ったが、これも使用禁止。
     その後の乳母以降も同様。
     どれもそれなりに苦戦するだろうけど、ゴースの遺子と比べたら、もう消化試合だね。

    ■聖杯

     2周目に入ったら、以下のルールで聖杯攻略を行なう。俺ぁこれを楽しみにしてるんだ。

     ・血石、血晶石、一般消費アイテムをほぼ全て捨てる
     ・カレル文字は捨てないが、封印する
     ・再び初期武器を選び、+0で聖杯に入る

     以後、

     ・ドロップor配置で手に入った消費アイテムは購入・取引が開始できる
     ・汎聖杯でカレル文字が手に入ったら、本編のものも封印が解ける
      (「月」は本編でしか手に入らないので、封印対象から除外)

     とする。

     武器を捨てることも検討したが、盾、松明など、手に入らないものが出てきてしまうし、武器はどうせ鉈、斧、槍、杖、あとは短銃・散弾銃とガラシャの拳くらいしか装備できないので、全部売り払ってもう一度買い揃え、+0にリセットするだけでも十分面白いと思う。

     どうなるかあまり読めないが、なんにせよ「二欠片ほちいよー」「血晶石ほちいよー」「発火ヤスリ落としてよー」をしばらく経て、その後「塊ほちいよー」「まぢむり・・・秘薬探しにイズ行こ・・・」みたいなことが始まるのではないかな、と期待。右往左往してこそ縛り攻略。最初は苦しく、不自由で、それが技術や努力で解消されるからこそ、ゲームは面白い。
  • 【最新バージョンでは直ってました】GrabPass でクラッシュ

    2018-01-05 19:57
    (追記あり)なんかちょっと胡乱さが残るんだけど、とにかく 5.6.5f1 では直ってました。

     Unity Editor で急にクラッシュが頻発するようになった。

     諸々調べていたら、
      ・GrabPass を行なう Shader が使われており、
       ・かつ、そのオブジェクトが表示され、実際に GrabPass が行なわれたとき
      ・Unity Editor で Scene ビューが表示されており、
       ・かつ、lighting toggle スイッチがオンであるとき
    という条件で起こることが分かった。
     
     ライティングなんて Game ビューで確認できれば十分だから、オフでも問題ない。最近までずっとクラッシュなんか無かったから、多分、間違って触ってオンになっちゃったんだね。

    これね

     ただし、別のプロジェクトで同じ条件にしても発生しなかった。したがって、まだ何か条件がある。シェーダー/ライティングがらみと言うことは、おそらく Quality セッティングか何かをいじれば再現するんだろうけど、クラッシュ発生するプロジェクトでも Game ビューだけなら発生しないし、アプリケーションビルドした場合もまったく問題ないので、ちょっと違うかもしれない。
     どの道、現象は「クラッシュ」なので、俺の書いたコードのせいでフリーズ、という話ではない。結局のところ、腫れ物に触らないような予防策しか取れないだろう。

     "GrabPass Clash" で検索しても、困ってる人は世界に2人しか見つからなかった。
     ここ数年、何かで躓いて、原因が特定できそうなとこまでいくのはいいものの、同じ問題にぶち当たってる人はほんの数人、「私のところでは問題ないですけどぉ」回答で済まされ、何も参考にならん、ってことが多い。
     うーん、世界で俺含めて3人だけなんてことあるか? 他の人たちは質問したり追求したりする前にさっさと諦めてしまったんだろうか? それともあっさり原因を特定してしまったのだろうか。
     まあ、俺自身フォーラムに相談するでもなし、さりとて原因特定してるわけじゃないので解決法を書き込めるでもなし、ここに日本語の中途半端な駄文を書くに留めてるんだけど。でも一応バグレポートは出しておいたから、赦して、世界。

    (追記)バグレポートのお返事が来た。ちゃんと個別にしてくれるのね! しかも早い!
    だが、Unityさんが示してくれた「こういう報告を受けて直しましたよ」と示されたリンク先の内容は、全然無関係。多分誰か別の人への回答と入れ替わってたんかな・・・。

     その後バグ報告のデータベースを探ってみて、よく似た奴(938877)を発見。応急処置的には、Player Setting で DX11 を使わないように設定すればいいらしく、実際それで収まった。

     5.6系の最新バージョンでは直っており、経緯を辿ってみると、
    ・5.6.2p3(2017/7/17)で起こった、とフォーラムに投稿されている。
    ・5.6.3f1(2017/8/1) では起こらない、と 938877 にレポートされている。
    2017.2.0b7(2017/8/15) でも直った、とされている。
    ・5.6.3p1(2017/8/17) では、だが起こった。(俺のバージョン)
    ・5.6.5f1(2017/12/28)では結局直っている。(俺自身が更新してチェック)
    という感じ。

     5.6.3f1~5.6.5f1 のパッチリリースには 938877 に関する項目は無い? 何か別のものと同根で、いつの間にかなおっちゃってたのかしら。
     でも 5.6.3p1 の場合は、なんかこう、バグ再発の滞空期間みたいなもんだったのかな。まあ、あることだよね(身に覚えが)。5.6.2p3以前もそんなようなことだったんだとすれば、世界に3人もさもありなん。

     今後、再現性のある crash をしたら即アップデートチェックやな。新しい不具合が怖くてあんましたくないんだけど、頑張って頻繁にアップデートしてるみたいだから、例えパッチリリースに当該バグが載ってなくても、直っていると信じて更新しちまったほうがいいかも知れん。

    (追記の追記)5.6.5f1、インスペクター等に一切の文字入力が不能になるバグあり。あかんがな。