テラシュールブログ

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

【Unity】Prefabの”モデルの差し替え”を、セットしたコンポーネントを一々付け直さずに行う方法

f:id:tsubaki_t1:20170819214225j:plain

今回はModelの更新に関するTipsです。

モデルの差し替えのトラブル

ゲーム開発を進める時、最初からモデルはFix済みの物を使う訳ではありません。例えばボーン構造が変化したり、メッシュの中身が変化するといった事は良くある事です。

この時、Animator以下のオブジェクトにコンポーネントをセットしていなければAnimator以下のオブジェクトを差し替えるだけで済みます。
メッシュの頂点やUV変更等であれば、ファイルの上書きで更新するならばオブジェクトの差し替えも要らないかもしれません。

f:id:tsubaki_t1:20170819215432j:plain

逆に、Animator以下のオブジェクトにコンポーネントをセットしている場合…例えばRagDollをセットしているような状況だと、面倒なことになるかもしれません。

単純にMeshの差し替えでは上手く動作しなかったり、旧Prefabと新Prefabを比較して何が接続されているのかを確認したり。

オブジェクト構造やコンポーネントを維持しつつモデルを差し替え

モデル調整の度にコンポーネント構造を再セットするのは面倒なので、コンポーネントの情報を維持しつつモデルを差し替えるアプローチです。

これはOtimize Transform Hierarchyがコンポーネントがアタッチされているオブジェクトを破棄せず、かつDeoptimize Transofrm Hierarchyで巻き戻した際にAvater情報を元に再構築する…という流れを利用しています。

 

大雑把な流れとしては、

  1. オリジナルのPrefabでOptimize Transform Hierarchyを実行
  2. PrefabにセットされているSkinedMeshRendererを削除
  3. 移植したいモデルをシーンに配置し、Optimize Transform Hierarchy
  4. 新しいモデルのSkinedMeshRendererをオリジナルPrefabに移植
  5. オリジナルPrefabのAvaterを、新しいモデルの物に変更
  6. オリジナルPrefabでDeoptimize Transform Hierarchyを実行

といった流れです。

実際の流れ

最初はこの状態からスタートです。

f:id:tsubaki_t1:20170819224826g:plain

AnimatorをOptimize Transform HierarchyでHierarchy構造をスッキリさせます。これでボーン構造が実際のGameObjectに左右されなくなります。

この時、コンポーネントがセットされているオブジェクトは非表示にならず残ります。

f:id:tsubaki_t1:20170819222451j:plain

f:id:tsubaki_t1:20170819222823j:plain

次に、オブジェクト以下のMeshRendererやSkinedMeshRendererを削除します。

これは、単純にMeshがMissingになってしまったり、旧モデルを維持しつつ新モデルをセットしたい場合の手順です。

探すのが面倒ならば、Hierarchyの検索機能でRenderer系だけ探して消します。

f:id:tsubaki_t1:20170819224022j:plain

移植したいモデルもシーンに配置し、Optimize Transform Hierarchyを実行します。その後、移植したいモデルのRenderer系を全てPrefab以下に移動します。

f:id:tsubaki_t1:20170819224438j:plain

後はPrefabのAvaterを更新し、Deoptimize Transform Hierarchyを実行します。

Avaterの情報を元にTransformの構造を直すっぽいので、この順番を間違えると正常に動作しないかもしれません。

f:id:tsubaki_t1:20170819224746j:plain

これで完了です。

f:id:tsubaki_t1:20170819225126g:plain

全体の作業Gifはこんな感じです。

f:id:tsubaki_t1:20170819224856g:plain

コンポーネントの参照先は残らない問題

このアプローチでは、コンポーネントの参照先は消えてしまうかもしれません。Optimize Transform Hierarhyはコンポーネントが付いている物は残しますが、他のコンポーネントが参照しているものまでは判定していないみたいです。

参照先にコンポーネントがあれば問題無いですが、Transformのみのコンポーネントを参照している場合は注意が必要です。

f:id:tsubaki_t1:20170819231128j:plain

この辺りでも、コンポーネントが直接参照するよりコンポーネントが自己登録しに行くアプローチの方が安定するかもしれません。直接参照の方が早くはあるんですけどね…

f:id:tsubaki_t1:20170819231139j:plain

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

madnesslabo.net

そして7日後、SNSは再開された

最近、SNSをチェックする頻度が3~4年前と比較して明らかに増えてる。チェックする情報の範囲も頻度も以前と比べられないくらいの量、これは所謂SNS中毒という奴に違いない。

news.livedoor.com

折角の休みなので、SNSやブログ等を止めてみるが、これが中々に難しい。
「何をするにしてもスマホやPC等のSNSに接続するデバイスを使う」かつ「定期的に通知が来るので、ついチェックしてしまう」という問題。

そして何より、スマホが気づくとSNSを開いている。まるでキング・クリムゾン

 

ではスマホを止めてしまえば良いと思うが、これも中々に難しい。何せ自分の情報インフラは大半がスマホやPCといったインターネットから来る。

書籍は既に殆どを(ラーメン大好き小泉さんを除き)Kindleで購入しているし、ブラウザは簡単にSNSに接続できる。最早PCはインフラだ。

なんという事だ、既に包囲網は完成していたのだ。

 

しかし何とかせねばならない。何か対策はないか?よろしい、ならば我慢だ。

我慢は筋肉の次ぐらいに強力だ。
筋肉は全ての問題を解決するが、我慢は大抵の問題を解決する。

通知が来ても我慢、みたい情報があっても我慢。定期的にチェックする項目があっても我慢。見よこの完璧なソリューション。

 

そして今、7日間の我慢の時を超え、ガマンはついに解き放たれる。開放の時だ!

流れるようにTwitterを開き、通知を確認し、何時ものタグを打ち検索、Facebookで動向を確かめ、FacebookのUnityユーザー助け合い所を確認し、SlackやRedditを眺める。

 

あれだ、ガマンは大抵の問題を解決するが、筋肉と違って体に良くない。

【Unity】Position as UV1…とは

f:id:tsubaki_t1:20170810212027j:plain

少し話題に登ったので、書いておきます。書かないと忘れる

Position as UV1とは何ぞや

f:id:tsubaki_t1:20170810212235j:plain

Position as UV1というコンポーネントがあります。この謎コンポーネントは太古の昔(UIが作られたUnity 4.6系)から存在し、我々を見守ってきました。

 

で、コレは要するに何かとマニュアルを見てみますが、今ひとつ要領を得ません。

(原文)This adds a simple Position as UV1 effect to text and image graphics.

(訳)Text や Image グラフィックにシンプルな Position as UV1 エフェクトを付加します。

Position as UV1は、UIに頂点情報を流し込むコンポーネント

で、Position as UV1とは何ぞやと言えば、要するにUIにUV1の情報を流し込むモノです。これに対応するシェーダーを使用すると、UVのサイズとは別に模様を使用したり出来ます。

例えば下のようなレイアウトのUIがあります。二つのUIがあり、大きさが異なります。このUIに一定間隔で穴を開けようと思います。

f:id:tsubaki_t1:20170810214409j:plain

これにUV0で穴を開けようと思った場合、大きさが異なるので穴の大きさも異なってしまいます。

f:id:tsubaki_t1:20170810214520j:plain

これをPosition as UV1を利用して模様を付けると、UIの大きさに関わらず一定の大きさ・間隔で穴を空けてくれる訳です。

f:id:tsubaki_t1:20170810214622j:plain

動かしてみると分かりやすいかもしれません。

f:id:tsubaki_t1:20170810214826g:plain

実際にやってみる

CanvasのAdd Shader ChannelでTexcoord1を追加します。

f:id:tsubaki_t1:20170810215140j:plain

シェーダーを用意して、Materialに設定します(今回はUV1Sample)

gist.github.com

f:id:tsubaki_t1:20170810215639j:plain

後はマテリアルをUIに登録して、Position as UV1を追加します。

f:id:tsubaki_t1:20170810215842j:plain

 

で、何の役に立つの?

知らん、そんな事は俺の管轄外だ

 

関連

実装

Unity-Technologies / UI / source / UnityEngine.UI / UI / Core / VertexModifiers / PositionAsUV1.cs — Bitbucket

【Unity】AnimationControllerからTimelineへのアニメーション切替を目立たなくする

今回はTimelineを再生する際に、アニメーションの切替が一瞬で切り替わってしまう問題の対策についてです。

Timelineを使用するとアニメーションが一瞬で切り替わってしまう

Timelineをキャラクターに流し込んだ際、キャラクターのアニメーションがバツっと一瞬で切り替わってしまう事があります。

例えばダッシュモーション(AnimationController)からジャンプ(timeline)に切り替えると、こんな感じで動作します。アニメーションの切替がいきなり行われてるのが分かります。

f:id:tsubaki_t1:20170810075652g:plain

Timelineの入りと出でフェードする

この問題を解決するには、Timelineの最初のクリップにEase In Duration、最後のクリップにEase Out Durationを設定します。

この時間でAnimationControllerとTimelineでフェードを行います。

f:id:tsubaki_t1:20170810075912j:plain

f:id:tsubaki_t1:20170810075929j:plain

f:id:tsubaki_t1:20170810075444g:plain

 

これなら、ちょっとしたアニメーションの再生(例えばRPG戦闘シーンでのスキル発動や、特定ギミックの発動、死亡アニメーション等々)はTimelineで流し込むといった事ができそうです。