private int GetNearUnitHits(BehaviourInfo behaviour) { var hitCount = Physics.SphereCastNonAlloc(behaviour.Self.transform.position, m_searchRange, Vector3.up, m_hits); return(hitCount); }
private Unit GetClosestUnit(int hitCount, BehaviourInfo behaviour) { var closestDist = Mathf.Infinity; Unit target = null; for (var i = 0; i < hitCount; i++) { var t = m_hits[i].transform.GetComponent <Unit>(); if (t == null || t == behaviour.Self) { continue; } var dist = Vector3.Distance(behaviour.Self.transform.position, t.transform.position); if (dist < closestDist) { closestDist = dist; target = t; } } return(target); }
public override bool Update(Dust dust) { BehaviourInfo behaviourInfo = (BehaviourInfo)dust.customData; if (Main.GameUpdateCount - behaviourInfo.SpawnTime > behaviourInfo.AnimationDelay) { float amount = (Main.GameUpdateCount - (behaviourInfo.SpawnTime + behaviourInfo.AnimationDelay)) / (float)behaviourInfo.LerpTime; amount = Easing.Quartic.Out(amount); Vector2 targetPosition = Main.player[behaviourInfo.TargetPlayerId].Center; targetPosition.X += behaviourInfo.TargetOffset.X; targetPosition.Y += behaviourInfo.TargetOffset.Y; dust.position = Vector2.Lerp(behaviourInfo.SpawnPosition, targetPosition, amount); dust.alpha = (int)(Easing.Cubic.In(amount) * 255); if (amount >= 1f) { dust.active = false; } } else { float amount = (Main.GameUpdateCount - behaviourInfo.SpawnTime) / (float)behaviourInfo.AnimationDelay; dust.scale = amount * behaviourInfo.MaxScale; dust.alpha = (int)(255 - (255 * amount)); } return(false); }
public void EnableBehaviour(string behaviourname) { MonoBehaviour behave; if (BehaviourInfo.FindByName(behaviours, behaviourname, out behave)) { behave.enabled = true; } }
private void Start() { BehaviourInfo = new BehaviourInfo { MovementAction = GetComponent <UnitMovementAction>(), Self = GetComponent <Unit>() }; BehaviourTree = Tree(); }
private void ProcessEvent(BehaviourInfo behaviourInfo, object sender, StateUpdateEventArgs args) { Debug.Assert(Enabled, "Enabled"); var targetBehaviour = behaviourInfo.Behaviour; if (!targetBehaviour.Enabled) { return; } // Wait for the cooldown period before running again var lastTriggerTime = TriggerCounter.GetCounter(behaviourInfo.Behaviour).LastTriggerTime; if (lastTriggerTime.AddSeconds(behaviourInfo.Behaviour.CooldownPeriod) > args.SnapshotTime) { return; } var triggerTester = new Func <ITrigger, bool>(tr => { try { var triggerResult = tr.ProcessTrigger(sender, args); if ((triggerResult && !tr.InvertResult) || (!triggerResult && tr.InvertResult)) { TriggerCounter.BumpCounter(tr, args.SnapshotTime); return(true); } } catch (Exception ex) { DebugTools.WriteException(ex); } return(false); }); var triggerTriggered = targetBehaviour.Triggers.Where(x => x.Enabled).Any(triggerTester); if (triggerTriggered) { triggerTriggered = targetBehaviour.Conditions.Where(x => x.Enabled).All(triggerTester); } var result = false; switch (targetBehaviour.TriggeringKind) { case TriggeringMode.RisingEdge: result = !behaviourInfo.LastTriggerState && triggerTriggered; break; case TriggeringMode.FallingEdge: result = behaviourInfo.LastTriggerState && !triggerTriggered; break; case TriggeringMode.Always: result = triggerTriggered; break; case TriggeringMode.BothEdges: result = (!behaviourInfo.LastTriggerState && triggerTriggered) || (behaviourInfo.LastTriggerState && !triggerTriggered); break; case TriggeringMode.Timed: if (triggerTriggered) { if (behaviourInfo.InitialTriggerTime.Equals(DateTime.MaxValue)) { break; } if (behaviourInfo.InitialTriggerTime.AddSeconds(targetBehaviour.MinimalTimedTriggerDelay) <= args.SnapshotTime) { behaviourInfo.InitialTriggerTime = DateTime.MaxValue; result = true; } } else { behaviourInfo.InitialTriggerTime = args.SnapshotTime; } break; default: throw new InvalidEnumArgumentException(); } behaviourInfo.LastTriggerState = triggerTriggered; if (!result) { return; } Action runActions = () => { foreach (var action in targetBehaviour.Actions.Where(x => x.Enabled)) { try { action.ExecuteAction(sender, args); TriggerCounter.BumpCounter(action, args.SnapshotTime); } catch (Exception ex) { DebugTools.WriteException(ex); } } }; if (string.IsNullOrEmpty(targetBehaviour.Group)) { //BUG different than running using BehaviourGroup, can queue next run before it ends // Task doesnt exist yet or it has been completed if (behaviourInfo.UngroupedTask?.IsCompleted != false) { behaviourInfo.UngroupedTask = Task.Run(runActions); } } else { BehaviourGroup behaviourGroup; if (!_groupedTasks.TryGetValue(targetBehaviour.Group, out behaviourGroup)) { behaviourGroup = new BehaviourGroup(); _groupedTasks.Add(targetBehaviour.Group, behaviourGroup); } behaviourGroup.RunBehaviour(runActions, targetBehaviour); } TriggerCounter.BumpCounter(behaviourInfo.Behaviour, args.SnapshotTime); }