public override void OnInspectorGUI() { MagicaAvatarParts scr = target as MagicaAvatarParts; // データ状態 //EditorInspectorUtility.DispVersionStatus(scr); EditorInspectorUtility.DispDataStatus(scr); //DrawDefaultInspector(); }
//========================================================================================= /// <summary> /// パーツ一覧表示 /// </summary> private bool DrawPartsList() { MagicaAvatar scr = target as MagicaAvatar; bool change = false; EditorGUILayout.LabelField("Attach Parts", EditorStyles.boldLabel); // ドラッグ&ドロップ change = DrawPartsDragAndDropArea(); // パーツ一覧 MagicaAvatarParts removeParts = null; for (int i = 0; i < scr.Runtime.AvatarPartsCount; i++) { var parts = scr.Runtime.GetAvatarParts(i); if (parts) { EditorGUILayout.BeginHorizontal(GUI.skin.box); GUILayout.Space(30); EditorGUILayout.HelpBox(parts.name, MessageType.None); GUI.backgroundColor = Color.red; if (GUILayout.Button("Remove")) { removeParts = parts; } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); } } EditorGUILayout.Space(); if (removeParts) { // パーツ削除 scr.DetachAvatarParts(removeParts); change = true; } return(change); }
/// <summary> /// アバターパーツの削除 /// </summary> /// <param name="parts"></param> public void RemoveAvatarParts(MagicaAvatarParts parts) { //Debug.Log("RemoveAvatarParts:" + parts.name); if (parts == null) { return; } if (avatarPartsList.Contains(parts) == false) { return; } // 接続を切る parts.ParentAvatar = null; avatarPartsList.Remove(parts); // 参照数を1つ減らし削除するボーンをリスト化する var removeBoneList = new List <Transform>(); var croot = parts.transform; foreach (var bone in parts.GetBoneDict().Values) { if (bone == null) { continue; } if (bone != croot) { var t = boneDict[bone.name]; boneReferenceDict[t]--; if (boneReferenceDict[t] == 0) { boneReferenceDict.Remove(t); boneDict.Remove(t.name); removeBoneList.Add(t); } //Debug.Log("reference[" + t.name + "]:" + boneReferenceDict[t]); } } // ボーン削除 foreach (var bone in removeBoneList) { if (bone) { GameObject.Destroy(bone.gameObject); } } #if false foreach (var bone in boneDict.Values) { if (bone) { Debug.Log("残 bone:" + bone.name); } } foreach (var kv in boneReferenceDict) { if (kv.Key) { Debug.Log("残 reference[" + kv.Key.name + "]:" + kv.Value); } } #endif // 本体コライダーを削除する if (colliderList.Count > 0) { // Magicaコンポーネントリスト var magicaComponentList = parts.GetMagicaComponentList(); foreach (var comp in magicaComponentList) { var cloth = comp as BaseCloth; if (cloth) { foreach (var col in colliderList) { cloth.RemoveCollider(col); } } } } // パーツ削除 GameObject.Destroy(parts.gameObject); // イベント owner.OnDetachParts.Invoke(owner); }
//========================================================================================= /// <summary> /// アバターパーツの追加 /// </summary> /// <param name="parts"></param> public int AddAvatarParts(MagicaAvatarParts parts) { if (parts == null) { return(0); } //Debug.Log("AddAvatarParts:" + parts.name); // すでに着せ替え済みならば何もしない if (parts.HasParent) { return(parts.PartsId); } // アクティブ化する if (parts.gameObject.activeSelf == false) { parts.gameObject.SetActive(true); } // 初期化(すでに初期化済みならば何もしない) owner.Init(); // スキンメッシュレンダラーリスト var skinRendererList = parts.GetComponentsInChildren <SkinnedMeshRenderer>(); //Debug.Log("skinRendererList:" + skinRendererList.Length); // Magicaコンポーネントリスト //var magicaComponentList = parts.GetComponentsInChildren<CoreComponent>(); var magicaComponentList = parts.GetMagicaComponentList(); //Debug.Log("magicaComponentList:" + magicaComponentList.Length); // パーツを子として追加する var root = owner.transform; var croot = parts.transform; parts.transform.SetParent(root, false); parts.transform.localPosition = Vector3.zero; parts.transform.localRotation = Quaternion.identity; parts.ParentAvatar = owner; avatarPartsList.Add(parts); // 必要なボーンを移植する var partsBoneDict = parts.GetBoneDict(); foreach (var bone in partsBoneDict.Values) { if (bone != croot) { AddBone(root, croot, bone); } } // すべてのボーン参照数を加算する foreach (var bone in partsBoneDict.Values) { if (bone != croot) { var t = boneDict[bone.name]; boneReferenceDict[t]++; //Debug.Log("reference[" + t.name + "]:" + boneReferenceDict[t]); } } // ボーンの交換情報作成 var boneReplaceDict = new Dictionary <Transform, Transform>(); foreach (var bone in partsBoneDict.Values) { if (bone != croot) { boneReplaceDict.Add(bone, boneDict[bone.name]); } else { boneReplaceDict.Add(bone, root); } } #if false foreach (var kv in avatar.Runtime.boneReplaceDict) { if (kv.Key != kv.Value) { Debug.Log("置換[" + kv.Key.name + "]->[" + kv.Value.name + "]"); } } #endif // スキンメッシュレンダラー置換 foreach (var skinRenderer in skinRendererList) { ReplaceSkinMeshRenderer(skinRenderer, boneReplaceDict); } // Magicaコンポーネント置換 foreach (var comp in magicaComponentList) { ReplaceMagicaComponent(comp, boneReplaceDict); } // Magicaコンポーネントに本体のコライダーを追加する if (colliderList.Count > 0) { foreach (var comp in magicaComponentList) { var cloth = comp as BaseCloth; if (cloth && cloth.TeamData.MergeAvatarCollider) { // 初期化 cloth.Init(); foreach (var col in colliderList) { cloth.AddCollider(col); } } } } // パーツの機能は停止させる parts.gameObject.SetActive(false); // イベント owner.OnAttachParts.Invoke(owner, parts); return(parts.PartsId); }
/// <summary> /// アバターパーツの削除 /// </summary> /// <param name="parts"></param> public void RemoveAvatarParts(MagicaAvatarParts parts) { //Debug.Log("RemoveAvatarParts:" + parts.name); if (parts == null) { return; } if (avatarPartsList.Contains(parts) == false) { return; } // 接続を切る parts.ParentAvatar = null; avatarPartsList.Remove(parts); // 参照数を1つ減らし削除するボーンをリスト化する var removeBoneList = new List <Transform>(); var croot = parts.transform; foreach (var bone in parts.GetBoneDict().Values) { if (bone == null) { continue; } if (bone != croot) { var t = boneDict[bone.name]; boneReferenceDict[t]--; if (boneReferenceDict[t] == 0) { boneReferenceDict.Remove(t); boneDict.Remove(t.name); removeBoneList.Add(t); } //Debug.Log("reference[" + t.name + "]:" + boneReferenceDict[t]); } } // ボーン削除 foreach (var bone in removeBoneList) { if (bone) { GameObject.Destroy(bone.gameObject); } } #if false foreach (var bone in boneDict.Values) { if (bone) { Debug.Log("残 bone:" + bone.name); } } foreach (var kv in boneReferenceDict) { if (kv.Key) { Debug.Log("残 reference[" + kv.Key.name + "]:" + kv.Value); } } #endif // パーツ削除 GameObject.Destroy(parts.gameObject); }
/// <summary> /// アバターパーツを取り外します /// 取り外したアバターパーツは削除されます /// Remove avatar parts. /// Removed avatar parts will be deleted. /// </summary> /// <param name="avatarObject"></param> public void DetachAvatarParts(MagicaAvatarParts parts) { Runtime.RemoveAvatarParts(parts); }