コード例 #1
0
    /// <summary>
    /// only put in one transform child partition example:Wing
    /// Anchor Name = name
    /// </summary>
    void UpdateChildrenPartition(PartitionObject partition, string name, string assetName, GameObject partitionObj)
    {
        Transform partitionAnchorDataTransform = transform.Find(name);

        if (partitionAnchorDataTransform == null)
        {
            EB.Debug.LogWarning("UpdateChildrenPartition:Partition Anchor Data lost  Need to Add!!", assetName);
            partition.UnregisterObject(partitionObj);
            return;
        }

        ChildPartitionAnchorDataComponent anchordata = partitionAnchorDataTransform.GetComponent <ChildPartitionAnchorDataComponent>();
        Transform partitionAnchor = anchordata.mAnchorBone;

        if (partitionAnchor == null)
        {
            EB.Debug.LogWarning("UpdateChildrenPartition:Partition Anchor Bone: anchordata.mAnchorBone lost!!", assetName);
            partition.UnregisterObject(partitionObj);
            return;
        }

        //Vector3 pos = partitionObj.transform.localPosition;
        //partitionObj.transform.parent = partitionAnchor;
        partitionObj.transform.SetParent(partitionAnchor, false);
        partitionObj.transform.localPosition = partitionAnchorDataTransform.localPosition;
        partitionObj.transform.localScale    = partitionAnchorDataTransform.localScale;
        partitionObj.CustomSetActive(!SyncLoad);
        partition.RegisterMeshObjects(partitionObj);
        SetLayer(partitionObj, gameObject.layer);
    }
コード例 #2
0
    /// <summary>
    /// need combine bone partition example:Armor
    /// 合并骨骼部件
    /// </summary>
    /// <param name="partition"></param>
    /// <param name="name"></param>
    /// <param name="assetName"></param>
    /// <param name="partitionObj">部件数据组件</param>
    /// <param name="isLinkObj"></param>
    void UpdateCombineBonePartition(PartitionObject partition, string name, string assetName, GameObject partitionObj, bool isLinkObj = false)
    {
        if (gameObject == null)
        {
            EB.Debug.LogError("This AvatarComponent has been destroyed!");
            return;
        }

        //获取数据组件身上挂载的部件预置体相应的蒙皮
        SkinnedMeshRenderer[] meshes = partitionObj.GetComponentsInChildren <SkinnedMeshRenderer>();
        if (meshes == null || meshes.Length == 0)
        {
            if (partitionObj.GetComponentInChildren <CharacterPartitionLink>() == null)
            {
                EB.Debug.LogWarning("UpdatePartition: SkinnedMeshRenderer not found in {0}", assetName);
            }

            partition.UnregisterObject(partitionObj);
            return;
        }

        for (int meshIndex = meshes.Length - 1; meshIndex >= 0; meshIndex--)
        {
            SkinnedMeshRenderer smr  = meshes[meshIndex];
            Transform           root = null;
            m_CombinedBones.Clear();
            Transform[] bones = smr.bones;

            //reskin this thing to the new skeleton
            if (!m_SkeletonBonesDic.ContainsKey(smr.rootBone.name))
            {
                EB.Debug.LogError("No rootBone for {0}", assetName);
                return;
            }
            root = m_SkeletonBonesDic[smr.rootBone.name];
            if (!m_SkeletonBonesDic.ContainsKey(RootBoneTransformName))            //for Optimized Game Object
            {
                smr.bones = new Transform[0];
            }
            else
            {
                int boneCount = bones.Length;
                for (int boneIndex = 0; boneIndex < boneCount; boneIndex++)
                {
                    Transform bone         = bones[boneIndex];
                    Transform combinedBone = null;
                    if (m_SkeletonBonesDic.TryGetValue(bone.name, out combinedBone) && combinedBone != null)
                    {
                        m_CombinedBones.Add(combinedBone);
                    }
                }
                smr.bones = m_CombinedBones.ToArray();
            }

            smr.rootBone = root;
            smr.transform.SetParent(gameObject.transform);
            smr.gameObject.CustomSetActive(!SyncLoad);
            partition.RegisterMeshObjects(smr.gameObject);

            smr.gameObject.layer = gameObject.layer;

            CheckRender();
        }
    }