Esempio n. 1
0
        private bool UpdateFashionInfo(SkinnedMeshRenderer smr, OutwardPart part, GameObject prefab, string assetPath)
        {
            var fashionOutInfo = prefab.GetComponent <FashionOutwardInfo>();

            if (fashionOutInfo == null)
            {
                return(false);
            }

            CleanupExtraInfo(part);

            string partName = PartNames[(int)part];
            var    info1    = GetFashionOutward(partName, fashionOutInfo.FashionOutwardArray);

            if (null == info1)
            {
                HobaDebuger.LogWarningFormat("fashion info is null");
                return(true);
            }
            SaveDefaultOutward(part, smr);
            SetSmrPropertyByFashionInfo(part, smr, info1);

            // body时装可能用到两套材质球
            if (part == OutwardPart.Body)
            {
                var bodyRoot  = smr.gameObject;
                var extraInfo = GetFashionOutward(ExtraBodyNames, fashionOutInfo.FashionOutwardArray);
                if (null != extraInfo)
                {
                    var extrabodyTrans = transform.Find(ExtraBodyNames);
                    if (extrabodyTrans == null)
                    {
                        var extrabody = GameObject.Instantiate(bodyRoot, transform);
                        extrabody.name = ExtraBodyNames;
                        extrabodyTrans = extrabody.transform;
                        _ExtraTransDic[(int)part].Add(extrabodyTrans);
                    }

                    var extraSmr = extrabodyTrans.GetComponent <SkinnedMeshRenderer>();

                    if (null != extraSmr)
                    {
                        extraSmr.rootBone = transform.Find(extraInfo.RootBonesPath);
                        SetSmrPropertyByFashionInfo(part, extraSmr, extraInfo);
                    }
                }
            }

            //加载特效信息
            var outwardSfx = prefab.GetComponent <OutwardSfx>();

            if (null != outwardSfx)
            {
                LoadOutwardGfx(part, outwardSfx, assetPath);
            }

            //UpdateDynamicBoneInfo(part, prefab);
            UpdateDynamicBoneInfo(part, fashionOutInfo.DynamicBoneInfoArray);
            return(true);
        }
Esempio n. 2
0
        private void SetSmrPropertyByFashionInfo(OutwardPart part, SkinnedMeshRenderer smr, FashionOutward fashionInfo)
        {
            if (smr == null)
            {
                return;
            }

            smr.sharedMesh     = fashionInfo.Mesh;
            smr.sharedMaterial = fashionInfo.Material;

            if (fashionInfo.BoneInfos == null)
            {
                HobaDebuger.LogWarning("Bones info is null");
                return;
            }

            var boneCount = fashionInfo.BoneInfos.Length;

            Transform[] bones = new Transform[boneCount];
            for (int i = 0; i < boneCount; i++)
            {
                var       info         = fashionInfo.BoneInfos[i];
                Transform newAddedRoot = null;
                bones[i] = FindBone(info.Bones, info.Position, info.Rotation, info.Scale, true, out newAddedRoot);
                if (newAddedRoot != null)
                {
                    _ExtraTransDic[(int)part].Add(newAddedRoot);
                }
            }

            smr.bones = bones;
        }
Esempio n. 3
0
        private void ResetOutward(OutwardPart part)
        {
            if (_OnFinishCallbackRefs[(int)part] != null)
            {
                _OnFinishCallbackRefs[(int)part].Release();
            }
            _OnFinishCallbackRefs[(int)part] = null;

            _CurAssetPathPaths[(int)part]    = string.Empty;
            _CurAssetLoadingState[(int)part] = false;

            if (_DynamicBonesCompList[(int)part] != null)
            {
                _DynamicBonesCompList[(int)part].Clear();
            }

            var smr         = GetSkinnedMeshRenderer(part);
            var defaultData = _DefaultOutwards[(int)part];

            if (smr != null && defaultData.SharedMesh != null && defaultData.Mat != null && defaultData.Bones != null)
            {
                smr.sharedMesh     = defaultData.SharedMesh;
                smr.sharedMaterial = defaultData.Mat;
                smr.bones          = defaultData.Bones;
            }
            _EmbroiderySetting.IsValid       = false;
            _CurAssetLoadingState[(int)part] = false;

            CleanupExtraInfo(part);
        }
Esempio n. 4
0
        private void OnChangeEnd(OutwardPart part)
        {
            int idx = (int)part;
            // 回调

            var func = _OnFinishCallbackRefs[idx];

            if (func != null)
            {
                func.Call();
                func.Release();
                _OnFinishCallbackRefs[idx] = null;
            }

            // 设置颜色信息
            if (part == OutwardPart.Hair && _HairColorInfo.IsValid)
            {
                ChangeHairColor(_HairColorInfo.Color);
            }

            if (part == OutwardPart.Body && _SkinColorInfo.IsValid)
            {
                ChangeSkinColor(_SkinColorInfo.Color);
            }
        }
Esempio n. 5
0
        private void LoadOutwardGfx(OutwardPart part, OutwardSfx outwardSfx, string assetPath)
        {
            if (null == outwardSfx.OutwardSfxInfos || 0 == outwardSfx.OutwardSfxInfos.Length)
            {
                return;
            }

            for (int i = 0; i < outwardSfx.OutwardSfxInfos.Length; i++)
            {
                var boneRoot   = transform;
                var curSfxInfo = outwardSfx.OutwardSfxInfos[i];
                var isRootGfx  = string.IsNullOrEmpty(curSfxInfo.HangPointPath);
                if (!isRootGfx)
                {
                    boneRoot = transform.Find(curSfxInfo.HangPointPath);
                }

                if (boneRoot == null)
                {
                    return;
                }

                Action <UnityEngine.Object> callback = (asset) =>
                {
                    // 资源加载过程中,数据发生变化
                    if (_CurAssetPathPaths[(int)part] != assetPath)
                    {
                        return;
                    }

                    var gameObj = GameObject.Instantiate(asset) as GameObject;
                    if (null == gameObj)
                    {
                        return;
                    }

                    var obj = gameObj;
                    obj.transform.SetParent(boneRoot);
                    obj.transform.localPosition = curSfxInfo.Position;
                    obj.transform.localRotation = Quaternion.Euler(curSfxInfo.Rotation);
                    obj.transform.localScale    = curSfxInfo.Scale;
                    Util.SetLayerRecursively(obj, boneRoot.gameObject.layer);

                    _ExtraTransDic[(int)part].Add(obj.transform);

                    if (isRootGfx)
                    {
                        // 处于模型底部的特效
                        _RootSfxList.Add(obj);
                        if (_IsHidRootSfx)
                        {
                            obj.SetActive(false);
                        }
                    }
                };
                CAssetBundleManager.AsyncLoadResource(outwardSfx.OutwardSfxInfos[i].SfxPath, callback, false);
            }
        }
Esempio n. 6
0
        private SkinnedMeshRenderer GetSkinnedMeshRenderer(OutwardPart part)
        {
            int idx = (int)part;

            if (_Renderers[idx] == null)
            {
                var msrs = transform.GetComponent <SMRInfos>();
                if (msrs != null)
                {
                    if (part == OutwardPart.Body)
                    {
                        _Renderers[idx] = msrs.BodyMeshRenderers;
                    }
                    else if (part == OutwardPart.Face)
                    {
                        _Renderers[idx] = msrs.FaceMeshRenderer;
                    }
                    else if (part == OutwardPart.Hair)
                    {
                        _Renderers[idx] = msrs.HairMeshRenderer;
                    }
                    else if (part == OutwardPart.Hand)
                    {
                        _Renderers[idx] = msrs.HandMeshRenderers;
                    }
                    else if (part == OutwardPart.Leg)
                    {
                        _Renderers[idx] = msrs.LegMeshRenderers;
                    }
                }
                else
                {
                    Transform trans = null;
                    if (part == OutwardPart.Body)
                    {
                        trans = transform.Find("body");
                    }
                    else if (part == OutwardPart.Face)
                    {
                        trans = transform.Find("face");
                    }
                    else if (part == OutwardPart.Hair)
                    {
                        trans = transform.Find("hair");
                    }

                    if (trans != null)
                    {
                        _Renderers[idx] = trans.GetComponent <SkinnedMeshRenderer>();
                    }
                }
            }

            return(_Renderers[idx]);
        }
Esempio n. 7
0
        private void CleanupExtraInfo(OutwardPart part)
        {
            _RootSfxList.Clear();

            List <Transform> transExtra;

            if (_ExtraTransDic.TryGetValue((int)part, out transExtra))
            {
                for (int i = 0; i < transExtra.Count; i++)
                {
                    if (null != transExtra[i])
                    {
                        GameObject.Destroy(transExtra[i].gameObject);
                    }
                }
                transExtra.Clear();
            }
        }
Esempio n. 8
0
        private void SaveDefaultOutward(OutwardPart part, SkinnedMeshRenderer smr)
        {
            if (smr == null)
            {
                return;
            }

            int idx = (int)part;

            if (_DefaultOutwards[idx].SharedMesh != null)
            {
                return;
            }

            _DefaultOutwards[idx].SharedMesh = smr.sharedMesh;
            _DefaultOutwards[idx].Mat        = smr.sharedMaterial;
            _DefaultOutwards[idx].Bones      = smr.bones;
        }
Esempio n. 9
0
        private bool UpdateOutwardInfo(SkinnedMeshRenderer smr, OutwardPart part, GameObject prefab, string assetPath)
        {
            var outwardInfo = prefab.GetComponent <OutwardInfo>();

            if (outwardInfo == null)
            {
                return(false);
            }

            CleanupExtraInfo(part);

            if (smr != null)
            {
                SaveDefaultOutward(part, smr);
                SetSmrPropertyByOutwardInfo(smr, outwardInfo);
            }

            //加载特效信息
            var outwardSfx = prefab.GetComponent <OutwardSfx>();

            if (null != outwardSfx)
            {
                LoadOutwardGfx(part, outwardSfx, assetPath);
            }

            // 保存当然的刺绣位置信息
            var embrRect = prefab.GetComponent <EmbroideryRect>();

            if (embrRect != null)
            {
                _EmbroiderySetting.IsValid = true;
                _EmbroiderySetting.XMax    = embrRect.XMax;
                _EmbroiderySetting.XMin    = embrRect.XMin;
                _EmbroiderySetting.YMax    = embrRect.YMax;
                _EmbroiderySetting.YMin    = embrRect.YMin;
            }
            else
            {
                _EmbroiderySetting.IsValid = false;
            }
            return(true);
        }
Esempio n. 10
0
 public void EnableOutwardPart(OutwardPart part, bool enable)
 {
     if (part == OutwardPart.Face)
     {
         var trans = transform.Find(PartNames[1]);
         if (trans != null && trans.gameObject.activeSelf != enable)
         {
             trans.gameObject.SetActive(enable);
         }
     }
     else if (part == OutwardPart.Hair)
     {
         var trans = transform.Find(PartNames[2]);
         if (trans != null && trans.gameObject.activeSelf != enable)
         {
             trans.gameObject.SetActive(enable);
         }
     }
     else
     {
         HobaDebuger.LogWarningFormat("EnableOutwarPart only work on part face or hair");
     }
 }
Esempio n. 11
0
        private void UpdateDynamicBoneInfo(OutwardPart part, DynamicBoneInfo[] prefabBones)
        {
            if (null == prefabBones || 0 == prefabBones.Length)
            {
                return;
            }

            for (int i = 0; i < prefabBones.Length; i++)
            {
                var    dynamicBoneInfo = prefabBones[i];
                string fullPath        = dynamicBoneInfo.HangPath;
                if (string.IsNullOrEmpty(fullPath))
                {
                    continue;
                }
                var attachedBone = transform.Find(fullPath);
                if (null == attachedBone)
                {
                    HobaDebuger.LogErrorFormat("DynamicBone数据中骨骼路径配置错误,{0}", fullPath);
                    continue;
                }
                string dbRootPath = dynamicBoneInfo.rootPath;
                if (string.IsNullOrEmpty(dbRootPath))
                {
                    continue;
                }
                var dbRootTrans = transform.Find(dbRootPath);
                if (null == dbRootTrans)
                {
                    continue;
                }

                #region Setup Params
                var targetBone = attachedBone.GetComponent <DynamicBone>();
                if (null == targetBone)
                {
                    targetBone = attachedBone.gameObject.AddComponent <DynamicBone>();
                }
                targetBone.m_Root              = dbRootTrans;
                targetBone.m_UpdateRate        = dynamicBoneInfo.m_UpdateRate;
                targetBone.m_UpdateMode        = dynamicBoneInfo.m_UpdateMode;
                targetBone.m_Damping           = dynamicBoneInfo.m_Damping;
                targetBone.m_DampingDistrib    = dynamicBoneInfo.m_DampingDistrib;
                targetBone.m_Elasticity        = dynamicBoneInfo.m_Elasticity;
                targetBone.m_ElasticityDistrib = dynamicBoneInfo.m_ElasticityDistrib;
                targetBone.m_Stiffness         = dynamicBoneInfo.m_Stiffness;
                targetBone.m_StiffnessDistrib  = dynamicBoneInfo.m_StiffnessDistrib;
                targetBone.m_Inert             = dynamicBoneInfo.m_Inert;
                targetBone.m_InertDistrib      = dynamicBoneInfo.m_InertDistrib;
                targetBone.m_Radius            = dynamicBoneInfo.m_Radius;
                targetBone.m_RadiusDistrib     = dynamicBoneInfo.m_RadiusDistrib;
                targetBone.m_EndLength         = dynamicBoneInfo.m_EndLength;
                targetBone.m_EndOffset         = dynamicBoneInfo.m_EndOffset;
                targetBone.m_Gravity           = dynamicBoneInfo.m_Gravity;
                targetBone.m_Force             = dynamicBoneInfo.m_Force;
                targetBone.m_Colliders         = dynamicBoneInfo.m_Colliders;
                targetBone.m_Exclusions        = dynamicBoneInfo.m_Exclusions;
                targetBone.m_FreezeAxis        = dynamicBoneInfo.m_FreezeAxis;
                targetBone.m_DistantDisable    = dynamicBoneInfo.m_DistantDisable;
                targetBone.m_ReferenceObject   = dynamicBoneInfo.m_ReferenceObject;
                //targetBone.m_DistanceToObject = sourceBone.m_DistanceToObject;
                targetBone.m_DistanceToObject = GFXConfig.Instance.GetDynamicBoneDistance();
                targetBone.Setup();
                #endregion

                _DynamicBonesCompList[(int)part].Add(targetBone);
            }
        }
Esempio n. 12
0
        public void ChangeOutward(OutwardPart part, string assetPath, LuaFunction cbref)
        {
            if (_OnFinishCallbackRefs[(int)part] != null)
            {
                _OnFinishCallbackRefs[(int)part].Release();
            }
            _OnFinishCallbackRefs[(int)part] = cbref;

            if (_CurAssetPathPaths[(int)part] == assetPath)
            {
                return;
            }

            _CurAssetPathPaths[(int)part]    = assetPath;
            _CurAssetLoadingState[(int)part] = true;

            if (_DynamicBonesCompList[(int)part] != null)
            {
                _DynamicBonesCompList[(int)part].Clear();
            }

            // assetPathId == 0表示换回初始设置
            if (string.IsNullOrEmpty(assetPath))
            {
                // 按照现行逻辑,此处应该是无用的,所有外观路径都会传,assetPath不可为空
                var smr         = GetSkinnedMeshRenderer(part);
                var defaultData = _DefaultOutwards[(int)part];
                if (smr != null && defaultData.SharedMesh != null && defaultData.Mat != null && defaultData.Bones != null)
                {
                    smr.sharedMesh     = defaultData.SharedMesh;
                    smr.sharedMaterial = defaultData.Mat;
                    smr.bones          = defaultData.Bones;
                }
                _EmbroiderySetting.IsValid       = false;
                _CurAssetLoadingState[(int)part] = false;

                CleanupExtraInfo(part);

                var man = transform.GetComponent <EntityEffectComponent>();
                if (null != man)
                {
                    man.OnMaterialChanged(smr);
                }

                OnChangeEnd(part);
            }
            else
            {
                Action <UnityEngine.Object> callback = (asset) =>
                {
                    // 资源加载过程中,数据发生变化
                    if (_CurAssetPathPaths[(int)part] != assetPath)
                    {
                        return;
                    }
                    _CurAssetLoadingState[(int)part] = false;

                    var prefab = asset as GameObject;
                    if (prefab == null)
                    {
                        HobaDebuger.LogWarningFormat("Outward Asset is null, path = {0}", assetPath);
                        return;
                    }

                    var smr = GetSkinnedMeshRenderer(part);
                    if (null == smr)
                    {
                        HobaDebuger.LogWarningFormat("fashion SkinnedMeshRenderer is null  = {0}", assetPath);
                        return;
                    }

                    // 外观源信息存在以下两种数据中:都包含mesh material bones信息
                    // 1 FashionOutwardInfo 时装,可能存在多余的骨骼
                    // 2 OutwardInfo 基础外观,换脸换发型
                    var isValid = UpdateFashionInfo(smr, part, prefab, assetPath) || UpdateOutwardInfo(smr, part, prefab, assetPath);
                    if (isValid)
                    {
                        var man = transform.GetComponent <EntityEffectComponent>();
                        if (null != man)
                        {
                            man.OnMaterialChanged(smr);
                        }

                        OnChangeEnd(part);
                    }
                };
                CAssetBundleManager.AsyncLoadResource(assetPath, callback, false);
            }
        }