Exemple #1
0
    /// <summary>
    /// 根据ModelPart结构体生成模型
    /// </summary>
    public void GenerateByModelPart(ModelPart parts)
    {
        _parts = parts;

        // 角色主体骨骼上的所有挂载点
        Transform[] jointList  = GetComponentsInChildren <Transform>();
        int[]       partIDList = _parts.GetValues();                           // 部件ID数组
        int         partCount  = partIDList.Length;                            // 部件数量

        SkinnedMeshRenderer[] meshList   = new SkinnedMeshRenderer[partCount]; // 部件Mesh
        GameObject[]          partGOList = new GameObject[partCount];          // 部件GameObject

        // 收集Mesh
        for (int i = 0; i < partCount; i++)
        {
            int partID = partIDList[i];
            if (partID == 0)
            {
                continue;
            }
            GameObject tempRes = Resources.Load <GameObject>(idToPath[partID]);
            partGOList[i] = Instantiate(tempRes);
            meshList[i]   = partGOList[i].GetComponentInChildren <SkinnedMeshRenderer>();

            // 处理装备上的粒子特效
            Dictionary <GameObject, string> particleMap = FindParticles(partGOList[i]);
            foreach (var particlePair in particleMap)
            {
                Transform particleRoot = particlePair.Key.transform;
                string    jointName    = particlePair.Value;
                foreach (var joint in jointList)
                {
                    if (joint.name == jointName)
                    {
                        particleRoot.SetParent(joint, false);
                    }
                }
            }
        }
        // 合并Mesh
        CombineSkinnedMgr.Instance.CombineObject(gameObject, meshList, true);

        // 删除老部件
        foreach (GameObject partGO in partGOList)
        {
            if (partGO != null)
            {
                DestroyImmediate(partGO);
            }
        }
    }