Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

SphereやCubeのColliderを逆にする

今回はこちらの方法をやってみます。

Twitterから流れてきたTipsです。

 

 

既存のSphereやCubeは外側からしか衝突しませんが、これを反転させる方法です。

ちなみに面が全て反転するのでレンダリングも反転します。

 こちらからの引用のようです

 

 

 

0. 開発環境

  Unity2018.2.3f1

 

1. 球の用意

ではさっそくいってみようやってみよう。

まずは反転させる用のSphereを用意します。

大きいほうがいいですね、Scaleを全て10にしておきましょう。

f:id:Raspberly:20180912223850p:plain

 

 

 

2. 反転させるコード

 次は反転させるソースコードを書いていきます。

        mesh.triangles = mesh.triangles.Reverse().ToArray();

 

meshはそのままメッシュ、trianglesはメッシュを構成する三角形、Reverseで反転と。

わかりやすいですね。ちなみに人によってはこのまま打ち込むとエラーになります。

f:id:Raspberly:20180912230104p:plain

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して確認してみましょう。

f:id:Raspberly:20180912232202p:plain

見事に反転してます。(わかりにくい)

 

3. 使ってみる

ためしにこれで何か遊んでみましょう。

この反転した球体の中に普通のSphere(Rigidbody付き)を入れます。

f:id:Raspberly:20180912232358p:plain

イメージ的には、ボールの中にボールを入れてる感じでしょうか?

ガチャのカプセルの中にちっちゃい小物を入れてガラガラしてるような感じ。

物理演算系のゲームとかに使えそう?

 

一番使えそうなのはフィールド内で特定のオブジェクトの移動範囲を制限するといものでしょう。

f:id:Raspberly:20180912233543p:plain

半球のフィールドというのは3Dで動き回るゲームでよく使うと思います。

 

 

 ちなみに引用元のようにEditor拡張で呼び出せるようにしておくと、Inspectorビューからいつでも反転できるようになります。

f:id:Raspberly:20180912235843p:plain

 

いやーこれはすごく便利ですよ。

f:id:Raspberly:20180912234229p:plain

昔みたいに、透明なCubeを組み合わせてフィールドを囲むとかする必要はないんです!

 

 

 

動画を投稿してくださった方がいました。


Unity SphereのColliderを反転させ、その中で車を走らせてみた!サーカスみたい!