コード例 #1
0
 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();
     }
 }
コード例 #2
0
 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();
 }
コード例 #3
0
 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);
 }
コード例 #4
0
        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);
                }
            }
        }
コード例 #5
0
        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);
                }
            }
        }