テラシュールブログ

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

【Unity】Polygon Collier 2Dの頂点を調整する

f:id:tsubaki_t1:20170822233336j:plain

今回は2DのPolygon Collier 2Dの頂点を調整する方法についてです。左の絵が右のようにスッキリします。

Polygon Collier 2Dの頂点は解像度で決まる

コライダーを計算する際、頂点数が多いよりは小さい方が負荷は低めです。とは言え、綺麗にくり抜いた方が理不尽な当たり判定にならない傾向にあります。

パフォーマンス的にはBoxやCircleを組み合わせた判定を用意するのが良いのですが、所詮は組み合わせ、綺麗に組むためには手間が必要です。

f:id:tsubaki_t1:20170822235202j:plain

 

その辺りPolygon Collier 2Dを使用すると、スプライトのアルファでコライダーの形状を設定してくれるので、地形やスプライトに沿った当たり判定が割と楽に実現出来ます。

キャラクターの頭のような構造も一発です。

f:id:tsubaki_t1:20170822234255g:plain

 

このPolygon Collideが使用する超点数ですが、どうやら画像の解像度で頂点の細かさを決定しているみたいです。

下の絵は2048、256、64の解像度の立ち絵を同じスケールにしたものです。小さい解像度の絵は判定が荒く、大きい解像度の絵は判定が細かくなっている事が確認出来ます。

f:id:tsubaki_t1:20170822234602j:plain

判定を調整したくなるケース

高解像度で(ズームに耐える)絵は細かい判定も綺麗に耐える、粗い(小さい)キャラクターは大雑把…まぁそれは楽なのですが、これが微妙なケースもあります。

 

例えばドット絵は確実に解像度が低いですが、判定が雑であっては困るかもしれません。また、高解像度であっても、判定が雑で良いケースもあるかもしれません。

f:id:tsubaki_t1:20170822235745j:plain

f:id:tsubaki_t1:20170822235922j:plain

コライダーを調整する

コライダーを調整する場合、現状二種類の方法があります。

一つ目はPolygon Collier 2DのEditを使用する方法、もう一つはEdit Physics Shapeで調整する方法です。

Polygon Collier 2DのEdit Collier

Polygon Collier 2DのEdit Collier を押すと、コライダーの計上をシーン上で微調整出来ます。

頂点の位置を調整したり、頂点を増やしたり、Ctrlを押しながら頂点を削除したりと、まぁ簡単な調整はコレでも可能です。

f:id:tsubaki_t1:20170823000329g:plain

ただ、この情報は編集したPolygon Collier 2Dに格納されるので、同じようにスプライトを配置してPolygon Collier 2Dを追加すると、編集前のPolygon Collier 2Dが追加されます。

 

Tips:Polygon Collier 2Dをリセットするとコライダーが元に戻ります。

またPolygon Collier 2Dのコンポーネント内容をコピーすれば、コライダーの内容が移植されます。

f:id:tsubaki_t1:20170823001027g:plain

 

ちなみに、単純に穴を塞ぎたい場合はPointsのPathsを減らすと良いです。

f:id:tsubaki_t1:20170823003121j:plain

Edit Physics Shape

Edit Physics Shapeは最近追加された機能で、スプライトの初期設定のコライダーを調整します。
専用ビューなので、Edit Collier のように選択ミスでフォーカスが外れたりしないのが非常に助かります。あと複数選択

f:id:tsubaki_t1:20170823001527j:plain

Edit Physics ShapeはSprite Editorから入ります。その後、SpriteEditorでEdit Sprite Shapeを選択すればコライダーの編集画面になります。

f:id:tsubaki_t1:20170823001357j:plain

 

初期設定のコライダーの細かさをOutline Toleranceで調整したり、コライダーの形状を調整したり出来ます。

f:id:tsubaki_t1:20170823001910j:plain

f:id:tsubaki_t1:20170823002310g:plain

ちなみに、頂点が3つ以下になるとコライダーの形状がリセットされるという謎挙動です。形状をイチから作りたい場合は、全消しではなく半殺しにしてボコボコにする感じで。

関連

tsubakit1.hateblo.jp

【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を眺める。

 

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

*1:筋肉で問題を解決したら社会的に死ぬ

【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