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); }
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; }
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); }
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); } }
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); } }
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]); }
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(); } }
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; }
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); }
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"); } }
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); } }
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); } }