gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

Unityでオブジェクトを割る

Unityでこんな感じで画像を割ります。

f:id:gologius:20170819124203g:plain

ちなみに予め破片モデルを用意する方法です。なので、毎回割れ方は同じです。 有料Assetならもっといいのがあるのですが。

ソース

さっさとデータ欲しい、見たい人はこちら github.com

説明

先に述べたように、予めモデルを作っておいて破壊時に散らかす方法です。 DebrisにRididbodyとColoderを設定した上で非表示(SetActive(false))にしておいて、スペースキーを押すと Coliderのおかげで勝手に弾けて散らかる、という感じです。

GameObjectのDebrisの子要素に、破片用オブジェクトがないと、動かないので注意してください。

モデルはMetasequoiaで作成しました。

f:id:gologius:20170819124901p:plain

using UnityEngine;
using System.Collections;
using System.IO;


/// <summary>
/// 条件
/// * このGameObject以下に破片用の子GameObject(以下破片オブジェクト)がある
/// * 破片オブジェクトにRigidbodyとColiderが設定されている
/// </summary>
public class ImagePanel : MonoBehaviour {

    [Tooltip("表示させる画像")]
    public Texture texure = null;

    [Tooltip("破壊前に見える板")]
    public GameObject panel;

    [Tooltip("破壊後の破片を纏めているオブジェクト")]
    public GameObject debris;

    private bool isFinish = false; //debug

    void Start()
    {
        //エラー処理
        if (texure == null)
        {
            Debug.LogError("Texture is null");
            isFinish = true;
            return;
        }

        debris.SetActive(false); //飛び散らないように非アクティブにしておく

        //Texture設定
        panel.GetComponent<Renderer>().material.mainTexture = texure;
        foreach (Transform child in debris.transform)
        {
            child.gameObject.GetComponent<Renderer>().material.mainTexture = texure; //破片すべてにTexture設定
        } 
    }

    void Update () {
        //debug スペースキーを押すと爆散する
        if (Input.GetKeyDown(KeyCode.Space) && !isFinish)
        {
            crash();
            isFinish = true;
        }
    }


    public void crash()
    {
        debris.SetActive(true); //破片を表示
        debris.transform.parent = null; //Destroy(this.gameObject)に巻き込まれないように
        Destroy(debris, 10.0f);


        Destroy(this.gameObject);
    }
 }

最初は破壊前の板、このサンプルではPanelは使用していませんでした。 ただ、

  • ヒビが見える(透明なマテリアルを適用したときには特に)
  • 処理速度が遅い(Coliderの衝突判定が常に走るから)

の理由で、破壊前の板を用意しています。