public void LoadSkin(string bodyResource = "", string faceResource = "", string hairResource = "", string legResource = "", string shoesResource = "", string sWeaponResource = "")
    {
        Dictionary <string, string> partMap = new Dictionary <string, string>
        {
            { "Body", bodyResource },
            { "Hair", hairResource },
            { "Face", faceResource },
            { "Leg", legResource },
            { "Shoes", shoesResource },
            { "Bra", "R71150030" },
        };

        foreach (var p in partMap)
        {
            if (p.Value == "")
            {
                continue;
            }

            var old = transform.Find(p.Key + "(Clone)");
            if (old != null)
            {
                DestroyImmediate(old.gameObject);
            }

            var role = Resources.Load <GameObject>(p.Value);
            if (role != null)
            {
                Transform model = role.transform.FindChild(p.Key);
                if (model != null)
                {
                    var obj = Instantiate(model.gameObject);
                    obj.transform.parent = transform;
                    obj.layer            = LayerMask.NameToLayer("Player");
                    foreach (var t in obj.transform.GetComponentsInChildren <Transform>())
                    {
                        t.gameObject.layer = LayerMask.NameToLayer("Player");
                    }

                    SkinnedMeshRenderer render = obj.GetComponent <SkinnedMeshRenderer>();
                    TGToolTransferBone.Create(render, transform, boneRoot, boneMap);

                    if (p.Key == "Body")
                    {
                        bodyModel = obj.transform;
                    }
                    else if (p.Key == "Bra")
                    {
                        braModel = obj.transform;
                        braModel.gameObject.SetActive(false);
                    }
                }
            }
        }

        LoadSpecialWeapon(sWeaponResource);
    }
    public void LoadWeapon(string weaponResource)
    {
        var weaponAnchor = TGToolTransferBone.CreateBone(transform, "Root/Bip/Hips/Spine/Chest/Neck/R Shoulder/R Upper Arm/R Lower Arm/R Hand/R Weapon Anchor", boneRoot, boneMap);

        for (int i = weaponAnchor.childCount - 1; i >= 0; i--)
        {
            Destroy(weaponAnchor.GetChild(i).gameObject);
        }

        GameObject weapon = Resources.Load <GameObject>(weaponResource);

        if (weapon != null)
        {
            if (weaponModel != null)
            {
                Destroy(weaponModel.gameObject);
            }
            if (bulletModel != null)
            {
                Destroy(bulletModel.gameObject);
            }

            customWeapon = Instantiate(weapon).transform;
            customWeapon.gameObject.name  = weapon.name;
            customWeapon.gameObject.layer = LayerMask.NameToLayer("Player");
            foreach (var t in customWeapon.transform.GetComponentsInChildren <Transform>())
            {
                t.gameObject.layer = LayerMask.NameToLayer("Player");
            }

            customWeapon.parent        = weaponAnchor;
            customWeapon.localPosition = Vector3.zero;
            customWeapon.localRotation = Quaternion.Euler(0, 0, 0);

            weaponModel = customWeapon;
            bulletModel = customWeapon.Find("Bullet");

            foreach (Transform t in customWeapon.GetComponentsInChildren <Transform>())
            {
                if (t.name == "FXAnchor")
                {
                    fxAnchor = t;
                }
            }

            var weaponAnimator = customWeapon.GetComponent <Animator>();
            if (weaponAnimator != null)
            {
                weaponAnimator.gameObject.AddComponent <NTGAnimatorController>().Init();
            }
        }
    }
    public void LoadSpecialWeapon(string weaponResource)
    {
        var weaponAnchor = TGToolTransferBone.CreateBone(transform, "Root/Bip/S Weapon Anchor", boneRoot, boneMap);

        for (int i = weaponAnchor.childCount - 1; i >= 0; i--)
        {
            Destroy(weaponAnchor.GetChild(i).gameObject);
        }

        GameObject weapon = Resources.Load <GameObject>(weaponResource);

        if (weapon != null)
        {
            var customWeapon = Instantiate(weapon).transform;
            customWeapon.gameObject.name  = weapon.name;
            customWeapon.gameObject.layer = LayerMask.NameToLayer("Player");
            foreach (var t in customWeapon.transform.GetComponentsInChildren <Transform>())
            {
                t.gameObject.layer = LayerMask.NameToLayer("Player");
            }

            customWeapon.parent        = weaponAnchor;
            customWeapon.localPosition = Vector3.zero;
            customWeapon.localRotation = Quaternion.Euler(0, 0, 0);

            foreach (Transform t in customWeapon.GetComponentsInChildren <Transform>())
            {
                if (t.name == "FXAnchor")
                {
                    sfxAnchor = t;
                }
            }

            var weaponAnimator = customWeapon.GetComponent <Animator>();
            if (weaponAnimator != null)
            {
                weaponAnimator.gameObject.AddComponent <NTGAnimatorController>().Init();
            }
        }
    }
    public void LoadAvatar(string BodyId = "", string FaceId = "", string HairId = "", string WeaponId = "")
    {
        Dictionary <string, string> partMap = new Dictionary <string, string>
        {
            { "Body", BodyId },
            { "Hair", HairId },
            { "Face", FaceId },
            { "Weapon", WeaponId }
        };

        Dictionary <string, string> stateMap = new Dictionary <string, string>
        {
            { "Idle", "A0" },
            { "Play", "B0" },
            { "Walk", "C0" },
            { "Standby", "D0" },
            { "Hurt", "F0" },
            { "Victory", "G0" },
            { "Dead", "H0" },
            { "Attack", "I0" },
            { "Forward", "C0" },
            { "Backward", "J0" },
            { "Knock", "K0" },
            { "Stun", "L0" },
            { "Roll", "M0" },
        };

        if (aoc == null)
        {
            aoc      = new AnimatorOverrideController();
            aoc.name = "TGRoleOverrideAC";
            aoc.runtimeAnimatorController = roleAC;
        }

        var smr = GetComponent <SkinnedMeshRenderer>();

        if (smr != null)
        {
            DestroyImmediate(smr);
        }

        List <SkinnedMeshRenderer> smRenderers = new List <SkinnedMeshRenderer>();

        foreach (var p in partMap)
        {
            if (p.Value == "")
            {
                continue;
            }
            var old = transform.Find(p.Key + "(Clone)");
            if (old != null)
            {
                DestroyImmediate(old.gameObject);
            }

            var role = Resources.Load <GameObject>(p.Value);
            if (role != null)
            {
                Transform model = role.transform.FindChild(p.Key);
                if (model != null)
                {
                    var obj = Instantiate(model.gameObject) as GameObject;
                    obj.transform.parent = transform;
                    obj.layer            = LayerMask.NameToLayer("Player");
                    foreach (var t in obj.transform.GetComponentsInChildren <Transform>())
                    {
                        t.gameObject.layer = LayerMask.NameToLayer("Player");
                    }

                    SkinnedMeshRenderer render = obj.GetComponent <SkinnedMeshRenderer>();
                    //TGToolTransferBone.Transfer(ref render, transform);
                    TGToolTransferBone.Create(render, transform, boneRoot, boneMap);

                    smRenderers.Add(obj.GetComponent <SkinnedMeshRenderer>());
                }
            }

            /*
             * foreach (var s in stateMap)
             * {
             *  var load = Resources.Load<AnimationClip>(p.Value.Substring(0, 9) + "R" + s.Value);
             *  if (load == null)
             *      continue;
             *
             *  if (aoc[p.Key + "-" + s.Key] != null)
             *  {
             *      Destroy(aoc[p.Key + "-" + s.Key]);
             *  }
             *  aoc[p.Key + "-" + s.Key] = Instantiate(load) as AnimationClip;
             * }
             */
        }

        //CombineSkinnedMeshRenderer(smRenderers);
        //TGToolTransferBone.Create(GetComponent<SkinnedMeshRenderer>(), transform, boneRoot, boneMap);

        if (partMap["Weapon"] != "")
        {
            foreach (var s in stateMap)
            {
                var load = Resources.Load <AnimationClip>(partMap["Weapon"].Substring(0, 9) + "R" + s.Value);
                if (aoc["Leg" + "-" + s.Key] != null && aoc["Leg" + "-" + s.Key].name.Contains("(Clone)"))
                {
                    Destroy(aoc["Leg" + "-" + s.Key]);
                }
                aoc["Leg" + "-" + s.Key] = Instantiate(load) as AnimationClip;

                if (aoc["Weapon" + "-" + s.Key] != null && aoc["Weapon" + "-" + s.Key].name.Contains("(Clone)"))
                {
                    Destroy(aoc["Weapon" + "-" + s.Key]);
                }
                aoc["Weapon" + "-" + s.Key] = Instantiate(load) as AnimationClip;
            }

            //var weaponAnchor = transform.Find("Root/Hips/Spine/Chest/Neck/R Shoulder/R Upper Arm/R Lower Arm/R Hand/R Weapon Anchor");
            var weaponAnchor = TGToolTransferBone.CreateBone(transform, "Root/Hips/Spine/Chest/Neck/R Shoulder/R Upper Arm/R Lower Arm/R Hand/R Weapon Anchor", boneRoot, boneMap);
            for (int i = weaponAnchor.childCount - 1; i >= 0; i--)
            {
                Destroy(weaponAnchor.GetChild(i).gameObject);
            }

            GameObject weapon = Resources.Load <GameObject>(partMap["Weapon"] + "C");
            if (weapon != null)
            {
                if (weaponModel != null)
                {
                    Destroy(weaponModel.gameObject);
                }
                if (bulletModel != null)
                {
                    Destroy(bulletModel.gameObject);
                }

                customWeapon = ((GameObject)Instantiate(weapon)).transform;
                customWeapon.gameObject.layer = LayerMask.NameToLayer("Player");
                foreach (var t in customWeapon.transform.GetComponentsInChildren <Transform>())
                {
                    t.gameObject.layer = LayerMask.NameToLayer("Player");
                }
                customWeapon.parent        = weaponAnchor;
                customWeapon.localPosition = Vector3.zero;
                customWeapon.localRotation = Quaternion.Euler(0, 0, 0);

                weaponModel = customWeapon;
                bulletModel = customWeapon.Find("Bullet");
                fxAnchor    = customWeapon.Find("FXAnchor");

                weaponAnimator = customWeapon.GetComponent <Animator>();
                weaponAnimator.applyRootMotion = false;
                weaponAnimator.cullingMode     = AnimatorCullingMode.CullUpdateTransforms;

                AnimatorOverrideController weaponAoc = new AnimatorOverrideController();
                weaponAoc.name = "TGWeaponOverrideAC";
                weaponAoc.runtimeAnimatorController = commonAC;

                foreach (var s in stateMap)
                {
                    var clip = Resources.Load <AnimationClip>(partMap["Weapon"].Substring(0, 15) + "C" + s.Value);
                    if (clip != null)
                    {
                        if (weaponAoc["Weapon-" + s.Key] != null)
                        {
                            Destroy(weaponAoc["Weapon-" + s.Key]);
                        }
                        weaponAoc["Weapon-" + s.Key] = Instantiate(clip) as AnimationClip;
                    }
                }

                weaponAnimator.runtimeAnimatorController = weaponAoc;
            }
        }


        if (animator != null)
        {
            DestroyImmediate(animator);
        }
        animator                           = gameObject.AddComponent <Animator>();
        animator.avatar                    = roleAvatar;
        animator.applyRootMotion           = false;
        animator.cullingMode               = AnimatorCullingMode.CullUpdateTransforms;
        animator.runtimeAnimatorController = aoc;

        /*
         * GetComponent<Animator>().runtimeAnimatorController = null;
         * GetComponent<Animator>().runtimeAnimatorController = aoc;
         */
    }