すくまりのメモ帳すくまりのメモ帳
← 記事一覧に戻る

【Unity, Collider】衝突したオブジェクトをタグで選択してマテリアルを変更する

【Unity, Collider】衝突したオブジェクトをタグで選択してマテリアルを変更する

はじめに

2018/11/25 開催の「1 Week Game JAM」でミニゲームを作りました。

このゲームではボールと足場のCubeが衝突するとCubeのマテリアルを変更する処理を導入しています。

この記事ではオブジェクト同士の衝突判定を取得する方法を紹介します。

【生き残れ!! ないんぼーる】

ビリヤードのルール、「ナインボール」では10個の玉を使用します。

プレイヤーは「白玉」を操作し、出来るだけ長い時間、
10×10マスのブロック上に居続けるゲームです。

10秒後には10個の玉が追加されます。

大体10秒くらいで死にます。#unity1week pic.twitter.com/vvf2P7v26R

— すくまり@2019年から自宅警備員 (@squmari) 2018年11月23日

https://unityroom.com/games/squmari-nineball

Materialを用意する

Assetsフォルダ内にResourcesフォルダを作成し、その中にMaterialsフォルダを作成してください。

Materialsフォルダの名前はなんでもいいですが、Resourcesフォルダは特別なフォルダなので、必ず「Resources」と命名してください。

右クリック>Create >Material よりマテリアルを作成してください。

今回は、「CubeMaterial」と「SphereMaterial」の二つを使用します。

マテリアルをクリックして、インスペクターからShaderの設定を、「Legacy Shaders > Diffuse」に変えてください。

ここで、Main Color やテクスチャの画像を変更できます。

テクスチャを変更する際は、右上の黒枠内に画像をドラッグ&ドロップしてください。

もし、この段階でSphereやCubeのマテリアルを変更したい場合は、ヒエラルキーのSphereをクリックし、インスペクター状でマテリアルをドラッグ&ドロップしてください。

Colliderで衝突判定を付与する

衝突判定にはColliderコンポーネントを使用します。

詳しい衝突判定の説明は、以下のページを参照してください。

/posts/unity-beginner-collision-break/

Colliderを利用するために、インスペクター上でSphereに RigidbodyをAdd Compornentしてください。

また、以下のコードを記入したスクリプトをSphereにアタッチしてください。

materials = Resources.LoadAll<Material>("Materials/"); でMaterialsフォルダ内に入っているマテリアルを全て取得します。

ただし、フォルダ内の並び順で取得するので、順番を変更したいときは、名前を「0」や「1」のようにナンバリングしてください。

スクリプトをアタッチした方のオブジェクトのマテリアルを変更するときは、

gameObject.GetComponent<Renderer>().material = materials[0];

衝突された方をオブジェクトのマテリアルを変更するときは、

collision.gameObject.GetComponent<Renderer>().material = materials[1];

と記入してください。

これで実行すると、SphereがMinusマテリアル、CubeはPlusマテリアルがセットされます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour {
 
    Material[] materials;
 
 
	// Use this for initialization
	void Start () {
 
        //Resourcesフォルダからマテリアルを読み込む
        materials = Resources.LoadAll<Material>("Materials/");
    }
 
    // Update is called once per frame
    void Update () {
 
    }
 
    void OnCollisionEnter(Collision collision)
    {
        Debug.Log("衝突したオブジェクト:" + gameObject.name);
        Debug.Log("衝突されたオブジェクト:" + collision.gameObject.name);
 
        //オブジェクトのマテリアルを変更する
        gameObject.GetComponent<Renderer>().material = materials[0];
        collision.gameObject.GetComponent<Renderer>().material = materials[1];
 
    }
 
}
 
 

Tagを設定して選択的にMaterialを変更する

ヒエラルキー上のSphere をクリックしてインスペクターを開き、上部にあるTag をクリックしてAdd Tagを選択してください。

TagsのList is Emptyの右下に+マークがあるのでクリックし、New Taf Name に Sphere と Cube を追加してSave してください。

これでオリジナルタグが使えるようになったので、Sphere に Sphere タグを、CubeにCubeタグをセットしてください。

これでタグの設定は終了です。

スクリプトのコードを以下のように書き換えてください。

これで、Cubeタグが付いているCubeと接触した場合のみ、マテリアルが変化します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour {
 
    Material[] materials;
 
 
	// Use this for initialization
	void Start () {
 
        //Resourcesフォルダからマテリアルを読み込む
        materials = Resources.LoadAll<Material>("Materials/");
    }
 
    // Update is called once per frame
    void Update () {
 
    }
 
    void OnCollisionEnter(Collision collision)
    {
        Debug.Log("衝突したオブジェクト:" + gameObject.name);
        Debug.Log("衝突されたオブジェクト:" + collision.gameObject.name);
 
        //"Cube"タグが付いているオブジェクトのマテリアルを変更する
        if (collision.gameObject.tag == "Cube")
        {
            gameObject.GetComponent<Renderer>().material = materials[0];
            collision.gameObject.GetComponent<Renderer>().material = materials[1];
        }
 
    }
 
}
 
 

関連記事

/posts/unity-begginner-collider-type/

/posts/unity-beginner-collision-break/

忙しい人のためのUnity入門講座へ戻る