コード例 #1
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

            // 本体コライダーを削除する
            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);
        }
コード例 #2
0
        //=========================================================================================
        /// <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);
        }