投稿記事

ポリプリプリン 2021/01/15 22:15

制作での躓き3(ルートモーションでの移動)

FPS開発の近況ですが、FPSの基本的なシステム(キャラの動作や判定とか敵の行動など)をずっと作っておりました。
いやあ、やる事・決める事が際限なくありますねえ……

今回はその中から、キャラクタをアニメーションで移動させるのに手こずった体験談です。
毎度ながら知識足らずで他に簡単・正しい方法があるのは十分あり得る話ですがご参考になればと思います……
現在の環境:unity2019.3 LightWave2019.1.3


今作ってるFPSでのキャラの歩行などは、モーションはアニメーターで動かし、キャラ全体の移動はスクリプト(キャラクターコントローラー等)で動かしています。
そうするためには、ルートが動かないアニメーションクリップにする必要がありますが、例えば歩くだけでも体が上下に動いたりします。
でもその動きをキャラ全体のオブジェクトの動きに反映するとキャラ全体の衝突判定のコライダも動いてしまうので、ルートのモーションをオブジェクトの動きに反映させないでアニメーションだけさせるようにします。
その設定は、アニメーターでして全てのアニメーションをそう動作させる方法と、クリップ毎に設定してアニメーション別に指定する方法があります。
当FPSではクリップ毎の設定にしています。この方法は、回転・Y軸移動・XZ軸移動それぞれ別の設定にもできるので便利です。

この辺りの話は公式マニュアルや色んな所で解説されているので特に問題なく出来たのですが、躓いたのはここからです。


歩きなどの一定速度で動き続ける動作は、ルートの移動をスクリプトでする方法がいいのですが、尻もちをつくなどの移動速度が刻々と変わる動作は、スクリプトで速度を変化させるのが手間ですし、いい感じの移動量に調節するのも面倒なので、モーションエディタ上でルートの動きを編集したものを使いたくなります。
なので前述のクリップ毎の設定を使い、ルートの移動をモーションでさせたいクリップのXZ軸移動だけ設定を変えました。

ちなみに、モーションでルートを移動させつつ、ボーンとルートの位置関係も動かしたい事もあると思います。オブジェクトの中心を体からずらしたい場合です。


その場合私はクリップのモーションエディタ上でルートだったチャンネルのカーブを編集しています。
Animator.RootTはオブジェクトのルートの動きに使われる(unityにインポートで作られる)のでそのままにします。
インポートしたアニメーションが(Read-Only)で編集できないなら、プロジェクトウインドウでそのクリップを選んでCtrl+Dでコピーされて編集できます。
まぁカーブ編集とか手間をかけなくても、最初にモーションエディタで作る際に空オブジェクトを親として追加して、ルートオブジェクト移動用とアニメーション上だけの移動用に分けておけば問題なかったと思われます……

とにかくこれでアニメーションでのルート移動が出来たと思ったのですが、自キャラと敵で戦闘するテストプレイで問題が発覚しました。
尻もち等でルートが移動する際に倒れる方向と別の方へ移動してしまうのです。
具体的には、キャラがどっちを向いていてもワールド座標での1方向にしか移動しなくなっていました。
これはよく考えれば当然な事ですが、作る側は「後ろに倒れるから後ろに移動させる」と意図しても、モーションには「Z軸マイナス移動」としか記録されないので、キャラが回転してワールド座標上での前方が変わればその移動方向は後ろではなくなるわけです。


この「ルートの移動をローカル座標上の向きに合わせて動かす」事をする設定かツールか何かを探したのですが見つかりませんでした。ゲームを作っててこれをやりたくなる事はよくありそうだと思うんですが……

しょうがなく自前で解決法を考えることに。
初めアニメーションクリップからルートの移動値を読み取って向きを適用して反映しようと思ったのですが、クリップから直接値を読み取るのは出来ないようでした。

なので単純なやり方にしました。
空の子オブジェクトをルートの直下に作り、
それのモーションにルートの移動を写して、
そのワールド座標上の位置の変化をスクリプトで読み取ってルートに反映するという方法です。
元のルートのXZ移動は、オブジェクトの中心をずらす分を残して0にしておきます。
最初の方で変えたクリップのXZ移動の設定は戻します。(どっちでもいいかも?)


これで解決と思ったらまだ問題が出てきました。
アニメーターのステート遷移で別のモーションへ移る時、姿勢が滑らかに変化するよう補間をかけるのが一般的です。
ルートの移動をするステートからしないステートで補間がかかると、ルートの移動用オブジェクトの位置が移動先から原点位置で補間がかかり、意図しないルートの移動が起きてしまうのです。
特定のチャンネルだけ補間しない事はできないので、アニメーターにルートの移動用オブジェクトだけのレイヤーを追加して、そこでは遷移間隔を0にして補間をしないようにしました。


以上でルートモーションの移動が出来たのですが、まだまだ理解しきってはおらず、制作やテストをする内にまた問題が発覚するんじゃないかな~と思います……
ゲームを発表する際はバグが無くなっているよう頑張ります。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ポリプリプリン 2020/06/05 20:42

体勢を崩させる

間が開いちゃいましたが移ってきてから初の更新です。

開発中の撃って服を破ってイかせるFPSのシステム紹介をします。

このゲームでは、胸や股間などの局部を撃って感じさせるのがダメージになる訳ですが、他にも狙うのに有効な部位があります。

敵の頭を撃つと、尻もちをつかせて少しの間移動できなくさせます。

尻もち状態の敵の頭か腕を撃つと、仰向けにダウンして少しの間何もできなくなります。

敵の脚を撃つと、四つん這いにさせてこれも一時移動できなくさせます。

四つん這い状態の敵の腕を撃つと、うつ伏せにダウンして同じく一時行動を封じます。

尻もちや四つん這い状態でも敵は銃を撃つことはできます。
仰向けやうつ伏せダウンの時は移動も攻撃も出来ないので、
この隙に一方的に撃って倒すのが安全な攻略法になるかと思います。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ポリプリプリン 2020/02/24 16:31

制作での躓き2(スキンメッシュの不自然な陰)

FPSの制作中に躓いたことのお話2回目です。
3DCGの技術的な解説になります。
なお個人の分析によるものなので勘違いもありうる事をご了承下さい……

unityでキャラをジャンプさせての落下中に、胸の下に不自然な陰(影)があるのを見つけました。


あごの下と比べると分かりますが明らかに暗すぎます。

光源の向きを色々変えてみたところ、変な方向で少し明るくなったりする……?
どうやら法線がおかしいようです。

法線とは面に垂直な線のことで、法線ベクトルとしてベクトルで扱われ、3DCGではこれを使って面がどちらを向いているか判断して陰影をつけています。

なぜ法線がおかしくなっているのか?
どうも、おっぱいが下に垂れている元の状態から法線が変わっていないような感じです。
ちなみにおっぱいはボーンで動かしています。
では腕など他の所は曲げると陰影が変わるのに、胸の下だけ変わらないのは何故なのか?

それは法線がボーンの回転によって変わっていて(当たり前ですが)、
胸の下の変形はボーンがほとんど回転していなかったからです。

まずunityのようにリアルタイムでレンダリングされる3DCGでは、
メッシュの頂点に保存されている法線ベクトルを参照して面の向きを判断しています。


左図のように腕などではボーンと一緒にポリゴンと法線も回転し、
回転する所としない所の境は補間された法線の向きになると思われます。

対して胸部分では、おっぱいを平行移動のように動かしたかったので、ボーンの根元を背中の方まで伸ばしてあり、おっぱいが大きく動いてもボーン自体はあまり回転していません。
なので法線の向きもほぼ変わりません。
しかしポリゴンの面の向きはボーンで動く頂点(おっぱい)と動かない頂点(胸板)があることで大きく回転しています。

実際の面の向きと頂点に保存されている法線の向きが違っているので、
不自然な陰ができてしまうのです。

原因は分かりましたが、ではどうやって間違った法線の向きを変えればいいのでしょう?

法線を再計算する方法がありますが、毎フレーム行わなければいけないので重そう……
しかもunityの関数だとUVの継ぎ目で滑らかに出来ないみたいです。
シェーダーでやるのも難しいし色々大変そう……
他に方法はないものか?

少し話が戻りますが、なぜ陰ができるか探っている時にたまたま、ボーンではなくブレンドシェイプで同じ形に変えると正しい陰影になるという事を見つけていました。
ブレンドシェイプは頂点の移動ベクトルと、移動後の法線ベクトルを保存しているので正しく陰影ができるのです。

しかしブレンドシェイプは回転に不向きでおっぱいの先の方の動きが良く表現できません。

じゃあ移動値を使わずに法線ベクトルだけを、おっぱいボーンの回転に合わせて反映できれば……
と思ったら都合よくそれができるツールを発見しました!

Blend Shape Builder
unity上でブレンドシェイプの作成・編集ができるツールです。

これでおっぱいが上がったブレンドシェイプの移動値を消して法線ベクトルを残した物を作り、
ボーンの回転に合わせてそれを増減させれば正しい陰影になる訳です。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ポリプリプリン 2020/01/26 15:21

服破れ舞い散る

今年もFPSのエフェクト紹介をしていきます。
服が破れた時の切れ端が飛び散るようになりました。

切れ端に陰がついていないのは現在の開発環境にその機能が無いのです……
ゲームができるまでには陰がつけられるようになるはず!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ポリプリプリン 2019/12/31 15:13

制作での躓き1(モデル変換Lightwave→unity)

現在開発中のFPSですが、知識が足りず難航してばかりです。
紹介する物が出来ないことにはブログのネタが無いので、
いっそ作業での躓きと解決自体を紹介しようかと思います。
無知ゆえに不正確な事があるのと、環境により違いがあるのはご承知おき下さい。

いつもの内容と違って専門的な話なので、知らない方は意味不明だと思いますがお許しを……

今回はLightwaveで作った3Dデータをunityで開く変換の躓き話です。
ポリプリプリンはLightwaveでモデリング・モーション・レンダリングしています。
現在バージョンは2019.1.3
unityは2018.3~2019.3を使ってます。


・UVマップが消える

Lightwaveでfbxファイルに出力し、unityに取り込むとテクスチャが反映されない……
UVマップが無くなっている!?ということが。
(UVマップ確認は http://esprog.hatenablog.com/entry/2016/09/30/165057 こちらを使わせてもらってます)
どうやら、マテリアルで「色」のテクスチャが貼ってあるモデルじゃないとUVを持っていかないみたいです。
カラーでテクスチャ使わないなら、適当に何か貼ってunityのマテリアル設定で変えとくといいです。


・貼ったテクスチャが歪む

unity上でモデルに貼ったテクスチャが部分的にギザギザに歪む事がありました。

これはLightwaveでテクスチャを焼き付けした場合に、
四角ポリゴンを自動で三角に分割する向きがLightwaveとunityで違ってしまった所に発生します。

ですので焼き付け作業前に、四角ポリゴンを三角分割しておくと解消されます。


・ブレンドシェイプを動かすと全体の陰影が変わる

unityでモデルのブレンドシェイプを増減すると、変形してない部分の陰影が微妙に変わったりします。
動かす度にちらついて見えて気になります。
これはunityのモデルインポート設定を変えて直します(取り込み後でOK)。
インスペクターの法線(Normals)とブレンドシェイプの法線(BlendShapeNormals)を同じ設定にすればいいみたいです。


・ボーンウェイト値がおかしくなる

unityでスキンメッシュをボーンで動かしたら、Lightwave上での動きと違う所がある……
ボーンウェイト値が変わっているのかと思っても、unityでウェイト値を見る方法が無い?
なのでfbxをLightwaveにインポートしてみたら、ぐちゃぐちゃになりましたがウェイトは見られておかしくなってました。
色々試した結果、ボーン種をジョイントにしていると変換でそのボーンのウェイト値が消えて、減った分は他(上階層?)のボーン値で埋められていたようです。
ボーン種を通常のZ軸タイプにすればOKです。


・モーションの回転値グラフが曲線から直線になる

これはボーンのモーションのX軸回転をLightwaveのグラフ編集で見たものです。

変換してunityへ持っていくと……

キーフレームだらけになってますが、そうする設定(カーブをリサンプリングON、アニメーション圧縮方法オフ)にしないと動きが変わってしまうのでそれは仕方なしです。
の部分が曲線だったのが直線になっています。
どうやら、Lightwaveでは線の後のキーフレーム「手前の曲線」で補間の指定をする所が、
unityで開く時は線の両端の「手前の曲線」を曲線に指定しないと曲線としてくれないようです。


それではよいお年を!
来年は作業が捗りますように……(-人-)

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

« 1 2 3 4 5 6 7

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索