人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

【Unity】フワッと徐々にオブジェクトを出現・生成する方法

 

本記事はDEMO動画にある、

「Unity+AIを用いた手書き数字識別システム」の実装方法について説明する。

 

フワッと表示させる処理は下記サイトから引用しました。

Unityで基本オブジェクトをフワッと表示させる - MRが楽しい

 

 

本記事のテーマ

「フワッと徐々にオブジェクトを出現/生成する方法」

を実装する。

下記DEMO動画内の1:34付近。

Planeオブジェクトが大きくなりながら出現させる方法を実装します。

Demo


www.youtube.com

 

実装動画

本記事の実装を録画した動画です。


www.youtube.com

 

 

実装環境

  • Ubuntu20.04
  • UnityHub2.4.2
  • Unity 2019.4.21f1

 

ソースコード

Githubで管理

・make-objects-apper-graduallyブランチ

ブランチの切り替えは下記画像の赤枠をクリックして変更できる。

f:id:hiro-htm877:20210502170814p:plain

github.com



 

 フワッと徐々にオブジェクトを出現/生成する方法

コードはSmallCubeDirector.csに追加していきます。

オブジェクトの生成はスクリプトから行います。

まずは、Awakeでオブジェクトを作成します。

使用する関数はGameObject.CreatePrimitive()です。これでPlaneオブジェクトを作成します。

	void Awake() {
		csvReaderPlane = GameObject.FindGameObjectWithTag("csvReaderPlane");
		questionBoard = GameObject.CreatePrimitive(PrimitiveType.Plane);
	}

 

出現・生成する位置を指定する

1. transform.positionで出現させる位置を決定します。

2. transform.RotateでPlaneオブジェクトを回転させます。

 

1. transform.position

 positionを数値で指定するのは難しいので一度UnityのScene画面でPlaneオブジェクトを出現させたい位置を決めてから、その時のInspectorにある座標をスクリプトでしようするのが良いと思います。

2. transform.Rotate

 Planeオブジェクトはデフォルトでは面が下を向いているので前へ向けるためにX軸に90度回転させています。 

    public void GenerateQuestionBoard(){

        // 位置調整を行う
        questionBoard.transform.position = new Vector3(2.3f, 1.5f, -30.0f);

        questionBoard.transform.Rotate(new Vector3(90, 0, 0));

        // フワッと徐々にオブジェクトを出現させる
        int test_num = Random.Range(2000,3000);
        List img = test_images[test_num];
        List<List> img_byte2D = convert_data(img, true);
        AttachImage(questionBoard, img_byte2D, IMG_WIDTH, IMG_HEIGHT);
        StartCoroutine(AppearGradually(questionBoard));
    }

 

オブジェクトを徐々に大きくする

target.transform.localScaleでオブジェクトの大きさを指定できます。

はじめにここを0に初期化し、for文で徐々に大きくしていきます。

WaitForSecondsは処理が指定時間Stopする関数です。

※プログラミングでよくあるSleep関数みたいなものです。

    IEnumerator AppearGradually(GameObject target)
    {   
        // 繰り返し回数
        int loopcount = 10;

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

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

        // オブジェクトの大きさを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(0.15f, 0.15f, 0.15f);

        yield return new WaitForSeconds(3f);
    }

 

Fungusからオブジェクト生成関数を呼び出す。

今回はFungusという会話機能ライブラリから会話の最後にPlaneオブジェクトを生成する方法を説明します。

 FungusのFlowchartオブジェクトから使用する会話を選択します。

1.+ボタンから赤枠のInvoke Eventを追加します。

2.青枠に使用したい関数のスクリプトを持つオブジェクトをドラッグ・アンド・ドロップで追加します。

3.緑枠の箇所で呼び出したい関数を選択します。

上記の1−3を実行すると、Invoke Eventを追加したタイミングで関数が呼ばれるようになります。f:id:hiro-htm877:20210515184549p:plain

 

 

以上で実装は終了になります。 

もし、動かない場合はコメント欄にて報告して頂けますと助かります。

 

参考文献

bluebirdofoz.hatenablog.com

 

関連記事 

www.hiro877.com

 

 前回の記事