Esempio n. 1
0
        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);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
 /// <summary>
 /// アバターパーツを取り外します
 /// 取り外したアバターパーツは削除されます
 /// Remove avatar parts.
 /// Removed avatar parts will be deleted.
 /// </summary>
 /// <param name="avatarObject"></param>
 public void DetachAvatarParts(MagicaAvatarParts parts)
 {
     Runtime.RemoveAvatarParts(parts);
 }