UnityでLive2Dの影を表示してみた

  • 9
    Like
  • 0
    Comment
More than 1 year has passed since last update.

フォーラムでLive2Dの影を表示してる人がいて、いい感じな表現なので自分もトライしてみました。

・Live2D Community - Shadows of Live2D Model
01.gif

開発環境

・Live2D_SDK_Unity_2.1.00_1_jpのMotionプロジェクト
・Unity5.3.0f4

影を表示するやり方

今回は、RenderTextureを使って影の表示をしてみました。
(Live2Dモデルを2回描画し、片方のテクスチャカラーを変更するという方法もありかも)

プログラムは、以前書いたUnityでLive2Dを簡単フェードインアウトをベースにしています。
今回も既存のソースをいじらずにスクリプトをアタッチすれば、簡単に影を表示できるようにしてみました。
002.png

影を表示するスクリプト

ポイントとしては、Live2Dモデルを写す2つ目のカメラ背景カラーの透明度が0.0でないと以下のようにノイズが入ってしまいます。
003.png

ShadowModel
using UnityEngine;
using System.Collections;

public class ShadowModel : MonoBehaviour {

    private RenderTexture renderTex;
    private GameObject Live2D_Quad;
    private GameObject Live2D_Cam;
    private Renderer Quad_render;
    private Camera dummyCam;
    // 影のX,Y軸ずらす
    private float transX =  0.04f;
    private float transY =  0.02f;
    // RenderTextureがぼやける場合は2048にする
    public int renderSize = 1024;
    // カラー調整用(実行中に変更するとエラーになるので実行前に値を変更)
    public Color rgba = new Color(0.0f, 0.0f, 0.0f, 1.0f);  // 黒


    void Awake () {

        // 一時的なRenderTextureを割り当てます(迅速にRenderTextureを表示したい場合)
        renderTex = RenderTexture.GetTemporary(renderSize, renderSize, 16, RenderTextureFormat.ARGB32);

        // Quadを生成(RenderTexture描画用)
        Live2D_Quad = GameObject.CreatePrimitive(PrimitiveType.Quad); 

        // Live2Dモデルの座標をセット
        Live2D_Quad.transform.position = new Vector3(transX + gameObject.transform.position.x, transY + gameObject.transform.position.y, 0.0f);

        // シェーダー指定とRenderTextureをセット
        Quad_render = Live2D_Quad.GetComponent<Renderer>();
        // Unity5.3からUI/Defaultが上手く機能しなくなったのでSpritesにする
        // Quad_render.material.shader = Shader.Find("UI/Default");
        Quad_render.material.shader = Shader.Find("Sprites/Default");
        Quad_render.material.SetTexture("_MainTex", renderTex);
        Quad_render.name = gameObject.name + "_Quad"; 
        // Quadのカラーを変更
        Quad_render.material.color = rgba;


        // Live2Dを映す第2カメラ
        Live2D_Cam = new GameObject("Live2D Camera");
        Live2D_Cam.transform.position = new Vector3(0.0f, 0.0f, -10.0f);
        Live2D_Cam.AddComponent<Camera>(); 

        // カメラの設定とRenderTextureをセット
        dummyCam = Live2D_Cam.GetComponent<Camera>();
        dummyCam.orthographic = true;
        dummyCam.orthographicSize = 1;
        dummyCam.backgroundColor = new Color (1.0f ,1.0f, 1.0f, 0.0f);  // アルファを0.0にしないとノイズが入る
        dummyCam.clearFlags = CameraClearFlags.SolidColor;
        dummyCam.targetTexture = renderTex; 

    }

    void Update () {
        // QuadとLive2Dモデルサイズを同期
        Live2D_Quad.transform.localScale = gameObject.transform.localScale * 4.0f;
        // orthographicSizeとLive2Dモデルサイズを同期
        dummyCam.orthographicSize = Mathf.Max(gameObject.transform.localScale.x, gameObject.transform.localScale.y) * 2.0f;

        if(Live2D_Quad){
            Quad_render.material.color = rgba;

        }
    }

    void OnDestroy(){
        // Live2DのGameObjectが削除されたらダミーで作ったものも削除
        RenderTexture.ReleaseTemporary(renderTex);
        Destroy(Live2D_Cam);
        Destroy(Live2D_Quad);
    }
}

また、投影しているQuadを回転してやれば地面に影も写す感じもできて表現が広がりますね!
004.gif