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]); } }
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); } }
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); } }
private void ReduceAvatarRes() { mAvatarResIdx--; if (mAvatarResIdx < 0) { mAvatarResIdx = mAvatarResList.Count - 1; } mAvatarRes = mAvatarResList[mAvatarResIdx]; }
private void AddAvatarRes() { mAvatarResIdx++; if (mAvatarResIdx >= mAvatarResList.Count) { mAvatarResIdx = 0; } mAvatarRes = mAvatarResList[mAvatarResIdx]; }
private void InitCharacter() { GameObject go = new GameObject(); mCharacter = go.AddComponent <Character>(); mCharacter.SetName("Character"); mAvatarRes = mAvatarResList[mAvatarResIdx]; mCharacter.Generate(mAvatarRes, mCombine); }
public void Generate(AvatarRes avatarres, bool combine = false) { if (!combine) { GenerateUnCombine(avatarres); } else { GenerateCombine(avatarres); } }
public void ChangeAnim(AvatarRes avatarres) { if (mAnim == null) { return; } AnimationClip animclip = avatarres.mAnimList[avatarres.mAnimIdx]; mAnim.wrapMode = WrapMode.Loop; mAnim.Play(animclip.name); }
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); }
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); }
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); }
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); }