/// <summary> /// 生成角色,传入模型网格密度 /// </summary> /// <returns>The role.</returns> /// <param name="root">Root.</param> /// <param name="avatarName">Avatar name.</param> /// <param name="meshDensity">Mesh density.</param> public static GameObject GenerateRole(GameObject root, string avatarName, MESHDENSITY meshDensity) { if (root != null) { string avatarPath = string.Empty; if (meshDensity == MESHDENSITY.HIGHT) { avatarPath = GetResourcePath("smr") + root.name + "/" + avatarName; } else if (meshDensity == MESHDENSITY.MIDDLE) { avatarPath = GetResourcePath("smr") + root.name + "/" + avatarName + "_middle"; } else { avatarPath = GetResourcePath("smr") + root.name + "/" + avatarName + "_low"; } var avatar = Resources.Load(avatarPath) as SkinMeshRenderHolder; if (avatar == null) { Debug.Log("avatar is null!!"); } if (avatar != null) { Transform smrTr; root.transform.RecursiveFindObject("SkinnedMesh", out smrTr); List <CombineInstance> combineInstances = new List <CombineInstance>(); List <Material> materials = new List <Material>(); List <Transform> bones = new List <Transform>(); Transform[] transforms = root.GetComponentsInChildren <Transform>(); GameObject go = (GameObject)UnityEngine.Object.Instantiate(avatar.SMRGO); go.renderer.materials = avatar.Mats.ToArray(); var smr = (SkinnedMeshRenderer)go.renderer; //获取材质 materials.AddRange(smr.materials); //获取网格 for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++) { CombineInstance ci = new CombineInstance(); ci.mesh = smr.sharedMesh; ci.subMeshIndex = sub; combineInstances.Add(ci); } //获取骨骼 foreach (string bone in avatar.Bones) { foreach (Transform transform in transforms) { if (transform.name != bone) { continue; } bones.Add(transform); break; } } SkinnedMeshRenderer r = smrTr.GetComponent <SkinnedMeshRenderer>(); r.sharedMesh = new Mesh(); r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false); r.bones = bones.ToArray(); r.materials = materials.ToArray(); Vector3 localBoundsSize = r.localBounds.size; Bounds newBounds = new Bounds(r.localBounds.center, localBoundsSize); r.localBounds = newBounds; UnityEngine.Object.DestroyImmediate(go); } var playerBehaviour = root.GetComponent <PlayerBehaviour>(); if (playerBehaviour != null) { playerBehaviour.RefreshRenderCach(); } } return(root); }
/// <summary> /// 生成一个角色,传入模型网格密度 /// </summary> /// <returns>The role.</returns> /// <param name="roleName">Role name.</param> /// <param name="avatarName">Avatar name.</param> /// <param name="isHero">If set to <c>true</c> is hero.</param> /// <param name="meshDensity">Mesh density.</param> public static GameObject GenerateRole(string roleName, string avatarName, bool isHero, MESHDENSITY meshDensity) { var basePath = GetResourcePath("root") + roleName; var baseGo = Resources.Load(basePath) as GameObject; if (baseGo == null) { Debug.Log("baseGo is null!"); } GameObject root = null; if (baseGo != null) { root = UnityEngine.Object.Instantiate(baseGo) as GameObject; root.name = roleName; GenerateRole(root, avatarName, meshDensity); var cc = root.AddComponent <CharacterController>(); var height = cc.height; cc.height = 15; cc.radius = 3; cc.center = new Vector3(cc.center.x, 7.58f, cc.center.z); if (isHero) { var nav = root.AddComponent <NavMeshAgent>(); nav.walkableMask = 1; nav.speed = 17f; nav.acceleration = 350f; nav.angularSpeed = 360f; nav.enabled = false; } } return(root); }