/// <summary> /// 设置套装特效 /// </summary> /// <param name="effect_id_list"></param> /// <returns></returns> private static IEnumerator SetSuitEffect(GameObject model, AvatarProperty ap, bool isLocalPlayer = true) { List <uint> effect_id_list = ap.SuitEffectIds; if (effect_id_list == null || effect_id_list.Count == 0 || model == null) { yield break; } // 屏蔽特效显示 /*if (!EnableEffect) * { * if (mOwner == null || !mOwner.UID.Equals(Game.GetInstance().LocalPlayerID)) * yield return null; * }*/ //var avartaPartData = DBManager.GetInstance().GetDB<DBAvatarPart>().mData; foreach (var id in effect_id_list) { var effect_id = id; if (id == 1 || id == 2) { effect_id = id == 1 ? ap.BodyId : ap.WeaponId; } var effect_info = DBManager.Instance.GetDB <DBSuitEffect>().GetEffectInfo(effect_id); if (effect_info == null) { GameDebug.Log("Cannot find suit effect info, id: " + effect_id); continue; } // 检查特效id是否与当前的装备或武器匹配 if (effect_info.effect_type == 1) { if (effect_id != ap.BodyId) { continue; } } else if (effect_info.effect_type == 2) { if (effect_id != ap.WeaponId) { continue; } } bool is_local_player_model = isLocalPlayer; foreach (var bind_info in effect_info.bind_infos) { // 本地玩家才使用高配的特效 string res_path = ""; if (is_local_player_model) // 本地玩家 { if (QualitySetting.GraphicLevel == 2) // 低配也使用低配特效 { res_path = ModelHelper.GetModelPrefab(bind_info.low_model_id); } else { res_path = ModelHelper.GetModelPrefab(bind_info.model_id); } } else// 其他玩家 { res_path = ModelHelper.GetModelPrefab(bind_info.low_model_id); } if (string.IsNullOrEmpty(res_path)) { GameDebug.LogError("Cannot find suit res info, model_id: " + bind_info.model_id); continue; } var mount_point = CommonTool.FindChildInHierarchy(model.transform, bind_info.bind_node); if (mount_point == null) { GameDebug.LogError("Cannot find suit mount point, bind_node: " + bind_info.bind_node); continue; } ObjectWrapper ow = new ObjectWrapper(); yield return(ResourceLoader.Instance.StartCoroutine(ObjCachePoolMgr.Instance.LoadPrefab(res_path, ObjCachePoolType.SFX, res_path, ow))); GameObject effect_object = ow.obj as GameObject; if (effect_object == null) { GameDebug.LogError("Cannot load suit effect point, res_path: " + res_path); continue; } GameObject.DontDestroyOnLoad(effect_object); if (model == null) { ObjCachePoolMgr.Instance.RecyclePrefab(effect_object, ObjCachePoolType.SFX, res_path); break; } //int layer = 0; //if (mModelParent != null) // layer = mModelParent.layer; //SetRenderLayer(effect_object, layer, false, false); //m_EffectObjs[res_path] = effect_object; var trans = effect_object.transform; trans.parent = mount_point; trans.localPosition = Vector3.zero; trans.localRotation = Quaternion.identity; trans.localScale = Vector3.one; ListTrailRenderer trail_render_list = effect_object.GetComponent <ListTrailRenderer>(); if (trail_render_list == null) { trail_render_list = effect_object.AddComponent <ListTrailRenderer>(); } if (trail_render_list != null) { trail_render_list.ResetPos(); } // 设置层级 xc.ui.ugui.UIHelper.SetLayer(effect_object.transform, model.layer); } } }
private static IEnumerator ChangePart(GameObject model, uint partId, bool isLocalPlayer = true) { if (model == null) { yield break; } DBAvatarPart.Data data = DBManager.Instance.GetDB <DBAvatarPart>().mData[partId]; string part_name = data.part == DBAvatarPart.BODY_PART.BODY ? xc.AvatarCtrl.BODY_NAME : xc.AvatarCtrl.WEAPON_NAME; // 查找旧资源中的换装节点 Transform old_part = CommonTool.FindChildInHierarchy(model.transform, part_name); if (old_part == null) { Debug.LogError(string.Format("the model {0} does not have a part named {1}", model.name, part_name)); yield break; } string path = data.SuitablePath(isLocalPlayer); // 加载换装部件的模型 AssetResource ar = new AssetResource(); yield return(ResourceLoader.Instance.StartCoroutine(ResourceLoader.Instance.load_asset(string.Format("{0}/{1}.prefab", xc.AvatarCtrl.AVATAR_PATH_PREFIX, path), typeof(GameObject), ar))); GameObject gameObjectAsset = ar.asset_ as GameObject; if (gameObjectAsset == null) { Debug.LogError(string.Format("the res {0} does not exist", path)); yield break; } if (model == null) { ar.destroy(); yield break; } old_part = CommonTool.FindChildInHierarchy(model.transform, part_name); if (old_part == null) { Debug.LogError(string.Format("the model {0} does not have a part named {1}", model.name, part_name)); ar.destroy(); yield break; } // 将asset资源的生命周期与角色GameObject关联起来 ResourceUtilEx.Instance.host_res_to_gameobj(model, ar); // 查找新资源的换装节点 Transform new_part = CommonTool.FindChildInHierarchy(gameObjectAsset.transform, part_name); if (new_part == null) { Debug.LogError(string.Format("the model {0} does not have a part named {1}", gameObjectAsset.name, part_name)); yield break; } SkinnedMeshRenderer new_mesh_renderer = new_part.GetComponent <SkinnedMeshRenderer>(); SkinnedMeshRenderer old_mesh_renderer = old_part.GetComponent <SkinnedMeshRenderer>(); Transform[] old_bones = (Transform[])old_part.GetComponent <SkinnedMeshRenderer>().bones.Clone(); ReplaceSkinnedMesh(old_bones, model, old_mesh_renderer, new_mesh_renderer); }
IEnumerator LoadStandEffect(string fileName) { GameObject model = mOwner.mAvatarCtrl.GetModel(); if (model == null) { yield break; } RemoveStandEffect(); Transform pos = CommonTool.FindChildInHierarchy(model.transform, AvatarCtrl.ROOT_NODE); if (pos == null) { Debug.LogError(string.Format("not found footprint point on {0}", model.name)); yield break; } ObjectWrapper ow = new ObjectWrapper(); yield return(ResourceLoader.Instance.StartCoroutine(ObjCachePoolMgr.Instance.LoadPrefab(fileName, ObjCachePoolType.SFX, fileName, ow))); GameObject effect_object = ow.obj as GameObject; if (effect_object == null) { yield break; } GameObject.DontDestroyOnLoad(effect_object); if (mIsDestroy || fileName != mStandEffectFile) { ObjCachePoolMgr.Instance.RecyclePrefab(effect_object, ObjCachePoolType.SFX, fileName); yield break; } RemoveStandEffect(); if (mStandEffectContainer == null) { mStandEffectContainer = new GameObject("FootprintContainer"); } mStandEffectContainer.transform.parent = pos; mStandEffectContainer.transform.localPosition = Vector3.zero; mStandEffectContainer.transform.localEulerAngles = new Vector3(0, 0, 0); mStandEffectContainer.transform.localScale = Vector3.one; effect_object.transform.parent = mStandEffectContainer.transform; effect_object.transform.localPosition = Vector3.zero; effect_object.transform.localEulerAngles = new Vector3(0, 0, 0); effect_object.transform.localScale = Vector3.one; int layer = 0; if (mOwner.mAvatarCtrl.GetModelParent() != null) { layer = mOwner.mAvatarCtrl.GetModelParent().layer; } mOwner.mAvatarCtrl.SetRenderLayer(effect_object, layer, false, false); mStandEffectInfo = new SceneEffectInfo(fileName, 0, effect_object); }