PolygonCollider2D
でかまわないのでしたら、おっしゃるように「RenderTexture → Texture → Sprite → Collider」の方法が使えそうですね。透明部分を持ったスプライトにPolygonCollider2D
をアタッチしてやれば、自動的に透明部分の抜かれた形状が作られますのでお手軽かと思います。
試しに空のオブジェクトにSpriteRenderer
と下記スクリプトをアタッチし...
lang
1using UnityEngine;
2
3[RequireComponent(typeof(SpriteRenderer))]
4public class ColliderGenerator : MonoBehaviour
5{
6 // ここにPolygonCollider2Dの形状の元とするRenderTextureをセットしておく
7 public RenderTexture sourceTexture;
8
9 private void Update()
10 {
11 // さしあたり、今回の実験ではスペースバーを押したときに
12 // 自身のSpriteRendererのSpriteをsourceTextureの内容をもとに
13 // 再作成し、併せてPolygonCollider2Dを再作成することにした
14 if (Input.GetKeyDown(KeyCode.Space))
15 {
16 this.UpdateSprite();
17 }
18 }
19
20 public void UpdateSprite()
21 {
22 // 古いTexture2D、Sprite、PolygonCollider2Dを削除する
23 var spriteRenderer = this.GetComponent<SpriteRenderer>();
24 var sprite = spriteRenderer.sprite;
25 if (sprite != null)
26 {
27 Destroy(sprite.texture);
28 Destroy(sprite);
29 }
30 Destroy(this.GetComponent<PolygonCollider2D>());
31 spriteRenderer.sprite = null;
32
33 // sourceTextureがなければ何もしない
34 if (this.sourceTexture == null)
35 {
36 return;
37 }
38
39 // sourceTextureの内容を読み取って新しいTexture2D、Spriteを作る
40 var activeTexture = RenderTexture.active;
41 RenderTexture.active = this.sourceTexture;
42 var width = this.sourceTexture.width;
43 var height = this.sourceTexture.height;
44 var rect = new Rect(0, 0, width, height);
45 var texture = new Texture2D(width, height);
46 texture.ReadPixels(rect, 0, 0);
47 texture.Apply();
48 spriteRenderer.sprite = Sprite.Create(texture, rect, Vector2.one * 0.5f);
49
50 // 新しいPolygonCollider2Dを作る
51 this.gameObject.AddComponent<PolygonCollider2D>();
52 }
53}
sourceTexture
として下図のような透明背景の映像を使用したところ...
できあがったPolygonCollider2D
の形状は下図のようになりました。
このやり方だと、元となるRenderTexture
の解像度が小さい場合、かなり大ざっぱな形状になるだろうと思います。ある程度解像度を大きくしてやれば元画像の形に忠実な形状になるでしょう。
どうやら外形の精密さを細かく設定する機能はなさそうですので、もっと正確に外形を作りたい場合はおそらく自前で外周パスを求めてやる必要があるかと思います。