public void Tick() { try { Profiler.BeginSample("GfxImpactSystem.Tick"); for (int i = m_ImpactLogicInfos.Count - 1; i >= 0; --i) { ImpactLogicInfo info = m_ImpactLogicInfos[i]; if (null != info) { if (info.IsActive) { IGfxImpactLogic logic = GfxImpactLogicManager.Instance.GetGfxImpactLogic(info.LogicId); if (null != logic) { if (null != info.Target) { if (info.Target.activeSelf) { logic.Tick(info); } else { info.Recycle(); m_ImpactLogicInfos.RemoveAt(i); } } } } else { info.Recycle(); m_ImpactLogicInfos.RemoveAt(i); } } } GfxImpactSoundManager.Instacne.UpdateSoundInfos(); } finally { Profiler.EndSample(); } }
public void Reset() { for (int i = m_ImpactLogicInfos.Count - 1; i >= 0; --i) { ImpactLogicInfo info = m_ImpactLogicInfos[i]; if (null != info) { info.Recycle(); m_ImpactLogicInfos.RemoveAt(i); } } m_ImpactLogicInfos.Clear(); }
private void AddImpactInfo(ImpactLogicInfo addInfo) { for (int i = m_ImpactLogicInfos.Count - 1; i >= 0; --i) { ImpactLogicInfo info = m_ImpactLogicInfos[i]; if (null != info && null != info.Target && null != addInfo && null != addInfo.Target) { if (info.Target.GetInstanceID() == addInfo.Target.GetInstanceID() && addInfo.ImpactId == info.ImpactId) { if (info.LogicId == (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_Default || addInfo.LogicId == (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_Default) { info.Recycle(); m_ImpactLogicInfos.RemoveAt(i); } } } } m_ImpactLogicInfos.Add(addInfo); }
public void SendDeadImpact(int targetId) { GameObject targetObj = LogicSystem.GetGameObject(targetId); if (null != targetObj) { bool needSendImpact = true; UnityEngine.Vector3 srcPos = UnityEngine.Vector3.zero; float srcDir = 0.0f; for (int i = m_ImpactLogicInfos.Count - 1; i >= 0; --i) { ImpactLogicInfo info = m_ImpactLogicInfos[i]; if (null != info) { if (info.IsActive) { if (info.Target.GetInstanceID() == targetObj.GetInstanceID()) { if (info.LogicId != (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_Default) { IGfxImpactLogic logic = GfxImpactLogicManager.Instance.GetGfxImpactLogic(info.LogicId); if (null != logic) { logic.OnInterrupted(info); } needSendImpact = true; srcDir = info.ImpactSrcDir; srcPos = info.ImpactSrcPos; info.Recycle(); m_ImpactLogicInfos.RemoveAt(i); } } } } } if (needSendImpact) { SendImpactToCharacterImpl(targetObj, targetObj, m_DeadImpactId, srcPos.x, srcPos.y, srcPos.z, srcDir, -1); } } }
public void SendImpactToCharacter(int sender, int target, int impactId, float x, float y, float z, float dir, int forceLogicId) { GameObject senderObj = LogicSystem.GetGameObject(sender); GameObject targetObj = LogicSystem.GetGameObject(target); if (null == senderObj || null == targetObj) { LogSystem.Error("null obj"); } SharedGameObjectInfo targetInfo = LogicSystem.GetSharedGameObjectInfo(targetObj); if (null == targetInfo || targetInfo.IsDead) { return; } GfxImpactSoundManager.Instacne.TryPlaySound(target, impactId); ImpactLogicData config = (ImpactLogicData)SkillConfigProvider.Instance.ExtractData(SkillConfigType.SCT_IMPACT, impactId); if (null != config) { if (config.MoveMode == (int)ImpactMovementType.Inherit) { GetPreImpactMoveInfo(targetObj, out x, out y, out z, out dir); } bool needSendImpact = true; int logicId = config.ImpactGfxLogicId; if (-1 != forceLogicId) { logicId = forceLogicId; } for (int i = m_ImpactLogicInfos.Count - 1; i >= 0; --i) { ImpactLogicInfo info = m_ImpactLogicInfos[i]; if (null != info) { if (info.IsActive) { if (info.Target.GetInstanceID() == targetObj.GetInstanceID()) { if (info.LogicId == (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_Default || logicId == (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_Default) { if (info.ImpactId != impactId) { continue; } } IGfxImpactLogic logic = GfxImpactLogicManager.Instance.GetGfxImpactLogic(info.LogicId); if (null != logic) { needSendImpact = logic.OnOtherImpact(logicId, info, (info.ImpactId == impactId)); if (needSendImpact) { info.Recycle(); m_ImpactLogicInfos.RemoveAt(i); } } } } } } if (needSendImpact) { SendImpactToCharacterImpl(senderObj, targetObj, impactId, x, y, z, dir, forceLogicId); } else { LogicSystem.NotifyGfxStopImpact(senderObj, impactId, targetObj); } } }