public static void Initialize(MMDEngine engine, int[] groupTarget, List<int>[] ignoreGroups, GameObject[] rigidArray) { if (!engine.useRigidbody) { engine.groupTarget = groupTarget; engine.rigids = rigidArray; engine.useRigidbody = true; engine.ignore1 = ignoreGroups[0].ToArray(); engine.ignore2 = ignoreGroups[1].ToArray(); engine.ignore3 = ignoreGroups[2].ToArray(); engine.ignore4 = ignoreGroups[3].ToArray(); engine.ignore5 = ignoreGroups[4].ToArray(); engine.ignore6 = ignoreGroups[5].ToArray(); engine.ignore7 = ignoreGroups[6].ToArray(); engine.ignore8 = ignoreGroups[7].ToArray(); engine.ignore9 = ignoreGroups[8].ToArray(); engine.ignore10 = ignoreGroups[9].ToArray(); engine.ignore11 = ignoreGroups[10].ToArray(); engine.ignore12 = ignoreGroups[11].ToArray(); engine.ignore13 = ignoreGroups[12].ToArray(); engine.ignore14 = ignoreGroups[13].ToArray(); engine.ignore15 = ignoreGroups[14].ToArray(); engine.ignore16 = ignoreGroups[15].ToArray(); } }
public static void Initialize(MMDEngine engine, int[] groupTarget, List <int>[] ignoreGroups, GameObject[] rigidArray) { if (!engine.useRigidbody) { engine.groupTarget = groupTarget; engine.rigids = rigidArray; engine.useRigidbody = true; engine.ignore1 = ignoreGroups[0].ToArray(); engine.ignore2 = ignoreGroups[1].ToArray(); engine.ignore3 = ignoreGroups[2].ToArray(); engine.ignore4 = ignoreGroups[3].ToArray(); engine.ignore5 = ignoreGroups[4].ToArray(); engine.ignore6 = ignoreGroups[5].ToArray(); engine.ignore7 = ignoreGroups[6].ToArray(); engine.ignore8 = ignoreGroups[7].ToArray(); engine.ignore9 = ignoreGroups[8].ToArray(); engine.ignore10 = ignoreGroups[9].ToArray(); engine.ignore11 = ignoreGroups[10].ToArray(); engine.ignore12 = ignoreGroups[11].ToArray(); engine.ignore13 = ignoreGroups[12].ToArray(); engine.ignore14 = ignoreGroups[13].ToArray(); engine.ignore15 = ignoreGroups[14].ToArray(); engine.ignore16 = ignoreGroups[15].ToArray(); } }
// クリップをアニメーションに登録する private AnimationClip CreateAnimationClip_(MMD.VMD.VMDFormat format, GameObject assign_pmd, int interpolationQuality) { //スケール設定 scale_ = 1.0f; if (!assign_pmd) { return(null); } MMDEngine engine = assign_pmd.GetComponent <MMDEngine>(); if (!engine) { return(null); } scale_ = engine.scale; //Animation anim = assign_pmd.GetComponent<Animation>(); // クリップの作成 AnimationClip clip = new AnimationClip(); clip.name = assign_pmd.name + "_" + format.name; Dictionary <string, string> bone_path = new Dictionary <string, string>(); Dictionary <string, GameObject> gameobj = new Dictionary <string, GameObject>(); GetGameObjects(gameobj, assign_pmd); // 親ボーン下のGameObjectを取得 FullSearchBonePath(assign_pmd.transform, bone_path); FullEntryBoneAnimation(format, clip, bone_path, gameobj, interpolationQuality); CreateKeysForSkin(format, clip); // 表情の追加 return(clip); }
// PMDファイルをUnity形式に変換 void BurnUnityFormatForPMD(MMD.PMD.PMDFormat format) { format.fst = this.fst; obj = new GameObject(format.name); format.caller = obj; format.shader_type = this.shader_type; MMD.PMD.PMDConverter conv = new MMD.PMD.PMDConverter(); this.mesh = conv.CreateMesh(format); // メッシュの生成・設定 this.materials = conv.CreateMaterials(format); // マテリアルの生成・設定 this.bones = conv.CreateBones(format); // ボーンの生成・設定 // バインドポーズの作成 conv.BuildingBindpose(format, this.mesh, this.materials, this.bones); obj.AddComponent <Animation>(); // アニメーションを追加 MMDEngine engine = obj.AddComponent <MMDEngine>(); // IKの登録 if (this.use_ik) { engine.ik_list = conv.EntryIKSolver(format, this.bones); } // 剛体関連 if (this.rigidFlag) { try { this.rigids = conv.CreateRigids(format, bones); conv.AssignRigidbodyToBone(format, this.bones, this.rigids); conv.SetRigidsSettings(format, this.bones, this.rigids); conv.SettingJointComponent(format, this.bones, this.rigids); // 非衝突グループ List <int>[] ignoreGroups = conv.SettingIgnoreRigidGroups(format, this.rigids); int[] groupTarget = conv.GetRigidbodyGroupTargets(format, rigids); MMDEngine.Initialize(engine, groupTarget, ignoreGroups, this.rigids); } catch { } } #if UNITY_4_0 AvatarSettingScript avt_setting = new AvatarSettingScript(format.caller); avt_setting.SettingAvatar(); #endif var window = LoadedWindow.Init(); window.Text = format.head.comment; CreatePrefab(format); EndOfScript(format); }
/// <summary> /// エッジ幅の為のInspector描画 /// </summary> /// <returns>更新が有ったか(true:更新有り, false:未更新)</returns> private bool OnInspectorGUIforOutlineWidth() { MMDEngine self = (MMDEngine)target; bool is_update = false; #if !MFU_DISABLE_LEGACY_DATA_SUPPORT if (0 == self.material_outline_widths.Length) { //material_outline_widthsが設定されていないなら(昔の変換データ) Material[] materials = GetMaterials(self); if (0 < materials.Length) { //マテリアルが有り、今のエッジ幅が0.0fで無いなら //データ生成を試みる self.material_outline_widths = materials.Select(x => x.GetFloat("_OutlineWidth")).ToArray(); } } #endif float outline_width = self.outline_width; outline_width = EditorGUILayout.Slider("Outline Width", outline_width, 0.0f, 2.0f); if (self.outline_width != outline_width) { //変更が掛かったなら Material[] materials = GetMaterials(self); //Undo登録 var record_objects = materials.Select(x => (UnityEngine.Object)x) //マテリアル全てと .Concat(new UnityEngine.Object[] { self }) //UnityEngine .ToArray(); #if !UNITY_4_2 //4.3以降 Undo.RecordObjects(record_objects, "Outline Width Change"); #else Undo.RegisterUndo(record_objects, "Outline Width Change"); #endif //更新 const float c_default_scale = 0.085f; //0.085fの時にMMDと一致する様にしているので、それ以外なら補正 self.outline_width = outline_width; foreach (var i in Enumerable.Range(0, materials.Length) .Select(x => new { material = materials[x], edge_size = self.material_outline_widths[x] })) { i.material.SetFloat("_OutlineWidth", i.edge_size * outline_width * self.scale / c_default_scale); } is_update = true; } return(is_update); }
/// <summary> /// 本来の順序で材質一覧の取得 /// </summary> /// <returns>材質一覧</returns> /// <param name='engine'>材質を取得するMMDEngine</param> static Material[] GetMaterials(MMDEngine engine) { SkinnedMeshRenderer[] renderers = engine.GetComponentsInChildren <SkinnedMeshRenderer>(); Material[] result = renderers.SelectMany(x => x.sharedMaterials).Distinct().ToArray(); if (1 < renderers.Length) { //rendererが複数有る(≒PMX)なら //PMXでは名前の先頭にはマテリアルインデックスが有るのでそれを参考にソート //PMDではrendererが1つしか無く、かつソート済みの為不要 System.Array.Sort(result, (x, y) => { string x_name = x.name.Substring(0, x.name.IndexOf('_')); string y_name = y.name.Substring(0, y.name.IndexOf('_')); int x_int, y_int; Int32.TryParse(x_name, out x_int); Int32.TryParse(y_name, out y_int); return(x_int - y_int); }); } return(result); }
/// <summary> /// リジッドボティ使用の為のInspector描画 /// </summary> /// <returns>更新が有ったか(true:更新有り, false:未更新)</returns> private bool OnInspectorGUIforUseRigidbody() { MMDEngine self = (MMDEngine)target; bool is_update = false; bool use_rigidbody = self.useRigidbody; use_rigidbody = EditorGUILayout.Toggle("Use Rigidbody", use_rigidbody); if (self.useRigidbody != use_rigidbody) { //変更が掛かったなら //Undo登録 Undo.RegisterUndo(self, "Use Rigidbody Change"); //更新 self.useRigidbody = use_rigidbody; is_update = true; } return(is_update); }
/// <summary> /// エッジ幅の為のInspector描画 /// </summary> /// <returns>更新が有ったか(true:更新有り, false:未更新)</returns> private bool OnInspectorGUIforOutlineWidth() { MMDEngine self = (MMDEngine)target; bool is_update = false; float outline_width = self.outline_width; outline_width = EditorGUILayout.Slider("Outline Width", outline_width, 0.0f, 2.0f); if (self.outline_width != outline_width) { //変更が掛かったなら //Undo登録 Undo.RegisterUndo(self, "Outline Width Change"); //更新 self.outline_width = outline_width; is_update = true; } return(is_update); }
/// <summary> /// IKリストの為のInspector描画 /// </summary> /// <returns>更新が有ったか(true:更新有り, false:未更新)</returns> private bool OnInspectorGUIforIkList() { MMDEngine self = (MMDEngine)target; bool is_update = false; //IKリストツリータイトル ik_list_display_ = EditorGUILayout.Foldout(ik_list_display_, "IK List"); //IKリストツリー内部 if (ik_list_display_) { //IKリストを表示するなら GUIStyle style = new GUIStyle(); style.margin.left = 10; EditorGUILayout.BeginVertical(style); { foreach (CCDIKSolver ik in self.ik_list) { bool enabled = ik.enabled; enabled = EditorGUILayout.Toggle(ik.name, enabled); if (ik.enabled != enabled) { //変更が掛かったなら //Undo登録 #if !UNITY_4_2 //4.3以降 Undo.RecordObject(ik, "Enabled Change"); #else Undo.RegisterUndo(ik, "Enabled Change"); #endif //更新 ik.enabled = enabled; //改変したIKのInspector更新 EditorUtility.SetDirty(ik); is_update = true; } } } EditorGUILayout.EndVertical(); } return(is_update); }
private GameObject CreateGameObject_(PMDFormat format, ShaderType shader_type, bool use_rigidbody, bool use_mecanim, bool use_ik, float scale) { format_ = format; shader_type_ = shader_type; use_rigidbody_ = use_rigidbody; use_mecanim_ = use_mecanim; use_ik_ = use_ik; scale_ = scale; root_game_object_ = new GameObject(format_.name); Mesh mesh = CreateMesh(); // メッシュの生成・設定 Material[] materials = CreateMaterials(); // マテリアルの生成・設定 GameObject[] bones = CreateBones(); // ボーンの生成・設定 // バインドポーズの作成 BuildingBindpose(mesh, materials, bones); MMDEngine engine = root_game_object_.AddComponent <MMDEngine>(); //スケール・エッジ幅 engine.scale = scale_; engine.outline_width = default_outline_width; engine.material_outline_widths = Enumerable.Repeat(1.0f, materials.Length).ToArray(); // IKの登録 if (use_ik_) { engine.ik_list = EntryIKSolver(bones); } // 剛体関連 if (use_rigidbody_) { try { var rigids = CreateRigids(bones); AssignRigidbodyToBone(bones, rigids); SetRigidsSettings(bones, rigids); GameObject[] joints = SettingJointComponent(bones, rigids); GlobalizeRigidbody(joints); // 非衝突グループ List <int>[] ignoreGroups = SettingIgnoreRigidGroups(rigids); int[] groupTarget = GetRigidbodyGroupTargets(rigids); MMDEngine.Initialize(engine, groupTarget, ignoreGroups, rigids); } catch { } } // Mecanim設定 if (use_mecanim_) { AvatarSettingScript avatar_setting = new AvatarSettingScript(root_game_object_, bones); avatar_setting.SettingHumanAvatar(); string path = format_.folder + "/"; string name = GetFilePathString(format_.name); string file_name = path + name + ".avatar.asset"; avatar_setting.CreateAsset(file_name); } else { root_game_object_.AddComponent <Animation>(); // アニメーション追加 } return(root_game_object_); }
/// <summary> /// カスタムレンダーキューの為のInspector描画 /// </summary> /// <returns>更新が有ったか(true:更新有り, false:未更新)</returns> private bool OnInspectorGUIforRenderQueue() { MMDEngine self = (MMDEngine)target; bool is_update = false; #if !MFU_DISABLE_LEGACY_DATA_SUPPORT if ((false == self.enable_render_queue) && (0 == self.render_queue_value)) { //カスタムレンダーキュー関連が設定されていないなら(昔の変換データ) //無効状態で初期化 self.enable_render_queue = false; const int c_render_queue_transparent = 3000; self.render_queue_value = c_render_queue_transparent; } #endif bool enable_render_queue = self.enable_render_queue; enable_render_queue = EditorGUILayout.Toggle("Render Queue", enable_render_queue); if (self.enable_render_queue != enable_render_queue) { //変更が掛かったなら is_update = true; } int render_queue_value = -1; if (enable_render_queue) { //有効なら render_queue_value = self.render_queue_value; render_queue_value = EditorGUILayout.IntField("Render Queue Value", render_queue_value); if (self.render_queue_value != render_queue_value) { //変更が掛かったなら is_update = true; } } if (is_update) { //変更が掛かったなら Material[] materials = GetMaterials(self); //Undo登録 var record_objects = materials.Select(x => (UnityEngine.Object)x) //マテリアル全てと .Concat(new UnityEngine.Object[] { self }) //UnityEngine .ToArray(); #if !UNITY_4_2 //4.3以降 Undo.RecordObjects(record_objects, "Render Queue Change"); #else Undo.RegisterUndo(record_objects, "Render Queue Change"); #endif //更新 self.enable_render_queue = enable_render_queue; if (enable_render_queue) { //有効化 self.render_queue_value = render_queue_value; for (int i = 0, i_max = materials.Length; i < i_max; ++i) { var material = materials[i]; ShaderFlag flag = AnalyzeShaderFlag(material); if (0 != (flag & ShaderFlag.MmdShader)) { //Mmdシェーダーなら //カスタムレンダーキュー if (0 != (flag & ShaderFlag.Transparent)) { //透過なら //マテリアル順にカスタムレンダーキューを設定 material.renderQueue = render_queue_value + i; } else { //不透明なら //カスタムレンダーキューを解除 material.renderQueue = -1; } } } } else { //無効化 foreach (var material in materials) { ShaderFlag flag = AnalyzeShaderFlag(material); if (0 != (flag & ShaderFlag.MmdShader)) { //Mmdシェーダーなら //カスタムレンダーキューを解除 material.renderQueue = -1; } } } } return(is_update); }
/// <summary> /// シェーダーリストの為のInspector描画 /// </summary> /// <returns>更新が有ったか(true:更新有り, false:未更新)</returns> private bool OnInspectorGUIforShaderList() { MMDEngine self = (MMDEngine)target; bool is_update = false; //シェーダーリストタイトル shader_display_ = EditorGUILayout.Foldout(shader_display_, "Shader List"); //シェーダーリスト内部 if (shader_display_) { //シェーダーリストを表示するなら Material[] materials = GetMaterials(self); GUIStyle style = new GUIStyle(); style.margin.left = 10; EditorGUILayout.BeginVertical(style); { //タイトル EditorGUILayout.BeginHorizontal(); { //ラベル EditorGUILayout.LabelField("Material", GUILayout.Width(64)); //シェーダー EditorGUILayout.LabelField(new GUIContent("Tr", "Transparent"), GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Eg", "Edge"), GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Rv", "Reversible"), GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Cs", "CastShadow"), GUILayout.Width(20)); #if MFU_ENABLE_NO_RECEIVE_SHADOW_SHADER //影受け無しのシェーダはまだ無いので無効化 EditorGUILayout.LabelField(new GUIContent("Rs", "ReceiveShadow"), GUILayout.Width(20)); #endif //MFU_ENABLE_NO_RECEIVE_SHADOW_SHADER EditorGUILayout.LabelField("", GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Hi", "Highlight"), GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Hd", "Hidden"), GUILayout.Width(20)); } EditorGUILayout.EndHorizontal(); //描画用配列 var parameter_table = new[] { new { flag = ShaderFlag.Transparent, reverse = false } , new { flag = ShaderFlag.Outline, reverse = false } , new { flag = ShaderFlag.CullBack, reverse = true } //背景カリングON/OFFはわかり辛いので、MMDの様に両面描画ON/OFFで扱う , new { flag = ShaderFlag.NoCastShadow, reverse = true } //影放たないON/OFFの2重否定を止めて影放つON/OFFで扱う #if MFU_ENABLE_NO_RECEIVE_SHADOW_SHADER //影受け無しのシェーダはまだ無いので無効化 , new { flag = ShaderFlag.NoReceiveShadow, reverse = true } //影受けないON/OFFの2重否定を止めて影受けるON/OFFで扱う #endif //MFU_ENABLE_NO_RECEIVE_SHADOW_SHADER , new { flag = (ShaderFlag)0, reverse = false } , new { flag = ShaderFlag.Highlight, reverse = false } , new { flag = ShaderFlag.Hidden, reverse = false } }; //マテリアル for (int i = 0, i_max = materials.Length; i < i_max; ++i) { Material material = materials[i]; EditorGUILayout.BeginHorizontal(); { //ラベル EditorGUILayout.LabelField(new GUIContent(material.name, material.name), GUILayout.Width(64)); //シェーダー if (IsMmdShader(material)) { //MMDシェーダーなら bool is_change_shader = false; ShaderFlag flag = AnalyzeShaderFlag(material); foreach (var param in parameter_table) { if (0 != param.flag) { //描画用 bool enable_old = 0 != ((int)flag & (int)param.flag); if (param.reverse) { enable_old = !enable_old; } bool enable = EditorGUILayout.Toggle(enable_old, GUILayout.Width(20)); if (enable_old != enable) { //更新 if (param.reverse) { enable = !enable; } flag = (ShaderFlag)((int)flag ^ (int)param.flag); is_change_shader = true; } } else { //スペース用 EditorGUILayout.LabelField("", GUILayout.Width(20)); } } if (is_change_shader) { //変更が掛かったなら //Undo登録 #if !UNITY_4_2 //4.3以降 Undo.RecordObject(material, "Shader Change"); #else Undo.RegisterUndo(material, "Shader Change"); #endif int render_queue = ((self.enable_render_queue)? self.render_queue_value + i: -1); SetShader(material, flag, render_queue); is_update = true; } } } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.EndVertical(); } return(is_update); }
/// <summary> /// 本来の順序で材質一覧の取得 /// </summary> /// <returns>材質一覧</returns> /// <param name='engine'>材質を取得するMMDEngine</param> static Material[] GetMaterials(MMDEngine engine) { SkinnedMeshRenderer[] renderers = engine.GetComponentsInChildren<SkinnedMeshRenderer>(); Material[] result = renderers.SelectMany(x=>x.sharedMaterials).Distinct().ToArray(); if (1 < renderers.Length) { //rendererが複数有る(≒PMX)なら //PMXでは名前の先頭にはマテリアルインデックスが有るのでそれを参考にソート //PMDではrendererが1つしか無く、かつソート済みの為不要 System.Array.Sort(result, (x,y)=>{ string x_name = x.name.Substring(0, x.name.IndexOf('_')); string y_name = y.name.Substring(0, y.name.IndexOf('_')); int x_int, y_int; Int32.TryParse(x_name, out x_int); Int32.TryParse(y_name, out y_int); return x_int - y_int; }); } return result; }
//-------------------------------------------------------------------------------- // PMDファイルの読み込み // PMDファイルをUnity形式に変換 void BurnUnityFormatForPMD() { MMD.PMD.PMDConverter conv = new MMD.PMD.PMDConverter(); GameObject obj = new GameObject(this.format.name); this.format.fst = this.fst; this.format.caller = obj; this.format.shader_type = this.shader_type; Mesh mesh = conv.CreateMesh(this.format); // メッシュの生成・設定 Material[] materials = conv.CreateMaterials(this.format); // マテリアルの生成・設定 GameObject[] bones = conv.CreateBones(this.format); // ボーンの生成・設定 // バインドポーズの作成 conv.BuildingBindpose(this.format, mesh, materials, bones); obj.AddComponent <Animation>(); // アニメーションを追加 MMDEngine engine = obj.AddComponent <MMDEngine>(); // IKの登録 if (this.use_ik) { engine.ik_list = conv.EntryIKSolver(this.format, bones); } // 剛体関連 if (this.rigidFlag) { try { var rigids = conv.CreateRigids(this.format, bones); conv.AssignRigidbodyToBone(this.format, bones, rigids); conv.SetRigidsSettings(this.format, bones, rigids); conv.SettingJointComponent(this.format, bones, rigids); // 非衝突グループ List <int>[] ignoreGroups = conv.SettingIgnoreRigidGroups(this.format, rigids); int[] groupTarget = conv.GetRigidbodyGroupTargets(this.format, rigids); MMDEngine.Initialize(engine, groupTarget, ignoreGroups, rigids); } catch { } } // Mecanim設定 (not work yet..) #if UNITY_4_0 || UNITY_4_1 AvatarSettingScript avt_setting = new AvatarSettingScript(this.format.caller); avt_setting.SettingAvatar(); #endif // プレファブに登録 Object prefab = PrefabUtility.CreateEmptyPrefab(this.format.folder + "/" + format.name + ".prefab"); PrefabUtility.ReplacePrefab(this.format.caller, prefab); // アセットリストの更新 AssetDatabase.Refresh(); // 一度,表示されているモデルを削除して新しくPrefabのインスタンスを作る GameObject.DestroyImmediate(obj); PrefabUtility.InstantiatePrefab(prefab); }
/// <summary> /// シェーダーリストの為のInspector描画 /// </summary> /// <returns>更新が有ったか(true:更新有り, false:未更新)</returns> private bool OnInspectorGUIforShaderList() { MMDEngine self = (MMDEngine)target; bool is_update = false; //シェーダーリストタイトル shader_display_ = EditorGUILayout.Foldout(shader_display_, "Shader List"); //シェーダーリスト内部 if (shader_display_) { //シェーダーリストを表示するなら SkinnedMeshRenderer[] renderers = self.GetComponentsInChildren <SkinnedMeshRenderer>(); Material[] materials = renderers.SelectMany(x => x.sharedMaterials).ToArray(); if (1 < renderers.Length) { //rendererが複数有る(≒PMX)なら //PMXでは名前の先頭にはマテリアルインデックスが有るのでそれを参考にソート //PMDではrendererが1つしか無く、かつソート済みの為不要 System.Array.Sort(materials, (x, y) => { string x_name = x.name.Substring(0, x.name.IndexOf('_')); string y_name = y.name.Substring(0, y.name.IndexOf('_')); int x_int, y_int; Int32.TryParse(x_name, out x_int); Int32.TryParse(y_name, out y_int); return(x_int - y_int); }); } GUIStyle style = new GUIStyle(); style.margin.left = 10; EditorGUILayout.BeginVertical(style); { //タイトル EditorGUILayout.BeginHorizontal(); { //ラベル EditorGUILayout.LabelField("Material", GUILayout.Width(64)); //シェーダー EditorGUILayout.LabelField(new GUIContent("Tr", "Transparent"), GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Eg", "Edge"), GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Rv", "Reversible"), GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Cs", "CastShadow"), GUILayout.Width(20)); #if MFU_ENABLE_NO_RECEIVE_SHADOW_SHADER //影受け無しのシェーダはまだ無いので無効化 EditorGUILayout.LabelField(new GUIContent("Rs", "ReceiveShadow"), GUILayout.Width(20)); #endif //MFU_ENABLE_NO_RECEIVE_SHADOW_SHADER EditorGUILayout.LabelField("", GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Hi", "Highlight"), GUILayout.Width(20)); EditorGUILayout.LabelField(new GUIContent("Hd", "Hidden"), GUILayout.Width(20)); } EditorGUILayout.EndHorizontal(); //描画用配列 var parameter_table = new[] { new { flag = ShaderFlag.Transparent, reverse = false } , new { flag = ShaderFlag.Outline, reverse = false } , new { flag = ShaderFlag.CullBack, reverse = true } //背景カリングON/OFFはわかり辛いので、MMDの様に両面描画ON/OFFで扱う , new { flag = ShaderFlag.NoCastShadow, reverse = true } //影放たないON/OFFの2重否定を止めて影放つON/OFFで扱う #if MFU_ENABLE_NO_RECEIVE_SHADOW_SHADER //影受け無しのシェーダはまだ無いので無効化 , new { flag = ShaderFlag.NoReceiveShadow, reverse = true } //影受けないON/OFFの2重否定を止めて影受けるON/OFFで扱う #endif //MFU_ENABLE_NO_RECEIVE_SHADOW_SHADER , new { flag = (ShaderFlag)0, reverse = false } , new { flag = ShaderFlag.Highlight, reverse = false } , new { flag = ShaderFlag.Hidden, reverse = false } }; //マテリアル int material_index = 0; foreach (var material in materials) { EditorGUILayout.BeginHorizontal(); { //ラベル EditorGUILayout.LabelField(new GUIContent((material_index++).ToString(), material.name), GUILayout.Width(64)); //シェーダー if (IsMmdShader(material)) { //MMDシェーダーなら bool is_change_shader = false; ShaderFlag flag = AnalyzeShaderFlag(material); foreach (var param in parameter_table) { if (0 != param.flag) { //描画用 bool enable_old = 0 != ((int)flag & (int)param.flag); if (param.reverse) { enable_old = !enable_old; } bool enable = EditorGUILayout.Toggle(enable_old, GUILayout.Width(20)); if (enable_old != enable) { //更新 if (param.reverse) { enable = !enable; } flag = (ShaderFlag)((int)flag ^ (int)param.flag); is_change_shader = true; } } else { //スペース用 EditorGUILayout.LabelField("", GUILayout.Width(20)); } } if (is_change_shader) { //変更が掛かったなら //Undo登録 Undo.RegisterUndo(material, "Shader Change"); SetShader(material, flag); is_update = true; } } } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.EndVertical(); } return(is_update); }