using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; /// /// 表情の管理クラス /// public class ExpressionManagerScript : MonoBehaviour { public int[] indices; public Vector3[] source; // 元頂点, source_position public Vector3[] composite; public Mesh mesh; // メッシュ private Mesh renderer_shared_mesh; // レンダー共有メッシュ public MMDSkinsScript[] skin_script; // 子供の表情のスクリプト配列 //int lip_count = 0; //int eye_count = 0; //int eye_brow_count = 0; //int other_count = 0; void Init() { // meshの取得 if (!mesh) { //後方互換用コード(新コンバータでは mesh は必ず設定される) //メッシュが設定されていなければ SkinnedMeshRenderer から取得する mesh = transform.parent.gameObject.GetComponent().sharedMesh; } renderer_shared_mesh = (Mesh)Instantiate(mesh); //複製して、書き換えはそちらで行う renderer_shared_mesh.name = "ExpressionManagerScript/" + mesh.name; transform.parent.gameObject.GetComponent().sharedMesh = renderer_shared_mesh; // 頂点インデックス取得 indices = transform.Find("base").GetComponent().targetIndices; skin_script = GetSkinScripts(); // 表情に付いているスクリプトを取得 // 元頂点配列に入れていく source = new Vector3[indices.Length]; for (int i = 0; i < indices.Length; i++) source[i] = mesh.vertices[indices[i]]; // 合成するベクトル配列 composite = new Vector3[indices.Length]; for (int i = 0; i < indices.Length; i++) composite[i] = Vector3.zero; } void Start() { Init(); } // SkinScriptの配列を子供の表情から探して拾ってくる MMDSkinsScript[] GetSkinScripts() { // 表情のスクリプトを拾ってくる var scripts = new MMDSkinsScript[transform.childCount]; for (int i = 0; i < scripts.Length; i++) scripts[i] = transform.GetChild(i).GetComponent(); return scripts; } void LateUpdate() { Renderer renderer=transform.parent.GetComponent(); if(!renderer.enabled) return; var vtxs = renderer_shared_mesh.vertices; // 配列を受け入れ //各表情の合成ベクトルを初期化しておく for (int i = 0; i < indices.Length; i++) composite[i] = Vector3.zero; // 表情ごとに計算する foreach (var s in this.skin_script) { s.Compute(composite); } // ここで計算結果を入れていく for (int i = 0; i < indices.Length; i++) { vtxs[indices[i]] = source[i] + composite[i]; } renderer_shared_mesh.vertices = vtxs; // ここで反映 } }