public override void ComponentStart() { if (!UnityUtils.Exists(bulletPrefab)) { Debug.LogWarning($"No bullet prefab specified for {gameObject.name}!"); } if (!Positions.Any()) { Debug.LogError($"Enemy shooter named '{gameObject.name}' doesn't have any predefined positions and his behavior will not work right."); } var brain = GetRequiredComponent <HumanoidNPCBrainComponent>(); if (!UnityUtils.Exists(brain)) { throw new UnityException($"Unable to find a HumanoidNPCBrain on {gameObject.name}"); } brain.attackByPlayer.AddListener(OnAttackedByPlayer); brain.attackBegin.AddListener(OnAttackBegin); brain.attackEnd.AddListener(OnAttackEnd); brain.damageEnable.AddListener(OnDamageEnable); brain.damageDisable.AddListener(OnDamageDisable); var brainTimerPrefabTemp = new GameObject(); brainTimerPrefabTemp.AddComponent <IntervalTimerComponent>(); var inst = Instantiate(brainTimerPrefabTemp, transform); inst.name = "BrainTimer"; brainTimer = GetRequiredComponent <IntervalTimerComponent>(inst); brainTimer.Label = "BrainTimerComponent"; brainTimer.SetInterval((int)UnityEngine.Random.Range(thinkTimeMin, thinkTimeMax)); brainTimer.SelfDestruct = false; brainTimer.Randomize = false; brainTimer.AutoReset = true; brainTimer.OnIntervalReached.AddListener(BrainUpdate); shooterAnimator = GetRequiredComponent <ShooterSkeletonAnimatorComponent>(); if (!UnityUtils.Exists(shooterAnimator)) { throw new UnityException($" {gameObject.name} requires a shooter skeleton animator and you don't have that."); } Destroy(brainTimerPrefabTemp); currentSeekedPosition = FindNearestShooterPosition(); base.ComponentStart(); }
// Called from the interval timer private void BrainUpdate() { if (isActiveAndEnabled) { // if we're at our position, fire a bullet towards the player if (IsNearEnoughToPosition()) { Attack(); } // Additionally, if the player is in our area, pick a new position if (player.transform.position.x.IsWithin(currentSeekedPosition.Range, currentSeekedPosition.Position.x)) { currentSeekedPosition = FindSecondNearestShooterPositionAwayFromPosition(player.transform.position.x); } brainTimer.SetInterval((int)UnityEngine.Random.Range(thinkTimeMin, thinkTimeMax)); } }