コード例 #1
0
ファイル: Character.cs プロジェクト: fanglie/Laya3DAvatarDemo
 public void ChangeEquipUnCombine(int type, AvatarRes avatarres)
 {
     if (type == (int)EPart.EP_Eyes)
     {
         ChangeEquipUnCombine(ref mEyes, avatarres.mEyesList[avatarres.mEyesIdx]);
     }
     else if (type == (int)EPart.EP_Face)
     {
         ChangeEquipUnCombine(ref mFace, avatarres.mFaceList[avatarres.mFaceIdx]);
     }
     else if (type == (int)EPart.EP_Hair)
     {
         ChangeEquipUnCombine(ref mHair, avatarres.mHairList[avatarres.mHairIdx]);
     }
     else if (type == (int)EPart.EP_Pants)
     {
         ChangeEquipUnCombine(ref mPants, avatarres.mPantsList[avatarres.mPantsIdx]);
     }
     else if (type == (int)EPart.EP_Shoes)
     {
         ChangeEquipUnCombine(ref mShoes, avatarres.mShoesList[avatarres.mShoesIdx]);
     }
     else if (type == (int)EPart.EP_Top)
     {
         ChangeEquipUnCombine(ref mTop, avatarres.mTopList[avatarres.mTopIdx]);
     }
 }
コード例 #2
0
    private void CreateAllAvatarRes()
    {
        DirectoryInfo dir = new DirectoryInfo("Assets/Resources/");

        foreach (var subdir in dir.GetDirectories())
        {
            string[] splits  = subdir.Name.Split('/');
            string   dirname = splits[splits.Length - 1];

            GameObject [] golist = Resources.LoadAll <GameObject>(dirname);

            AvatarRes avatarres = new AvatarRes();
            mAvatarResList.Add(avatarres);

            avatarres.mName      = dirname;
            avatarres.mSkeleton  = FindRes(golist, SkeletonName)[0];
            avatarres.mEyesList  = FindRes(golist, EyesName);
            avatarres.mFaceList  = FindRes(golist, FaceName);
            avatarres.mHairList  = FindRes(golist, HairName);
            avatarres.mPantsList = FindRes(golist, PantsName);
            avatarres.mShoesList = FindRes(golist, ShoesName);
            avatarres.mTopList   = FindRes(golist, TopName);

            string animpath            = "Assets/Anims/" + dirname + "/";
            List <AnimationClip> clips = FunctionUtil.CollectAll <AnimationClip>(animpath);
            avatarres.mAnimList.AddRange(clips);
        }
    }
コード例 #3
0
ファイル: Character.cs プロジェクト: fanglie/Laya3DAvatarDemo
 private void ChangeEquipCombine(int type, AvatarRes avatarres, ref List <CombineInstance> combineInstances,
                                 ref List <Material> materials, ref List <Transform> bones)
 {
     if (type == (int)EPart.EP_Eyes)
     {
         ChangeEquipCombine(avatarres.mEyesList[avatarres.mEyesIdx], ref combineInstances, ref materials, ref bones);
     }
     else if (type == (int)EPart.EP_Face)
     {
         ChangeEquipCombine(avatarres.mFaceList[avatarres.mFaceIdx], ref combineInstances, ref materials, ref bones);
     }
     else if (type == (int)EPart.EP_Hair)
     {
         ChangeEquipCombine(avatarres.mHairList[avatarres.mHairIdx], ref combineInstances, ref materials, ref bones);
     }
     else if (type == (int)EPart.EP_Pants)
     {
         ChangeEquipCombine(avatarres.mPantsList[avatarres.mPantsIdx], ref combineInstances, ref materials, ref bones);
     }
     else if (type == (int)EPart.EP_Shoes)
     {
         ChangeEquipCombine(avatarres.mShoesList[avatarres.mShoesIdx], ref combineInstances, ref materials, ref bones);
     }
     else if (type == (int)EPart.EP_Top)
     {
         ChangeEquipCombine(avatarres.mTopList[avatarres.mTopIdx], ref combineInstances, ref materials, ref bones);
     }
 }
コード例 #4
0
    private void ReduceAvatarRes()
    {
        mAvatarResIdx--;
        if (mAvatarResIdx < 0)
        {
            mAvatarResIdx = mAvatarResList.Count - 1;
        }

        mAvatarRes = mAvatarResList[mAvatarResIdx];
    }
コード例 #5
0
    private void AddAvatarRes()
    {
        mAvatarResIdx++;
        if (mAvatarResIdx >= mAvatarResList.Count)
        {
            mAvatarResIdx = 0;
        }

        mAvatarRes = mAvatarResList[mAvatarResIdx];
    }
コード例 #6
0
    private void InitCharacter()
    {
        GameObject go = new GameObject();

        mCharacter = go.AddComponent <Character>();
        mCharacter.SetName("Character");

        mAvatarRes = mAvatarResList[mAvatarResIdx];
        mCharacter.Generate(mAvatarRes, mCombine);
    }
コード例 #7
0
ファイル: Character.cs プロジェクト: fanglie/Laya3DAvatarDemo
 public void Generate(AvatarRes avatarres, bool combine = false)
 {
     if (!combine)
     {
         GenerateUnCombine(avatarres);
     }
     else
     {
         GenerateCombine(avatarres);
     }
 }
コード例 #8
0
ファイル: Character.cs プロジェクト: fanglie/Laya3DAvatarDemo
    public void ChangeAnim(AvatarRes avatarres)
    {
        if (mAnim == null)
        {
            return;
        }

        AnimationClip animclip = avatarres.mAnimList[avatarres.mAnimIdx];

        mAnim.wrapMode = WrapMode.Loop;
        mAnim.Play(animclip.name);
    }
コード例 #9
0
ファイル: Character.cs プロジェクト: fanglie/Laya3DAvatarDemo
    private void GenerateCombine(AvatarRes avatarres)
    {
        if (mSkeleton != null)
        {
            bool iscontain = mSkeleton.name.Equals(avatarres.mSkeleton.name);
            if (!iscontain)
            {
                GameObject.DestroyImmediate(mSkeleton);
            }
        }

        if (mSkeleton == null)
        {
            mSkeleton = GameObject.Instantiate(avatarres.mSkeleton);
            mSkeleton.Reset(gameObject);
            mSkeleton.name = avatarres.mSkeleton.name;
        }

        mAnim = mSkeleton.GetComponent <Animation>();

        List <CombineInstance> combineInstances = new List <CombineInstance>();
        List <Material>        materials        = new List <Material>();
        List <Transform>       bones            = new List <Transform>();

        ChangeEquipCombine((int)EPart.EP_Eyes, avatarres, ref combineInstances, ref materials, ref bones);
        ChangeEquipCombine((int)EPart.EP_Face, avatarres, ref combineInstances, ref materials, ref bones);
        ChangeEquipCombine((int)EPart.EP_Hair, avatarres, ref combineInstances, ref materials, ref bones);
        ChangeEquipCombine((int)EPart.EP_Pants, avatarres, ref combineInstances, ref materials, ref bones);
        ChangeEquipCombine((int)EPart.EP_Shoes, avatarres, ref combineInstances, ref materials, ref bones);
        ChangeEquipCombine((int)EPart.EP_Top, avatarres, ref combineInstances, ref materials, ref bones);

        // Obtain and configure the SkinnedMeshRenderer attached to
        // the character base.
        SkinnedMeshRenderer r = mSkeleton.GetComponent <SkinnedMeshRenderer>();

        if (r != null)
        {
            GameObject.DestroyImmediate(r);
        }

        r            = mSkeleton.AddComponent <SkinnedMeshRenderer>();
        r.sharedMesh = new Mesh();
        r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);
        r.bones     = bones.ToArray();
        r.materials = materials.ToArray();

        ChangeAnim(avatarres);
    }
コード例 #10
0
ファイル: Character.cs プロジェクト: fanglie/Laya3DAvatarDemo
    private void GenerateUnCombine(AvatarRes avatarres)
    {
        DestroyAll();

        mSkeleton = GameObject.Instantiate(avatarres.mSkeleton);
        mSkeleton.Reset(gameObject);
        mSkeleton.name = avatarres.mSkeleton.name;

        mAnim = mSkeleton.GetComponent <Animation>();

        ChangeEquipUnCombine((int)EPart.EP_Eyes, avatarres);
        ChangeEquipUnCombine((int)EPart.EP_Face, avatarres);
        ChangeEquipUnCombine((int)EPart.EP_Hair, avatarres);
        ChangeEquipUnCombine((int)EPart.EP_Pants, avatarres);
        ChangeEquipUnCombine((int)EPart.EP_Shoes, avatarres);
        ChangeEquipUnCombine((int)EPart.EP_Top, avatarres);

        ChangeAnim(avatarres);
    }
コード例 #11
0
        private void CreateAllAvatarRes()
        {
            var config = Asset;

            avatars.Clear();
            if (config.avatars == null)
            {
                SelectAvatar(0);
                return;
            }
            foreach (var avatar in config.avatars)
            {
                AvatarRes avatarres = new AvatarRes();

                avatarres.name     = "";
                avatarres.skeleton = avatar.skeleton;
                avatarres.config   = avatar;


                Animator animator = null;
                if (avatar.skeleton)
                {
                    avatarres.name = avatar.skeleton.name;
                    animator       = avatar.skeleton.GetComponent <Animator>();
                }
                AnimatorController ac = null;
                if (avatar.animator)
                {
                    ac = avatar.animator as AnimatorController;
                }
                if (!ac && animator)
                {
                    ac = animator.runtimeAnimatorController as AnimatorController;
                }
                if (ac)
                {
                    foreach (var layer in ac.layers)
                    {
                        foreach (var state in layer.stateMachine.states)
                        {
                            avatarres.animationNames.Add(state.state.name);
                        }
                    }
                }
                else
                {
                    var clips = AnimationUtility.GetAnimationClips(avatar.skeleton);
                    if (clips != null)
                    {
                        foreach (var clip in clips)
                        {
                            avatarres.animations.Add(clip);
                            avatarres.animationNames.Add(clip.name);
                        }
                    }
                }


                if (!string.IsNullOrEmpty(avatar.defaultAnimation))
                {
                    for (int i = 0; i < avatarres.animationNames.Count; i++)
                    {
                        if (avatarres.animationNames[i] == avatar.defaultAnimation)
                        {
                            avatarres.selectedAnimationIndex = i;
                            break;
                        }
                    }
                }

                string dir;
                List <AvatarPartInfo> parts = new List <AvatarPartInfo>();
                foreach (var partConfig in avatar.parts)
                {
                    var part = new AvatarPartInfo();
                    part.partName = partConfig.partName;
                    if (!string.IsNullOrEmpty(partConfig.namePattern))
                    {
                        Regex fileRegex = new Regex(partConfig.namePattern);
                        dir = partConfig.directory;
                        if (string.IsNullOrEmpty(dir))
                        {
                            dir = avatar.partDirectory;
                        }

                        if (!string.IsNullOrEmpty(dir))
                        {
                            List <GameObject> list     = new List <GameObject>();
                            List <string>     nameList = new List <string>();
                            foreach (string guid in AssetDatabase.FindAssets("t:Prefab t:Model", new string[] { dir }))
                            {
                                string assetPath = AssetDatabase.GUIDToAssetPath(guid);
                                var    m         = fileRegex.Match(assetPath);
                                if (!m.Success || m.Groups["result"] == null || !m.Groups["result"].Success)
                                {
                                    continue;
                                }
                                GameObject go = AssetDatabase.LoadAssetAtPath <GameObject>(assetPath);

                                nameList.Add(m.Groups["result"].Value);
                                list.Add(go);
                            }
                            part.parts     = list.ToArray();
                            part.partNames = nameList.ToArray();
                        }
                    }
                    if (part.parts == null)
                    {
                        part.parts = new GameObject[0];
                    }
                    parts.Add(part);
                }
                avatarres.awatarParts    = parts.ToArray();
                avatarres.selectedIndexs = new int[avatarres.awatarParts.Length];
                avatars.Add(avatarres);
            }

            SelectAvatar(0);
        }
コード例 #12
0
        private void SelectAvatar(int index)
        {
            DestroyInstances();
            if (Asset.avatars.Length == 0)
            {
                return;
            }

            index = (index + Asset.avatars.Length) % Asset.avatars.Length;
            selectedAvatarIndex = index;

            var asset = Asset;

            if (selectedAvatarIndex >= asset.avatars.Length)
            {
                selectedAvatarIndex = 0;
            }
            if (selectedAvatarIndex < asset.avatars.Length)
            {
                avatarRes = avatars[selectedAvatarIndex];
            }

            if (avatarRes != null)
            {
                if (avatarRes.skeleton)
                {
                    skeleton = Instantiate(avatarRes.skeleton);
                    //skeleton.transform.forward = -Vector3.forward;
                    skeleton.transform.eulerAngles = new Vector3(0, 90, 0);
                    skeleton.transform.parent      = root;
                    bool    first = true;
                    Vector3 min = new Vector3(), max = new Vector3();
                    foreach (var smr in skeleton.GetComponentsInChildren <SkinnedMeshRenderer>())
                    {
                        if (first)
                        {
                            min = smr.bounds.min;
                            max = smr.bounds.max;
                        }
                        else
                        {
                            min = Vector3.Min(min, smr.bounds.min);
                            max = Vector3.Max(max, smr.bounds.max);
                        }
                    }
                    size      = (max - min).magnitude;
                    distance  = size * 1.3f;
                    height    = (max - min).y;
                    skinned   = skeleton.AddComponent <SkinnedCombine>();
                    animation = skeleton.GetComponent <Animation>();
                    animator  = skeleton.GetComponent <Animator>();

                    if (animator)
                    {
                        if (avatarRes.config.animator)
                        {
                            animator.runtimeAnimatorController = avatarRes.config.animator;
                        }
                    }

                    var smrs = skeleton.GetComponentsInChildren <SkinnedMeshRenderer>();

                    if (avatarRes.awatarParts.Length > 0)
                    {
                        foreach (var smr in smrs)
                        {
                            //if (smr.gameObject!=skeleton&& avatarRes.awatarParts.Where(o => string.Equals(o.partName, smr.name, StringComparison.InvariantCultureIgnoreCase)).Count() == 0)
                            //    continue;
                            smr.materials = new Material[0];
                        }
                        skinned.Clear();
                        for (int i = 0; i < avatarRes.awatarParts.Length; i++)
                        {
                            var part      = avatarRes.awatarParts[i];
                            int partIndex = avatarRes.selectedIndexs[i];
                            if (!(0 <= partIndex && partIndex < avatarRes.selectedIndexs.Length))
                            {
                                continue;
                            }
                            if (partIndex >= part.parts.Length)
                            {
                                continue;
                            }
                            skinned.AddPart(part.partName, part.parts[partIndex], combine);
                        }

                        skinned.GennerateSkin();
                    }
                }
            }
            SelectAnimation(avatarRes.selectedAnimationIndex);
        }