Beispiel #1
0
    /// <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);
    }
Beispiel #2
0
    /// <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);
    }