Ejemplo n.º 1
0
        private int GetNearUnitHits(BehaviourInfo behaviour)
        {
            var hitCount = Physics.SphereCastNonAlloc(behaviour.Self.transform.position,
                                                      m_searchRange, Vector3.up, m_hits);

            return(hitCount);
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 6
0
        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);
        }