今回はこちらの方法をやってみます。
Twitterから流れてきたTipsです。
Unityで球やボックスの内側から外に出ないような逆のColliderがほしい時は、球やボックスの面を反転したMeshを用意してMeshColliderを使うらしい。
— tatsunoru (@tatsunoru) September 11, 2018
面を反転するのはmesh.triangles = mesh.triangles.Reverse().ToArray();でいける
既存のSphereやCubeは外側からしか衝突しませんが、これを反転させる方法です。
ちなみに面が全て反転するのでレンダリングも反転します。
こちらからの引用のようです
ここからの引用です!https://t.co/R7BNumQPlI
— tatsunoru (@tatsunoru) September 11, 2018
ソースをリンクせず、自分が思いついたかのように見える書き方になってて反省…!
0. 開発環境
Unity2018.2.3f1
1. 球の用意
ではさっそくいってみようやってみよう。
まずは反転させる用のSphereを用意します。
大きいほうがいいですね、Scaleを全て10にしておきましょう。
2. 反転させるコード
次は反転させるソースコードを書いていきます。
mesh.triangles = mesh.triangles.Reverse().ToArray();
meshはそのままメッシュ、trianglesはメッシュを構成する三角形、Reverseで反転と。
わかりやすいですね。ちなみに人によってはこのまま打ち込むとエラーになります。
Reverseの部分がエラーですね。引数0のReverse関数はないと言われます。
そんな人は、linqを導入しましょう。
using System.Linq;
これによってエラーは消えます。
さて、実際に書いたコードはこうなります。引用先からほぼそのまんまです。
引用元のようにEditor拡張で反転させるのではなく、Start時に反転するようにしました。
ReverseCollider.cs
using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; public class ReverseCollider : MonoBehaviour { public bool removeExistingColliders = true; private void Start() { CreateInvertedMeshCollider(); } public void CreateInvertedMeshCollider() { if (removeExistingColliders) RemoveExistingColliders(); InvertMesh(); gameObject.AddComponent<MeshCollider>(); } private void RemoveExistingColliders() { Collider[] colliders = GetComponents<Collider>(); for (int i = 0; i < colliders.Length; i++) DestroyImmediate(colliders[i]); } private void InvertMesh() { Mesh mesh = GetComponent<MeshFilter>().mesh; mesh.triangles = mesh.triangles.Reverse().ToArray(); } }
呼び出しているのはCreateInvertedMeshColliderです。
InvertMeshだけでもメッシュは反転しますが、Sphereに付属のColliderが悪さをするので、RemoveExistingCollidersで削除します。
このReversCollider.csを最初に作ったSphereにアタッチします。
これで完成です!(コピペしただけ!!!)
あとは実際にPlayして確認してみましょう。
見事に反転してます。(わかりにくい)
3. 使ってみる
ためしにこれで何か遊んでみましょう。
この反転した球体の中に普通のSphere(Rigidbody付き)を入れます。
イメージ的には、ボールの中にボールを入れてる感じでしょうか?
ガチャのカプセルの中にちっちゃい小物を入れてガラガラしてるような感じ。
物理演算系のゲームとかに使えそう?
一番使えそうなのはフィールド内で特定のオブジェクトの移動範囲を制限するといものでしょう。
半球のフィールドというのは3Dで動き回るゲームでよく使うと思います。
ちなみに引用元のようにEditor拡張で呼び出せるようにしておくと、Inspectorビューからいつでも反転できるようになります。
いやーこれはすごく便利ですよ。
昔みたいに、透明なCubeを組み合わせてフィールドを囲むとかする必要はないんです!
動画を投稿してくださった方がいました。