11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-02-04

フォーラムで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

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?