Mixamoから落としたアニメを使おうとしたら、モデルが重力に反して浮き上がった件
現象
Mixamoからモデルとアニメーションをダウンロードして、Unity6で作成したURPのシーンに読み込んだ。モデルにAnimationControllerを設定してアニメを再生するようにした後に、モデルにRigidbodyをアタッチしたところ、モデルが空に向かって浮き上がっていくという現象が発生した。
原因
アニメーションの位置指定と、RIgidbodyの「UseGravity」が干渉したため。
対応策
Projectウィンドウで、使用している**アニメーションファイル(FBX)**を選択。
Inspectorウィンドウの Animation タブをクリック。
下にスクロールして Root Transform Position (Y) という項目を探す。
Bake Into Pose にチェックを入れる。
その下の Based Upon を Original(または Feet)に変更。
一番下の Apply ボタンを押して適用。
合わせて、以下の対応を行った。
Animatorの「Update Mode」の変更。
「Apply Root Motion」のチェックを外す。
いよいよ、こういう質問をGeminiに投げるようになってきた。便利になったなあ。
Unityのシェーダーにおけるプロパティアトリビュートに関して
例えば、あるテクスチャの計算を乗算にするか加算にするか、という設定をマテリアルから行いたい場合、トグルで選択できれば便利なのだが、どうやってマテリアル上にトグルのパラメータを表示するのか、という点がなかなか分からなかった。
以下のリンクを大いに参考にさせていただいた。感謝申し上げる。
この値で上手く分岐ができれば、もう少し表現の幅が広がるなあ、と。
UnityのURPシェーダーでUVスクロールする際のオフセットの取り扱い
UnityのURPシェーダーでUVスクロールをする際にどのように記述するのかを調べてみると、以下のようなコードが出てきた。
float2 offset = float2(_Time.x, 0);
o.uv = TRANSFORM_TEX(v.uv + offset, _MainTex);
変数「offset」内に、時間経過に比例して増大する値を入れ、関数「TRANSFORM_TEX」を実行する際にoffsetの値をuvに加算することでスクロールを実現している。
このやり方自体は何ら間違ってはいないのだが、一点気になったことがある。それは関数「TRANSFORM_TEX」の処理内容に関してだ。
上記コードではテクスチャ画像として「_MainTex」を使用している。具体的には
sampler2D _MainTex;
float4 _MainTex_ST;
という形で変数が定義されている。
ここで変数「_MainTex_ST」の中身が「TRANSFORM_TEX」の実行内容に関連している。「_MainTex_ST」の型はfloat4なので「x, y, z, w」の4つのパラメータを持つが、この内「x, y」がタイリングの値を、「z, w」がX軸方向とY軸方向へのオフセットの値を示している。これは、このシェーダを適用したマテリアルのInspectorウィンドウに表示される「_MainTex」のパラメータと対応している。
つまり「_MainTex」のUVに関する値は「_MainTex_ST」に格納され、その値を元に「TRANSFORM_TEX」で処理が行われる、ということだ。とすれば、UVスクロールの処理も「_MainTex_ST」内の値に対して行われるべきではないのだろうか。
_MainTex_ST.z = _MainTex_ST.z + _Time.x;
o.uv = TRANSFORM_TEX(v.uv + offset, _MainTex);
こんな感じのイメージ。
いちおうこれでスクロールしてくれるのだが、果たしてこれは正しい書き方なのだろうか??
本件に関しては、以下の記事に大いに助けていただいた。感謝申し上げる。
Unityで知らなかったショートカット二点
- Alt + 左クリック→現在のシーンビューの中心点を基準として視点が回転。
- Alt + 右クリック→シーンビューのカメラ画角の拡大縮小。
全然知らなかったので、備忘録として。
以下の記事に助けていただいた。感謝申し上げる。
MacBookPro(2023 M2 14インチ)の外部モニタ接続について
技術的な問題ではないのだが、環境面での話ってことで。
もともとはMac側のUSB-Cからモニタ側のDisplayPort端子につないでいたのだけれど、これだとスリープ復帰時にMacがモニタを認識せず、毎回ケーブルを繋ぎ直す必要がある。それで「Mac側のHDMI端子からモニタのDisplayPort端子に繋げば改善するのでは」と考えて、DisplayPort⇔HDMIの変換ケーブルを買ったのだが、「PC側のDisplayPort端子からモニタ側のHDMI端子への接続」しかできないらしい。「PC側のHDMIからモニタ側のDisplayPortにつないでも何も表示されない」とのこと。
この形の接続にはそれ用のケーブルが必要らしく、普通のDisplayPort⇔HDMIの変換ケーブルだと対応していないケースが多いらしい。
不勉強ながら知らなかった。つーことはおとなしくHDMI同士でつなげってか。でもモニタのデフォルトがDisplayPortなんで、今度はスリープ復帰時にモニタ側の外部入力をいちいちDisplayPortからHDMIに変更することになるんよなあ。
やっぱApple純正のモニタ買えってか?面倒くさいなあ。。。
結論
PC側のHDMI端子からモニタ側のDisplayPortに接続するには、それ用のケーブルが必要。普通の「DisplayPort⇔HDMI」ケーブルだと非対応のケースがほとんど。
UnityのURP環境でMutliPassのシェーダーが機能しなかった件
前提
Unity 2021.3.9f1において、URP環境でMultiPassのUnlitシェーダーを作成しても、最初のパスしか実行されなかった。
対応
1つ目のパスに以下を追加。
Tags{ "LightMode" = "UniversalForward"}
これにより、MultiPassが機能するようになった。
以下の記事に助けられた。感謝申し上げる。