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(); }
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); } } }
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); } }
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>(); }
protected void TriggerListener(string rType, object rData) { if (SelfBaseUnit == null) { CLog.Error("TriggerListener错误!没有SelfBaseUnit:" + rType); return; } SelfBaseUnit.TriggerListener(rType, rData); }
protected void AddListener(string rMessageType, Callback <object> rHandler) { if (SelfBaseUnit == null) { CLog.Error("AddListener错误!没有SelfBaseUnit:" + rMessageType); return; } SelfBaseUnit.AddListener(rMessageType, rHandler); }
public TDBaseAlertData AddPl(string alertName, BaseUnit cast = null) { if (SelfBaseUnit == null) { return(null); } if (!SelfBaseUnit.IsLocalPlayer()) { return(null); } return(Add(alertName, cast)); }
public TDBaseAlertData AddPlCOM(BaseUnit cast = null) { if (SelfBaseUnit == null) { return(null); } if (!SelfBaseUnit.IsLocalPlayer()) { return(null); } return(AddCOM(cast)); }
public override void OnFixedUpdate() { base.OnFixedUpdate(); if (SelfBaseUnit.IsPlayer()) { if (IsDirtyUpdateAlert || UpdateAlertTimer.CheckOver()) { OnUpdateContinueAlert(); IsDirtyUpdateAlert = false; } } }
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()); }
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); }
private bool IsCanAddDisposableAlert() { if (SelfBaseUnit == null) { return(false); } if (Options.IsAllAlert) { return(true); } if (!SelfBaseUnit.IsPlayer()) { return(false); } return(true); }
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); } } }
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(); }
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); } } }
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); }
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); } }