static void AddEffectCache(EffectCacheComponent effectCacheComponent, BaseBuffData buff, GameObject skillAssetsPrefabGo) { if (buff.GetBuffIdType() == BuffIdType.EmitObj) { Buff_EmitObj buff_EmitEffect = (Buff_EmitObj)buff; if (!string.IsNullOrEmpty(buff_EmitEffect.emitObjId) && !effectCacheComponent.Contains(buff_EmitEffect.emitObjId)) { effectCacheComponent.Add(buff_EmitEffect.emitObjId, skillAssetsPrefabGo.Get <GameObject>(buff_EmitEffect.emitObjId)); } } if (buff.GetBuffIdType() == BuffIdType.HitEffect) { Buff_HitEffect buff_HitEffect = (Buff_HitEffect)buff; if (!string.IsNullOrEmpty(buff_HitEffect.hitObjId) && !effectCacheComponent.Contains(buff_HitEffect.hitObjId)) { effectCacheComponent.Add(buff_HitEffect.hitObjId, skillAssetsPrefabGo.Get <GameObject>(buff_HitEffect.hitObjId)); } } if (buff.GetBuffIdType() == BuffIdType.PlayEffect) { Buff_PlayEffect buff_PlayEffect = (Buff_PlayEffect)buff; if (!string.IsNullOrEmpty(buff_PlayEffect.effectObjId) && !effectCacheComponent.Contains(buff_PlayEffect.effectObjId)) { effectCacheComponent.Add(buff_PlayEffect.effectObjId, skillAssetsPrefabGo.Get <GameObject>(buff_PlayEffect.effectObjId)); } } }
public void ActionHandle(BuffHandlerVar buffHandlerVar) { Buff_EmitObj buff = buffHandlerVar.data as Buff_EmitObj; UnitData emitObjData = new UnitData(); if (!buff.FindFriend) { emitObjData.groupIndex = buffHandlerVar.source.UnitData.groupIndex; } else { switch (buffHandlerVar.source.UnitData.groupIndex) { case GroupIndex.Default: emitObjData.groupIndex = GroupIndex.Default; break; case GroupIndex.Player: emitObjData.groupIndex = GroupIndex.Monster; break; case GroupIndex.Monster: emitObjData.groupIndex = GroupIndex.Player; break; } } Log.Debug(string.Format("EmitObj {0} Source {1}", emitObjData.groupIndex, buffHandlerVar.source.UnitData.groupIndex)); emitObjData.unitLayer = buff.layer; emitObjData.layerMask = buff.layerMask; emitObjData.unitTag = UnitTag.Default; int index = 10000; if (buff.lockTarget) { if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits)) { return; } //每个单位都发射一个特效 foreach (var v in targetUnits.targets) { long id = buffHandlerVar.source.Id + index; // 确保客户端/服务器发射的子弹的id都是一样的. index++; #if !SERVER //特效 UnityEngine.GameObject go = null; go = Game.Scene.GetComponent <EffectCacheComponent>().Get(buff.emitObjId);//先找到缓存的特效物体 var effectGo = go; Unit unit = UnitFactory.CreateEmitObj(id, go, emitObjData); go.SetActive(true); #else Unit unit = ETHotfix.UnitFactory.CreateEmitObj(id, emitObjData, buff.emitObjId); #endif Vector3 dir = (v.Position - buffHandlerVar.source.Position).normalized; Vector3 startPosOffset = buff.startPosOffset.ToV3(); unit.Position = buffHandlerVar.source.Position + new Vector3(dir.x * startPosOffset.x, startPosOffset.y, dir.z * startPosOffset.z); Quaternion quaternion = Quaternion.LookRotation(dir, Vector3.up); unit.Rotation = quaternion; CollisionEvent_LockTarget(buffHandlerVar, unit, v, buff.emitSpeed).Coroutine(); } } else { if (!buffHandlerVar.GetBufferValue(out BufferValue_Dir buffer_dir)) { return; } long id = buffHandlerVar.source.Id + index; // 确保客户端/服务器发射的子弹的id都是一样的. #if !SERVER UnityEngine.GameObject go = null; go = Game.Scene.GetComponent <EffectCacheComponent>().Get(buff.emitObjId);//先找到缓存的特效物体 var effectGo = go; Unit unit = UnitFactory.CreateEmitObj(id, go, emitObjData); go.SetActive(true); #else Unit unit = ETHotfix.UnitFactory.CreateEmitObj(id, emitObjData, buff.emitObjId); #endif Vector3 startPosOffset = buff.startPosOffset.ToV3(); Vector3 dir = buffer_dir.dir.normalized; unit.Position = buffHandlerVar.source.Position + new Vector3(dir.x * startPosOffset.x, startPosOffset.y, dir.z * startPosOffset.z); //Log.Debug(string.Format("{0}使用者位置 方向{1} 初始位置偏移量{2},计算出的最终位置{3}", buffHandlerVar.source.Position, dir, startPosOffset, unit.Position)); Log.Debug(string.Format("飞行物体的高度{0}", unit.Position.y)); Quaternion quaternion = Quaternion.LookRotation(buffer_dir.dir, Vector3.up); unit.Rotation = quaternion; buffHandlerVar.source.Rotation = quaternion; Vector3 targetPos = dir * buff.emitSpeed * buff.duration + unit.Position; CollisionEvent(buffHandlerVar, unit, targetPos, buff.emitSpeed).Coroutine(); } }