テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】物理演算とAnimationで物を投げてみる

f:id:tsubaki_t1:20161017234533g:plain

昨日の続きで、物理演算で動くオブジェクトをAnimationの力で投げてみました。

 

理屈

tsubakit1.hateblo.jp

作業

まず投げるオブジェクトを用意しました。
回す際にはPivotモードで動かすと楽です。

f:id:tsubaki_t1:20161017234943g:plain

 

pivotの中心点と全く同じ位置に空のGameObject(FIxedJoint用)を用意して、FixedJointとRigidbodyを作成します。

投げる方にもrigidbodyを付けて、FixedJointの動きと同期します。

 

後は投げる部分の上にCubeを落とせば、投げてくれます。

 

飛距離は投げる速度次第

飛距離は、投げる速度次第といった所です。
トルクや質量はある意味ガン無視する方法なので、いかに速度を与えるかといった感じの話になるんじゃないかなと思わなくもないです。

f:id:tsubaki_t1:20161018000649g:plain

f:id:tsubaki_t1:20161018000833g:plain

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

【Unity】アニメーションと物理演算を連動させる

f:id:tsubaki_t1:20161017225314g:plain

試したら出来てしまったので、一応メモします。

 

物理演算とアニメーション

Unityを初めて作った人がよくやる事が、物理演算ベースで作成したキャラクターをアニメーションで動く床に載せるというステージ構成です。

これは一見上手く動きそうに見えますが、実際にはうまく動作しません。これは、Animationによるオブジェクトの移動とPhysicsによる移動が異なる事が問題です。

f:id:tsubaki_t1:20161017231808g:plain

 

物理演算でオブジェクトを動かす場合、オブジェクトは数学の時間に学んだような演算でもって動きます。また、数学の時間に学んだような演算で、他の物理オブジェクトに対して影響を与えます。

f:id:tsubaki_t1:20161017231151g:plain

 

アニメーションで動くオブジェクトは、基本的にキーフレームが指定する位置に「テレポート」しています。その過程での加速度や質量等の情報は一切持っておらず、また他の物理オブジェクトに運動エネルギーを与える事は無いです。

f:id:tsubaki_t1:20161017225000j:plain

 

Animationで動かしている床や壁は物理演算で動いていないので、摩擦係数や質量をいくら重くしても、物理演算で動作しているオブジェクトに影響を与える事は無い訳です。(当たり判定は影響します。また、めり込んだ場合は吹き飛ばす事があります)

 

Animationに物理演算の力を追加

Animationで動作するオブジェクトに物理演算の効果を与えるのは無理かなーと個人的には思ってましたが、ふと思いついて試してみたら上手くいきました。

 

今回やる事は単純で、ColliderとRigidbodyの付いているオブジェクトを、Animationで動作するFIxedJointで引っ張るという物です。
Animationはワープですが、それをFixedJointで引っ張る事で、一応物理的に動いている扱いにする…という物です。ぶつかっても反動が無く質量はほぼ無限大扱いなので、ぶつける等では変な挙動になるかもしれませんが、まぁとりあえず動きます。

 

実際にやってみる

まずAnimationで地面の動きを用意します。
今回は、Z軸に移動します。

f:id:tsubaki_t1:20161017230817g:plain

 

次に、JointでPlaneを引っ張ります。
まずはPlaneが引っ張れるように、Planeに物理演算を追加します。その際、Use Gravityは外しておきます。

f:id:tsubaki_t1:20161017231409j:plain

 

次に引っ張るJointの設定です。こちらは色々と設定する事があります。

まずAnimatorのUpdateModeをAnimatePhysicsに設定します。こうしないと、摩擦で動くときに少しカクカクします。

また、Animationで動くオブジェクトには物理演算による動きは不要なので、IsKinematicをRigidbodyに設定します。

あとはFixedJointを追加して、引っ張る対象にPlaneを設定します。

f:id:tsubaki_t1:20161017231532j:plain

 

これで再生すると、Animationの動きに沿ってPlaneが動きます。
動かない場合、Jointが動いていないか、FixedJointを指定してないか、もしくはPlaneにIsKinematicが付いてます。

また、これで動かすPlaneには物理演算が付いているので、上に載っている物も追随する形で動いてくれます。

f:id:tsubaki_t1:20161017232614g:plain

 

Physics2Dでは少し手法が異なる

Physics2Dの場合、設定が少し異なります。

その辺りはまた今度

f:id:tsubaki_t1:20161018003259g:plain


 

 関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

【Unity】サクッと適応出来る 綺麗な全部入りイメージエフェクト、 New Post-processing Stack (Pre-Release)

New Post-processing Stackのプレリリース版が公開されたみたいです。

 

New Post-processing Stack

新しいImageEffectとして、überなImageEffectを作ったみたいです。

下のフォーラムから内容を確認出来ます。

https://forum.unity3d.com/threads/new-post-processing-stack-pre-release.435581/

 

サクっと綺麗にするImageEffectを適応する

新しく公開された仕組みでは、ImageEffectの適応が非常に簡単…というか、分かりやすく…でも無いですが、まぁ知識が無くてもある程度綺麗にしやすくなります。

以前はコンポーネント単位で色々と取捨選択する必要があり、何を設定すればよいかわかりにくかったですが、新しい仕組みでは設定できる項目にチェックボックスがあり、とりあえず全部チェックを入れればそれなりに綺麗に見えます。

f:id:tsubaki_t1:20161012003823g:plain

 

また処理の適応順番も正しく設定されているらしく、その辺りの知識がなくともソレナリに見えるようになるみたいです。

 

パフォーマンスと表現も向上

ベースになるものはCinematic image effectsですが、ImageEffectを統合して最適化する事で、パフォーマンスの向上が見込めるみたいです。CommandBufferベースの物に差し替わってます。

 

tsubakit1.hateblo.jp

また、Cinematic image effectsと比較して追加で

  • フルACES準拠HDRカラーグレーディングパイプライン
  • 新しく改良された色収差
  • Lens dirt effect(レンズの汚れの効果)
  • ヒストグラムベースの Eye Adaptation
    (暗い所に目が馴染んだ時に明るい所に出ると白飛びするアレ)
  • Temporal Anti-aliasing
  • Camera Grain(ノイズ)
  • 豊富なデバッグおよび監視ツール

といった表現も追加されたみたいです。その代わりDOFが現在動作しません。(項目はあるので、消える訳ではないみたいです)

 

設定できる効果は、下のWikiで確認出来ます。

github.com

エフェクトの効果はアセット単位で管理出来る

もう一つの特徴が、エフェクトの効果をアセットとして保持している点です。その為、Cameraにコンポーネントを足してPrefabにする等と比較し、プラットフォームや環境毎に設定を差し替えるといった事が割と簡単に出来そうです。

tsubakit1.hateblo.jp

また、アセットに情報が格納されているので、実行時に値を変更しても保持されます。

tsubakit1.hateblo.jp

もしシーン毎に個別の設定がある場合は、エディタ拡張でScriptableObjectをエディタ拡張で生成・カメラに登録しておけば個別に設定が可能です。

var behaviour = GetComponent<PostProcessingBehaviour> ();
behaviour.profile = ScriptableObject.CreateInstance<PostProcessingProfile> ();

 但しこの場合、シーン上で変更を加えると内容は破棄されます。

 

コードはオープンソースで公開

このプロジェクトは、オープンソースで展開するみたいです。
今までと異なりbitbacketではなくgithubに上がっています。

github.com

使い方

  1. まず、Releases · Unity-Technologies/PostProcessing · GitHubからUnitypackageをダウンロードしてインポートします。
  2. 次にAssets>Create>Post-ProcessingProfileでポストエフェクトの設定ファイルを作ります。
  3. 作成したPost-Processing Profileを選択して、使用したい画面効果にチェックを入れます。
  4. 次にシーン内のCameraにPost Processing Behaviourコンポーネントを追加し、Post-Processing Profileを追加するだけです。

f:id:tsubaki_t1:20161014055011j:plain

f:id:tsubaki_t1:20161014055144j:plain

f:id:tsubaki_t1:20161014055705j:plain

とりあえずのお薦めは、Antialiasing、Ambient Occlusion、ScreenSpaceReflection、Motion Blur、Bloom、Color Grading or User Lut、Vignetteです。屋内と屋外を走り回る系のゲームならEye Adaptionも入れても良いかもしれません。

重いなら、ScreenSpaceReflectionやAmbient Occlusionを外すのが良いかなと。

 

 Tips

各エフェクトの設定は、Copy Settingsでコピー、Paste Settingsでペースト出来ます。

f:id:tsubaki_t1:20161014061313j:plain

 

Post-Processing Profileに設定する項目は、スクリプト側からもアクセスが可能です。但し、Post-Processing Profileをアセットとして書き出している場合、変更内容がアセットにそのまま適応されます。

f:id:tsubaki_t1:20161014062004j:plain

 

全込エフェクトなので、パフォーマンスの低いPCでは全エフェクトをONにすると負荷が高いかもしれません。シーン編集時に「重い」と感じたら、ImageEffectのシーン適応を外します。

f:id:tsubaki_t1:20161014062553j:plain

 

関連

tsubakit1.hateblo.jp

www.slideshare.net

その他

そういえばシリコンスタジオさんのYEBIS for Unityも最近上がってました。これを近いうちに試したい(割と近いうちに

3dnchu.com

【Unity】複数のオブジェクトを同時編集する際に便利な、Inspectorビューをサクっと複製してLockするエディタ拡張

f:id:tsubaki_t1:20161010230532j:plain

さる御方のふとした一言により、試しに作ってみたら思ってた以上に便利だったので、ここにメモします。

 

Inspectorビューは使われすぎではないかという意見

事の発端は、「Inspectorビュー使われすぎじゃね…?」というさる御方の意見でした。確かに言われてみると、Inspectorビューは本当に色々な要素に使用されています。

  • Game内のパラメータはInspectorビュー
  • アセットの設定は大体Inspectorビュー
  • ライティング(Light)の設定はInspectorビュー
  • カメラの設定はInspectorビュー
  • Materialの設定はInspectorビュー
  • Meshの設定はInspectorビュー
  • アプリの設定はInspectorビュー
  • ビルド設定はInspectorビュー

どれかを変更したければInspectorビューの表示内容を変更する必要があり、複数の項目を同時に変更する事は出来ません。

この操作と結果が余り変化しないのがUnityの理解しやすさの一つだと個人的には思いますが、階層の深いGameObjectやPlayerSettings等、1ステップで表示出来ない項目も結構あるため、思えばかなり面倒くさいです。

一応Selectionという手はありますが…

tsubakit1.hateblo.jp

Inspectorビューを複数表示してLockする

Inspectorビューを複数表示してロックする事自体は、特にエディタを拡張しなくとも、以下の手順で可能です。

  1. Inspectorビュー上の「三」よりAdd Tab → Inspector を選択し、Inspectorビューをもう一つ表示する。
  2. 増やしたタブを移動
  3. 「三」→Lockもしくはカギマークをクリックして、Inspectorビューが変更されないようにする

f:id:tsubaki_t1:20161010232101j:plain

f:id:tsubaki_t1:20161010232106j:plain

baba-s.hatenablog.com

Inspectorビューの追加と固定をもっと簡単に

この手順を取るのが面倒くさいので、Ctrl + LでInspectorビューを複製・ロックするエディタ拡張を作ってみた所、これが思いの外便利でした。

www.youtube.com

 

使い方

LockInspectorのコードをEditorフォルダ以下に配置すれば、導入完了です。

後はCtrl + Lで現在選択中のInspectorを複製&ロックします。

gist.github.com

既知の問題

  • Unity 5.5 b5で試した限り、で動かす際、別のシーンをロードした際にクラッシュします。これはエディタ拡張云々と言うよりは、Lock処理に問題が有るみたいです。(手動でInspectorをLockした場合もクラッシュします)
    5.4系だと問題なく動きます(バグレポート済)
  • シーン毎に状態を保持する訳では無いので、シーン内のオブジェクトをLock Inspectorに表示してる場合、別のシーンファイルをロードするとInspectorビューの中身が空になります。

 

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp