예제 #1
0
 private void DoAction(Enemy.EnemyController controller)
 {
     for (int i = 0; i < actions.Length; i++)
     {
         actions[i].Act(controller);
     }
 }
예제 #2
0
 private void Attack(Enemy.EnemyController controller)
 {
     if (controller.CheckIfCountDownElapsed(controller.monsterData.attackRateInTick))
     {
         Vector2 dirToTarget = controller.chaseTarget.position - controller.eyes.position;
         controller.eyes.right = dirToTarget;
         GameObject projectile = Instantiate(projectilePrefab, controller.eyes.position, controller.eyes.rotation);
         projectile.GetComponent <Projectile>().direction = new Vector2(Mathf.Abs(dirToTarget.normalized.x), 0f);
         controller.ResetTimer();
     }
 }
예제 #3
0
 private void CheckTransition(Enemy.EnemyController controller)
 {
     for (int i = 0; i < transitions.Length; i++)
     {
         bool decisionSucceeded = transitions[i].decision.Decide(controller);
         if (decisionSucceeded)
         {
             controller.TransitionToState(transitions[i].trueState);
         }
         else
         {
             controller.TransitionToState(transitions[i].falseState);
         }
     }
 }
예제 #4
0
    private void Chase(Enemy.EnemyController controller)
    {
        Vector2 dirMove = (controller.transform.position - controller.chaseTarget.position).normalized;

        controller.GetComponent <SpriteRenderer>().sprite = controller.monsterData.AttackSprite();
        if (dirMove.x < 0)
        {
            controller.transform.localScale = Vector3.one;
        }
        else
        {
            controller.transform.localScale = new Vector3(-1, 1, 1);
        }
        controller.transform.Translate(-dirMove * controller.monsterData.Stats().speed *Time.deltaTime);
    }
예제 #5
0
    private bool Look(Enemy.EnemyController controller)
    {
        Collider2D hits = Physics2D.OverlapCircle(controller.eyes.position, lookDistance, playerLayer);

        if (hits == null)
        {
            return(false);
        }
        Vector2 dirToTarget = (hits.transform.position - controller.eyes.position).normalized;

        if (Vector3.Angle(controller.eyes.right, dirToTarget) < angleLook / 2)
        {
            controller.chaseTarget = hits.transform;
            return(true);
        }
        return(false);
    }
예제 #6
0
    public void Patrol(Enemy.EnemyController controller)
    {
        controller.eyes.right = Vector2.right;
        RaycastHit2D groundInfo = Physics2D.Raycast(controller.eyes.position, controller.eyes.TransformDirection(new Vector2(1, angle)), DISTANCE_RAYCAST, layerHit);
        RaycastHit2D wallInfo   = Physics2D.Raycast(controller.eyes.position, controller.eyes.TransformDirection(Vector2.right), DISTANCE_RAYCAST, layerHit);

        Debug.DrawRay(controller.eyes.position, controller.eyes.TransformDirection(new Vector2(1, angle)) * DISTANCE_RAYCAST, Color.red);
        Debug.DrawRay(controller.eyes.position, controller.eyes.TransformDirection(Vector2.right) * DISTANCE_RAYCAST, Color.red);
        controller.GetComponent <SpriteRenderer>().sprite = controller.monsterData.Sprite();
        if (groundInfo.collider == null || wallInfo.collider)
        {
            controller.dirMove = ChangeDirection(controller.dirMove);
        }
        if (controller.dirMove.x > 0)
        {
            controller.transform.localScale = Vector3.one;
        }
        else
        {
            controller.transform.localScale = new Vector3(-1, 1, 1);
        }
        controller.transform.Translate(controller.dirMove * controller.monsterData.Stats().speed *Time.deltaTime);
    }
예제 #7
0
    public override bool Decide(Enemy.EnemyController controller)
    {
        bool targetVisible = Look(controller);

        return(targetVisible);
    }
예제 #8
0
 public override void Act(Enemy.EnemyController controller)
 {
     Patrol(controller);
 }
예제 #9
0
 public abstract void Act(Enemy.EnemyController controller);
예제 #10
0
 public void SetController(EnemyController _enemyController)
 {
     currentEnemyController = _enemyController;
 }
예제 #11
0
 public override void Act(Enemy.EnemyController controller)
 {
     Attack(controller);
 }
예제 #12
0
 public override void Act(Enemy.EnemyController controller)
 {
     Chase(controller);
 }
예제 #13
0
 public void UpdateState(Enemy.EnemyController controller)
 {
     DoAction(controller);
     CheckTransition(controller);
 }
예제 #14
0
 private void Awake()
 {
     _enemyController = GetComponentInChildren <EnemyController>();
     _myRb            = GetComponentInChildren <Rigidbody2D>();
 }
예제 #15
0
 public FollowState(GameObject gameObject, EnemyController controller) : base(gameObject)
 {
     this.controller = controller;
     this.player     = controller.player;
     this.followTime = controller.followTime;
 }
예제 #16
0
    public override bool Decide(Enemy.EnemyController controller)
    {
        bool chaseTergetIsActive = controller.chaseTarget.gameObject.activeSelf;

        return(chaseTergetIsActive);
    }
예제 #17
0
 public EnemyStateMachine(EnemyController _currentController)
 {
     currentEnemyController = _currentController;
 }
예제 #18
0
 public abstract bool Decide(Enemy.EnemyController controller);
 void Awake()
 {
     enemyController = GetComponentInParent <EnemyController>();
 }