gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

【Unity】 RequiredComponentが4つ以上指定できない場合

書き方の問題です。

[RequireComponent(typeof(Rigidbody), typeof(CapsuleCollider), typeof(MyClass))]
public class Character : MonoBehaviour {
}

この書き方で四つ目を追加するとエラーになる

//エラーになる書き方
[RequireComponent(typeof(Rigidbody), typeof(CapsuleCollider), typeof(MyClass), typeof(MyComp2))]
public class Character : MonoBehaviour {
}

なので

[RequireComponent(typeof(MyComp1))]
[RequireComponent(typeof(MyComp2))]
[RequireComponent(typeof(MyComp3))]
[RequireComponent(typeof(MyComp4))]
public class Character : MonoBehaviour {
}

こう書けばよい。

参考

https://forum.unity.com/threads/why-is-requirecomponent-limited-to-3-components.167232/

ちなみに「Unity requirecomponent more than 4」でググったら出た。

【Unity エディタ拡張】 AnimatorControllerが持つState名のついたAnimationClipファイルを一括作成する

経緯

OverrideControllerを使いたいのですが、AnimationClip名を指定というクソ仕様でした。

なのでState名がついた空のAnimationClipを自動生成し、それをセットします

何がうれしいの?

OverrideControllerの仕様上、下図のOriginalの名前が、Clip名になります。 State名が変わったり、増えたりすると、いちいち設定しないといけません。 また、Clip名とState名が一意に対応している、という保証もありません。

f:id:gologius:20171104130412p:plain

というかなぜStateで指定させてくれないの・・・???

コード

gist31d0b33762a1b5d88b9b8bb9eedd6dc9

printCustomLabel()は、前の記事で作成したものですね。直接今回の処理とか関係ありません。

また、複数レイヤーには対応してません(//todo のところ)

使い方

  1. Assets/Editor内にCustomAnimatorWindow.csを作成(フォルダがなければ新しく作成する)。
  2. 上のコードをコピペ
  3. 下のようにWindow->CustomAnimatorWindowをクリック

f:id:gologius:20171104093618p:plain

以下のような画面が出るので、適当に設定してボタンをおせばいいです。

f:id:gologius:20171104125811p:plain

その他

結局、ウインドウ開いてボタンを押す作業は発生しますが、手作業でファイル名を設定したりするよりも、はるかに安全かつ楽だと思います。

【Unity エディタ拡張】 Labelの装飾

サイズと色と太字、斜体を一括設定する関数がなかったので作った。

コード

gistd5bd52cc37a31321143502ffbca3cba7

使用方法、動作確認方法

  1. Assets/Editor内にCustomWindow.csを作成(フォルダがなければ新しく作成する)。
  2. 上のコードをコピペ
  3. 下のようにWindow->CustomWindowをクリック

f:id:gologius:20171104093618p:plain

以下のような画面が出る(黒地のラベルが、今回のラッパーで作成した部分)

f:id:gologius:20171104093617p:plain

Akeytsuにおいてボーンの名前によっては「Mirror Selected」が使用できない

MMDのモデルは使いたいけどMMDは使いたくないので、

MMD→MMD4Mecanimでfbx変換→Akeytsuでモーション作成

みたいなことをしようとした。

普通にAkeytsuに取り込めた。が「Mirror Selected」が使えない。 f:id:gologius:20171022022041p:plain これがないと、左右対称のモーションを作るときに面倒

ちなみにモデルはこちらを使用しています。ありがとうございます。 bowlroll.net

解決策

ボーンの名前がダメらしいです。ピリオドか数字か何がわるいか知りませんが、先頭の数字+ピリオドを消して、半角英文字のみにしたらなおりました

f:id:gologius:20171022022328p:plain

f:id:gologius:20171022022918g:plain 脚のボーン名のみ変更して実行した結果。脚は動くがほかは動かない

Unity 地面との接触判定

【2018/04/07追記】 ※この方法、OverrapSphereの半径分だけ、空中で判定されちゃうんですよね。 なので、着地判定時にモーション再生するときに、空中で着地してるように見えてしまいますね。 ダメですねこれ

本文

↓このクソみたいな発想後に考えたまともな接触判定方法

Unity 簡単な地面との接触判定 - gologiusの巣

方法

CapsuleColliderの足元でPhysics.OverlapSphere()を使用する→Sphere内のオブジェクトを走査→中に無機物があれば地面に接触している

gist.github.com

実行結果はこちら。注意点としては、使用するCapsuleCollider自体の接触判定が常にあります。

f:id:gologius:20171015124126g:plain

【再再更新】Unityでカメラ追跡したときにガタつく原因を考える

Unityで,プレイヤーを追跡するカメラスクリプトを作成していました.

まぁやっている方はたくさんおられるので説明は略しますが...

 

で,ゆっくり追従(追尾、補間)するカメラをつくろうとしたら,カメラがガタついてしまいます.

Vector3.Lerp や Vector3.SmoothDampでの補間を利用したものです↓

Unity でプレイヤーを追跡するカメラのスクリプト

ちなみに僕は Vector3.SmoothDampでやっています.Lerpよりガタつきが減ったように見えたので.

 

調べたところ,物理演算とゲームループが同期できていない?(Unity カメラ がたつく,等で調べてください)のが原因の一つかもしれないことが判明.

【2017/10/15追記】Rigidbodyがついているオブジェクト を追跡する際に発生する問題っぽい?

対策1:Update()から移動させる

処理をFixedUpdate()がLateUpdate()に移植する。

どちらが良いかは不明。 RigidbodyをもつObjectを追跡するときはFixedUpdate()がよいのか?

やってみて治ればバンザイ(∩´∀`)∩

 

対策2:FPSを落とす

ふと,処理速度が速すぎて,追跡しきれてないのでは?と思いFPSを見てみたら300FPSとか普通に出てました.

f:id:kamiwo_koete:20160904104717p:plain

とりあえずFPS落としてみるかと思い↓等を参考にエディタ上やスクリプト上で落としてみました.

Unityゲーム開発所 - UnityでFPSを設定する方法

 

FPS落ちない.上記リンク先によるとビルド後でないと反映されないみたいです.

結局ビルドしてみたらがたつきは治りました. 

前もビルドしたら治った案件があったので,一回ビルドして確かめるのもいいかも.

 

対策3:RigidbodyのInterpolateを見直す

RigidbodyのInterpolateがNoneの場合とそれ以外(Interpolate,Extrapolate)とでがたつきが変わる。Noneにすれば治る場合がある

 

対策4: スクリプトの実行順番を変更する

追跡対象のGameObjectの移動が、カメラ追跡スクリプトの実行順より遅い場合、

・ カメラスクリプトで追跡→GameObjectが移動

となるので、ガタつく?

 

結果:よくわからん

前はFPSを弄ったら治ったし、今やってる案件ではFixedUpdate()に放り込んだら治った。よくわからない。以上。