MRが楽しい

MRやVRについて学習したことを書き残す

Unityで基本オブジェクトをフワッと表示させる

本日は Unity の技術調査枠です。
キューブなどの基本オブジェクトを自然にスポーンさせたいことがありました。
実はおいかけっこアプリで似たようなことをしており、記事に記録を残していなかったので書き出します。

まず、基本オブジェクトのスポーン方法です。
GameObject の CreatePrimitive 関数と PrimitiveType を指定する事で任意の基本オブジェクトを生成できます。

// キューブオブジェクトをスポーンする
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

基本オブジェクトは以下の6種類です。
・Sphere  スフィア
Capsule  カプセル
・Cylinder シリンダー
・Cube   キューブ
・Plane   プレーン
・Quad   クアッド
docs.unity3d.com

以下のスクリプトを作成し、この時点でプロジェクトで実行してみます。
・SpawnTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnTest : MonoBehaviour {
    // Use this for initialization
    void Start () {
        // キューブをスポーンする
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        // 位置調整を行う
        cube.transform.position = new Vector3(0, 0, 3);
    }
}

実行すると、キューブが現れました。成功です。
f:id:bluebirdofoz:20180222085213j:plain

しかし、このままだとキューブが何もない空間に突然表示されるので不自然です。
サイズ 0 からサイズ 1 まで徐々に拡大し、フワッと表示されるようカスタマイズします。

以前、学習したコルーチン機能を利用します。
bluebirdofoz.hatenablog.com

スクリプトを以下の通り、書き換えます。
・SpawnTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnTest : MonoBehaviour {

	// Use this for initialization
	void Start ()
    {
        // キューブをスポーンする
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        // 位置調整を行う
        cube.transform.position = new Vector3(0, 0, 3);

        // フワッと表示をコルーチン機能で実行する
        StartCoroutine(ShowHuwaEffect(cube));
    }

    /// <summary>
    /// フワッと表示
    /// </summary>
    IEnumerator ShowHuwaEffect(GameObject target)
    {
        // 繰り返し回数
        int loopcount = 10;

        // 更新間隔
        float waitsecond = 0.05f;

        // スケール設定
        // オフセット値
        float offsetScale = 1.0f / loopcount;
        // 更新値
        float updateScale = 0;

        // オブジェクトの有効化(初期位置)
        target.transform.localScale = new Vector3(0.0f, 0.0f, 0.0f);

        for (int loop = 0; loop < loopcount; loop++)
        {
            // スケール更新
            updateScale = updateScale + offsetScale;
            target.transform.localScale = new Vector3(updateScale, updateScale, updateScale);
            yield return new WaitForSeconds(waitsecond);
        }
        // 最終スケール
        target.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
    }
}

以下のようにキューブがフワッと表示されるようになりました。
f:id:bluebirdofoz:20180222085250g:plain