Example #1
0
        public override void OnGameLogicTurn()
        {
            base.OnGameLogicTurn();
            if (SelfBaseUnit.IsPlayer())
            {
                SetAlertDirty();
            }

            foreach (var item in Data)
            {
                item.GameLogicTurn();
                if (!item.IsValid())
                {
                    ClearData.Add(item);
                }
                if (item.IsCommingTimeOut())
                {
                    item.OnCommingTimeOut();
                    Callback_OnCommingTimeOut?.Invoke(item);
                }
            }
            for (int i = 0; i < ClearData.Count; ++i)
            {
                ClearData[i].OnTimeOut();
                Remove(ClearData[i]);
            }
            ClearData.Clear();
        }
Example #2
0
 public void RefreshUnitState()
 {
     if (!SelfBaseUnit.IsLive)
     {
         return;
     }
     UnitsEnemy.Clear();
     UnitsAlly.Clear();
     UnitsSelf.Clear();
     foreach (var item in Units)
     {
         if (SelfBaseUnit.IsEnemy(item))
         {
             UnitsEnemy.Add(item);
         }
         if (SelfBaseUnit.IsSOF(item))
         {
             UnitsAlly.Add(item);
         }
         if (SelfBaseUnit.IsSelf(item))
         {
             UnitsSelf.Add(item);
         }
     }
 }
Example #3
0
        public void ShowPath(bool b)
        {
            if (!b)
            {
                return;
            }
            if (!SelfBaseUnit.IsPlayer())
            {
                return;
            }
            if (!IsHaveMoveTarget())
            {
                return;
            }
            var state    = StateMachine.GetState(MoveTarget_State);
            var curState = StateMachine.CurState;

            if (!IsMoveTargetState(curState))
            {
                Vector3 realPoint = Vector3.zero;
                if (MoveTarget_PosPreview == Vector3.zero)
                {
                    return;
                }
                if (MoveTarget_PosPreview.IsInv())
                {
                    return;
                }
                realPoint = (Vector3)AStarMgr.GetDistNode(SelfBaseUnit, MoveTarget_PosPreview, false, true, false, false, false).position;
                PreviewPath(realPoint);
            }
        }
Example #4
0
 public void PlayPlayerSFX(string sfx)
 {
     if (!SelfBaseUnit.IsPlayerCtrl())
     {
         return;
     }
     SelfBaseGlobal.AudioMgr.PlaySFX(sfx, SelfBaseUnit.Pos, false, 0.1f);
 }
        public override void OnBeAdded(IMono mono)
        {
            base.OnBeAdded(mono);
#if ENABLE_TMP
            TextMesh = SelfBaseUnit.GetComponentInChildren <TextMeshPro>();
#endif
            Collider = SelfBaseUnit.GetComponentInChildren <BoxCollider>();
        }
Example #6
0
 protected void TriggerListener(string rType, object rData)
 {
     if (SelfBaseUnit == null)
     {
         CLog.Error("TriggerListener错误!没有SelfBaseUnit:" + rType);
         return;
     }
     SelfBaseUnit.TriggerListener(rType, rData);
 }
Example #7
0
 protected void AddListener(string rMessageType, Callback <object> rHandler)
 {
     if (SelfBaseUnit == null)
     {
         CLog.Error("AddListener错误!没有SelfBaseUnit:" + rMessageType);
         return;
     }
     SelfBaseUnit.AddListener(rMessageType, rHandler);
 }
Example #8
0
 public TDBaseAlertData AddPl(string alertName, BaseUnit cast = null)
 {
     if (SelfBaseUnit == null)
     {
         return(null);
     }
     if (!SelfBaseUnit.IsLocalPlayer())
     {
         return(null);
     }
     return(Add(alertName, cast));
 }
Example #9
0
 public TDBaseAlertData AddPlCOM(BaseUnit cast = null)
 {
     if (SelfBaseUnit == null)
     {
         return(null);
     }
     if (!SelfBaseUnit.IsLocalPlayer())
     {
         return(null);
     }
     return(AddCOM(cast));
 }
Example #10
0
 public override void OnFixedUpdate()
 {
     base.OnFixedUpdate();
     if (SelfBaseUnit.IsPlayer())
     {
         if (IsDirtyUpdateAlert || UpdateAlertTimer.CheckOver())
         {
             OnUpdateContinueAlert();
             IsDirtyUpdateAlert = false;
         }
     }
 }
Example #11
0
        public TData Rand()
        {
            if (!RandUtil.Rand(GlobalProp))
            {
                return(null);
            }
            if (CurRandCount >= MaxRandCount)
            {
                CurRandCount = 0;
                return(null);
            }
            CurRandCount++;
            if (Options.IsNoEvent)
            {
                return(null);
            }
            if (!SelfBaseUnit.IsPlayerCtrl())
            {
                return(null);
            }
            if (TDLuaMgr.Keys.Count == 0)
            {
                return(null);
            }

            string key    = TDLuaMgr.Keys.Rand();
            TData  config = TDLuaMgr.Get <TData>(key);

            //判断事件的触发条件
            if (IsInTarget(config))
            {
                //判断事件的概率
                if (IsInProp(config))
                {
                    CurRandCount = 0;
                    if (config.CD > 0)
                    {
                        if (!EventCD.ContainsKey(key))
                        {
                            EventCD.Add(key, new CD());
                        }
                        EventCD[key] = new CD(config.CD);
                    }
                    return(Add(config.TDID));
                }
                else
                {
                    return(null);
                }
            }
            return(Rand());
        }
Example #12
0
 protected virtual bool IsCanJump(bool needPlayer = false)
 {
     if (!SelfBaseUnit.IsPlayer() && needPlayer)
     {
         return(false);
     }
     if (!BaseGlobal.IsUnReadData)
     {
         return(false);
     }
     if (SelfBaseUnit.FOWMgr != null && SelfBaseUnit.FOWMgr.IsInFog)
     {
         return(false);
     }
     return(true);
 }
Example #13
0
 private bool IsCanAddDisposableAlert()
 {
     if (SelfBaseUnit == null)
     {
         return(false);
     }
     if (Options.IsAllAlert)
     {
         return(true);
     }
     if (!SelfBaseUnit.IsPlayer())
     {
         return(false);
     }
     return(true);
 }
Example #14
0
        public override void OnBeAdded(BaseCoreMono selfMono, params object[] obj)
        {
            base.OnBeAdded(selfMono, obj);
            SelfArticle   = new List <TDBaseArticleData>();
            TargetArticle = new List <TDBaseArticleData>();
            CurTurn       = 0;
            if (TipStr.IsInv())
            {
                if (!TipKey.IsInv())
                {
                    TipStr = GetStr(TipKey);
                }
                else if (OnGetTip != null)
                {
                    TipStr = OnGetTip?.Invoke(this);
                }
                else
                {
                    TipStr = GetStr(TDID);
                }
            }
            if (DetailStr.IsInv())
            {
                DetailStr = OnGetDetail?.Invoke(this);
            }
            if (TitleStr.IsInv())
            {
                TitleStr = GetStr(TDID);
            }

            //播放音效
            if (SelfBaseUnit == null)
            {
                return;
            }
            if (SelfBaseUnit.IsPlayer())
            {
                if (!SFX.IsInv())
                {
                    AudioMgr.PlaySFX2D(SFX);
                }
            }
        }
Example #15
0
 void OnPathFindCompleted(Path p, float speed)
 {
     ABPath = p as ABPath;
     //无路可走,直接返回,不要报错
     if (ABPath.vectorPath.Count == 0)
     {
         StopPath();
         OnPathNoWay();
         return;
     }
     if (ABPath.error)
     {
         CLog.Error($"Name:{SelfBaseUnit.GetName()},Pos:{SelfBaseUnit.Pos},SearchedPos:{SearchedPos},\n{ABPath.errorLog}");
         StopPath();
         OnPathError();
         return;
     }
     SetMoveSpeed(speed);
     OnMoveStart();
 }
Example #16
0
 public void RefreshEnemyAlly()
 {
     UnitsEnemy.Clear();
     UnitsAlly.Clear();
     UnitsSelf.Clear();
     foreach (var item in Units)
     {
         if (SelfBaseUnit.IsEnemy(item))
         {
             UnitsEnemy.Add(item);
         }
         if (SelfBaseUnit.IsSOF(item))
         {
             UnitsAlly.Add(item);
         }
         if (SelfBaseUnit.IsSelf(item))
         {
             UnitsSelf.Add(item);
         }
     }
 }
Example #17
0
        public void DoTestEnter(Collider col)
        {
            if (!SelfBaseUnit.IsLive)
            {
                return;
            }
            if (col == null)
            {
                return;
            }
            TUnit unit = col.GetComponent <TUnit>();

            if (unit != null)
            {
                if (!unit.IsLive)
                {
                    return;
                }
                Units.Add(unit);
                if (SelfBaseUnit.IsEnemy(unit))
                {
                    UnitsEnemy.Add(unit);
                }
                if (SelfBaseUnit.IsSOF(unit))
                {
                    UnitsAlly.Add(unit);
                }
                if (SelfBaseUnit.IsSelf(unit))
                {
                    UnitsSelf.Add(unit);
                }
                unit.DetectionMgr.Add(this, SelfBaseUnit);
                OnEnter(unit);
            }
            OnEnterObject(col);
        }
Example #18
0
        protected override IEnumerator <float> OnFollowPathCoroutine()
        {
            IsMovingFlag = false;
            //是否为第一段移动
            bool isFirstMoved = false;
            //当前已经走过的路段
            float distanceAlongSegment = 0;
            //当前路段长度
            var segmentLength = 0.0f;
            //节点的大小
            float nodeSize = AStarMgr.Ins.data.gridGraph.nodeSize;
            //最大可以移动的距离
            float maxMoveDistance = nodeSize * MaxMovePoint;
            //已经移动的距离
            float movedDistance = 0;
            var   moveStep      = Time.smoothDeltaTime * RealMoveSpeed;

            IsForceBreak   = false;
            IsFinalPosMove = false;
            for (int i = 0; i < ABPath.vectorPath.Count - 1; i++)
            {
                CurIndex = i;
                var p1 = ABPath.vectorPath[i];
                var p2 = ABPath.vectorPath[i + 1];
                segmentLength = Vector3.Distance(p1, p2);
                if (CurMovePoint <= segmentLength)
                {
                    p2 = (Vector3)AStarMgr.GetSafeNode(p2).position;;
                }
                while (IsHaveMoveSegment() && !IsForceBreak)
                {
                    if (CurMovePoint < nodeSize &&
                        MathUtil.Approximately(SelfBaseUnit.Pos, p2))
                    {
                        IsForceBreak = true;
                    }
                    else
                    {
                        LerpMove(p1, p2, 1, true, false);
                    }

                    yield return(Timing.WaitForOneFrame);

                    if (!isFirstMoved)
                    {
                        isFirstMoved = true;
                        Callback_OnFirstMovingAlone?.Invoke();
                    }
                }

                distanceAlongSegment -= segmentLength;
                OnMoveStep(movedDistance, maxMoveDistance, nodeSize, segmentLength);
                CurIndex++;
                if (!IsCanMove || IsForceBreak)
                {
                    break;
                }
            }

            //计算最后的安全落点
            yield return(Timing.WaitUntilDone(FinalPosMove()));

            if (CurMovePoint < 1)
            {
                CurMovePoint = 0;
            }
            IsMovingFlag = true;
            Callback_OnMoveDestination?.Invoke();
            StopPath();

            //最后位置点的矫正
            IEnumerator <float> FinalPosMove()
            {
                IsFinalPosMove = true;
                Vector3 startPos = SelfBaseUnit.Pos;
                var     finalPos = GetFinalPos(startPos);

                if (MathUtil.Approximately(startPos, finalPos))
                {
                    yield break;
                }
                //将单位移动到最终的目标节点
                distanceAlongSegment = 0;
                segmentLength        = Vector3.Distance(startPos, finalPos);
                while (IsHaveMoveSegment())
                {
                    LerpMove(startPos, finalPos, 1, segmentLength > nodeSize, true);
                    yield return(Timing.WaitForOneFrame);
                }
                SelfBaseUnit.Pos = finalPos;

                //如果目标无效,进入递归
                if (!MathUtil.Approximately(finalPos, GetFinalPos(SelfBaseUnit.Pos)))
                {
                    yield return(Timing.WaitUntilDone(FinalPosMove()));
                }
                IsForceBreak   = false;
                IsFinalPosMove = false;
            }

            bool LerpMove(Vector3 p1, Vector3 p2, float speedMul = 1.0f, bool isRot = true, bool isFinalCorrect = false)
            {
                float aiSpeedMul = 1;

                if (BaseGlobal.FOWMgr != null &&
                    BaseGlobal.FOWMgr.IsInFog(p2) &&
                    SelfBaseUnit != null &&
                    SelfBaseUnit.IsAI() &&
                    SelfBaseUnit.FOWMgr != null &&
                    !SelfBaseUnit.FOWMgr.IsVisible &&
                    !SelfBaseUnit.FOWMgr.IsPreVisible)
                {
                    aiSpeedMul = 10;
                }
                if (!isFinalCorrect && IsForceBreak)
                {
                    return(false);
                }
                var tempMoveStep      = moveStep * speedMul * aiSpeedMul;
                var interpolatedPoint = Vector3.Lerp(p1, p2, distanceAlongSegment / segmentLength);
                var targetRot         = Quaternion.LookRotation((p2 - p1).SetY(0), Vector3.up);

                if (isRot)
                {
                    SelfBaseUnit.Rot = Quaternion.Slerp(SelfBaseUnit.Rot, targetRot, tempMoveStep);
                }
                bool isValid = OnPreLerpMoveAlone(interpolatedPoint, tempMoveStep, movedDistance, maxMoveDistance, nodeSize, segmentLength, isFinalCorrect);

                if (!isValid)
                {
                    return(false);
                }
                SelfBaseUnit.Pos      = interpolatedPoint;
                movedDistance        += tempMoveStep;
                distanceAlongSegment += tempMoveStep;
                OnLerpMoveAlone(tempMoveStep, movedDistance, maxMoveDistance, nodeSize, segmentLength, isFinalCorrect);
                Callback_OnMovingAlone?.Invoke();
                return(true);
            }

            //是否有移动的路段
            bool IsHaveMoveSegment()
            {
                return(distanceAlongSegment < segmentLength);
            }
        }