TK Dodgeの制作話
お盆期間はずっとデバッグしてましたtktkです、こんばんは。
TK Dodgeができるまでと、できたあとの話をしたいと思います。


TK Dodgeができるまで
スカイリムはアクションが弱いと言われるたびに、"パンがなければ作ればいい"と考える私はアクションを楽しくするMODを作る野望がありました。
7月某所にて、待望のアクティブドッジが出たとのことでMOD Zigurdz Brutal Combat が紹介されてました。
システムは画期的なんですがかなりバギーですでに4月ぐらいで更新停止したものです。
実はドッジで一番初めに出たのは装備MODDERとして有名なBackSteppo氏のFake Dodgeです。
この2つのモーションが一緒だったので、もしかしたらモーション自体はバニラリソースなんじゃないかと調べたらビンゴ。
まともなドッジのMODを誰もやりそうにないので早速取り掛かります。
スクリプトは全然わかりません。
わかるのはせいぜいifとか変数とか関数ぐらいでキャストとかポインタとかさっぱり。
おそらく日本で唯一のScript Dragonの解説が載ってるGenerichさんのブログを見ながら作りました。

基本的な骨格は非常に単純。
キープレス判定をif文でして、Playidle関数でモーションを再生するだけ。

問題点が2つあってダブルタップで出したかったのと、新規登録したモーションIDがロードオーダーで可変することでした。
ダブルタップはググると一回目入力時に時間計測をして、一旦離した後何秒以内にもう一度押されたかで判定すればいいとのこと。実装の仕方がわかりませんでした。
スカイリムのIDは16進数で8ケタ、最初2ケタがロードオーダーで変わります。(例:ID00000024が上から五番目だと05000024)
このロードオーダーの可変に対応してるMODがGRhotkeys、先ほどのGenerichさん のMODです。

ソースを頂き、なんとか実装できました。
ダブルタップの件は某所ではSolbiancaさんに助言を受けていましたが、Generichさんがスクリプトを書いていただいたのでそれを少し変えて使ってます。基本的に前述したのと同じ仕組みです。
これで無事リリースできました。

TK Dodgeリリース後
リリース後に私のMODで初のHotfiles入りは素直に嬉しかったですが、コメントで報告される問題点にてんやわんや。
リリース前からIRCでDragonPornさんとDD AKTさんにテストしてもらっていて、ドッジ後にカメラがカクつくとかモーションがもっさりしていてるとか色々聞きました。

モーションを直接blenderで見てみても、カメラ位置は固定ですし、モーションの速度や距離に関する設定はありませんでした。そしてモーション制御するHavok Behaviorの解析に取り掛かります。詳しくはこちらの記事で。

Behaviorいじりの結果、カメラのカクつきはモーション終了時の0.001秒をカット、左後ドッジの再生速度を早めて対処。
まだドッジとしては機能していないのでモーション開始時に無敵化の魔法を付与しました。

珍しくNexusのコメント欄を見ていた私は前方の回避としてサイレントロールをつけてとの要望が多いと気づきました。
モーションにはCK上で制約条件(condition)が設定できるんですが、それとは別に内部かBehaivorで制約条件の設定があるようです。
例えば、ドッジモーションは武器構え時しか使えないとかサイレントロールはスニーク中しか使えないとか。
立ち状態からサイレントロールできないので以下のようにモーションを挟めばいいわけです。


PlayIdle(player, attackstop) //攻撃キャンセル
PlayIdle(player, sneakstart) //しゃがみます
PlayIdle(player, anim) // animはドッジモーション
PlayIdle(player, sneakstop) //立ちます


これの応用で攻撃停止のモーションを挟むことで攻撃キャンセルが可能になりました。

デバッグデバッグ…
前転導入後に気づいたのが通常のサイレントロールなら魔法装備時に可能なのに、PlayIdleメソッドを通した場合はできない。一人称視点時に走りっぱなしなっちゃうのもしかり。
PlayIdleメソッド自体がおかしいようです。
ならば内部の問題なので荒業でねじ伏せるしかないです。
またも、Generichさんに協力いただきデバッグ。

走りっぱなし対策
原因はキャンセル行動後にSprintストップのトリガーが引けないこと。
発症したらダッシュキーを一押しで直るんですが、いちいち面倒。
常時高速で監視できるScriptDragonのメリットを生かして対策コードを書きます。
ドッジ含めスプリント(日本語版だとダッシュ)モーションすべて方向がありますが、走りっぱなしは方向がないので、
GetMovementDirection==0、IsSprinting==1、IsPC1stPerson()== 1
の条件ならばSprintstopのモーションを再生してます。これで自動的に解除可能。

スタックエラー対策
パピルスログ覗くとスタックエラーが出てます。
無視してるようなので実害は無さそうですが、頻度が多いので気になります。
魔法の消滅は1秒単位でしか指定できないので、0.4秒で消滅するスクリプトのせいかと思ってたんですが、どうもCastメソッドが高速送信されて多重に登録しちゃうみたいです。
通常Wait処理を挟めばいいんですがドッジを阻害してしまうために別の方式を考えます。
SetGhostメソッドを使って当たり判定がなくすことができたので、カウンタで計測して0.4秒後に外す仕様になりました。ScriptDragon内部で完結するのでパピルスのスクリプトは不要になり、スタックエラーも出ません。

短いドッジモーション対策
ドッジモーションはキー入力量で可変すると思ってたんですが、どうやら3段階に分けられます。
不発とも言える非常に短いのと、最後まで再生出来ない途中のと、完遂モーション。
よくわかりませんが、一回失敗しても二回目のドッジは完遂できます。(スプリントフラグに遅延があって失敗する?)
ドッジ前に擬似的にドッジ的な処理を挟んで2回目にすればいいので以下を追加しました。

Actor::PlayIdle(player, sprintStart);
Actor::PlayIdle(player, sprintStop);

結果的に成功でした。
このために少し操作性が変わりました。

魔法装備時の対策
魔法装備時にドッジが出来ないなら外すまでです。
ドッジが安定して完遂できるようになったので終了時に付けます。
GetEquipSpellで装備魔法取得、UnequipSpellで外す、取得した魔法をEquipSpellでつける。
攻撃キャンセルしてつける時は失敗します。
不完全なのでつけたり外したりなので挙動がおかしかったり、音がうるさいかったり、フォロワーが武装解除したりします。
デュアルキャストはどうも特殊らしく、GetEquipSpellで取得できないので非対応。
装備つけ外し時のカチカチ音はたぶんモーションについてる音で、カテゴリ単位でしかミュートできないので音は仕方ない。
関連記事
コメントの投稿


Does not accept comments that are all written in English on this blog for blocking a spam. If you have any questions, send a e-mail: tktk11111[at]gmail.com

コメント

tktk2012.08.31 00:09

>santiさん
おお、直りましたか。良かったですね!
お役に立てて何よりです。


santi2012.08.30 02:37

こんばんは

tktkさんの「赤い三角はたしかメッシュがないとそうなるような気がしたような」をヒントに・・・。

メッシュホルダの中のskeletonbeast.nifを削除で直りました。
いかにもな名前のこのファイル、どのMODに付いてきたのか分かりませんでしたが・・・。

ホントに助かりました。勇気を出して聞いてみてヨカッタです。
ありがとうございました。


tktk2012.08.29 19:08

>santi
お気づかいありがとうございます。


santi2012.08.29 11:55

tktk様 ありがとうございます。

これもskyrimの楽しさの一つとして素人なりに弄り直してみます。
こんなことが出来るのも、tktkさんのような方がいらっしゃるからなんですよね。感謝×2です。


まだまだ暑い日が続いておりますが、お体に気を付けて頑張ってください。←自分勝手^^;


tktk2012.08.28 09:37

ECEはCKでdetail見てみるとわかりますが、カジートとアルゴニアンはいじってないです。
赤い三角はたしかメッシュがないとそうなるような気がしたような…(自信なし)。体型MODや装備MODなどを見なおして再インストールしてみてください。


santi2012.08.27 19:12

はじめましてm(__)m
2か月ほど前からskyrim(英語→日本語)で遊んでいますsantiと申します。

MOD紹介サイト等で見たSSに一目惚れしまして、tktk様のPretty Faceを使用させていただいております。
いきなりで失礼かと思いますが、アドバイスいただけたらと思い書き込みさせていただきます。

ゲーム中に出てくる(NPCなど)カジートとアルゴニアンすべてが赤い三角形で表示されてしまいます。
大きさで言うと高さ1.5Mぐらいです。会話や戦闘はおおむね可能ですが持ち物が取れなかったり、アクションを起こさないなど不具合がありクエストが完了できないものもあります。

使っているMODで種族関係はECEだけです。(ノルドでプレイしてますが)
skyrimの再インストール後skyrimホルダの上書き、Ver1.6→1.7にアップデート時に「ゲームキャッシュの整合性」の確認等いろいろ試してみましたが、うまくいきません。

ShowRaceMenuで種族選択時はアルゴニアンの所でCTDを起こします。(ygnordは表示されます)

他のMODとの兼ね合いとか私だけのバグだけかもしれませんが、失礼ながら何かアドバイスがあればと思い書き込ませていただきます。
出来れば、再インストール→MOD入れ直しは避けたいので・・・。

こちらの勝手ばかりで申し訳ございません。よろしくお願いします。


tktk2012.08.25 13:32

>Solbiancaさん
ありがとうございます。
そういえば、キルムーブのモーション使えばコマンド入力活かせたMODを作れるかもしれないです。このドッジの他にも色々作ってるので現在は手が回りませんが。


Solbianca2012.08.24 23:39

開発お疲れ様です。
デバッグ作業に、バグ取りに、地道な作業が実を結んでいますね。そのモチベーション維持に頭が下がる思いでいっぱいです。ご自愛を忘れずに開発を手がけていってください。
私の方はモチベーション低下で逃避中です(w