Ejemplo n.º 1
0
 /*
  *
  * 아이들 상태 -5블록 안에 적 발견 시> 추적모드
  * 아이들 상태 -스킬 쿨타임 0-> 스킬 사용
  * 아이들 상태 -> 2초뒤 랜덤 이동
  * 추적모드 -1블록 안에 적 발견 시> 공격모드 (딜레이 2초, SATK 공격, 30% 확률로 산성 상태이상)
  *
  */
 // Start is called before the first frame update
 void Start()
 {
     gm         = GameObject.Find("GameManager").GetComponent <GameManager>();
     unitInfo   = new UnitInfo(gm.unitPool, 5, gm.nowFloor);
     aiMode     = SlimeAIMode.Idle;
     idleTime   = 0f;
     attackTime = 0f;
 }
Ejemplo n.º 2
0
    // Update is called once per frame
    void FixedUpdate()
    {
        bool    isSeeEnemy     = false;
        Vector2 playerPos      = GameObject.FindGameObjectWithTag("Player").transform.position;
        float   playerDistance = Vector2.Distance(playerPos, gameObject.transform.position);

        if (playerDistance <= sightRange)
        {
            isSeeEnemy = true;
        }
        skillDelayTimer -= Time.deltaTime;
        if (skillDelayTimer <= 0)
        {
            skillDelayTimer = 0;
            //회복 스킬
            if (unitInfo.Hp != unitInfo.MaxHp)
            {
                int healAmount = unitInfo.MaxHp / 10;
                healAmount      = healAmount <= 0 ? 1 : healAmount;
                unitInfo.Hp    += healAmount;
                skillDelayTimer = skillDelay;
            }
        }
        if (aiMode == SlimeAIMode.Idle)
        {
            if (aiMode == SlimeAIMode.Idle && isSeeEnemy)
            {
                //적 발견 추격모드로 전환
                aiMode = SlimeAIMode.Chase;
            }
            else if (aiMode == SlimeAIMode.Idle && idleTime >= 2f)
            {
                //랜덤이동
                StartCoroutine(RandomMove());
                idleTime = 0;
            }
            else
            {
                //가만히 있음
                idleTime += Time.deltaTime;
            }
        }
        else if (aiMode == SlimeAIMode.Chase)
        {
            if (playerDistance <= 1f)
            {
                //탐색 중 거리 내 발견 공격모드로 전환
                aiMode     = SlimeAIMode.Attack;
                attackTime = 0;
            }
            else
            {
                //탐색 진행 안보이면 대기모드로 전환

                if (moveRoutine == null)
                {
                    Vector2 nextPos = GameObject.Find("Astar").GetComponent <Astar>().PathFinding(gameObject.transform.position, playerPos);
                    moveRoutine = StartCoroutine(MoveTo(nextPos));
                }
                if (isSeeEnemy == false)
                {
                    aiMode = SlimeAIMode.Idle;
                }
            }
        }
        else if (aiMode == SlimeAIMode.Attack)
        {
            //공격모드
            if (attackTime >= attackDelay)
            {
                //Debug.Log("Slime의 공격");
                attackTime = 0;
                if (playerDistance < 1f)
                {
                    gm.PlayerGetDamage(unitInfo.GetSatk(), AttackType.SatkWater);
                }
            }
            else if (playerDistance > 1f)
            {
                //1칸에서 더 멀어지면 다시 추격모드로 전환
                aiMode = SlimeAIMode.Chase;
            }
            else
            {
                //공격 준비
                attackTime += Time.deltaTime;
            }
        }

        IEnumerator RandomMove()
        {
            float   moveTime = 0f;
            Vector2 movVec   = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f));

            while (moveTime < 1f)
            {
                moveTime += Time.deltaTime;
                transform.Translate(movVec * speed * Time.deltaTime);
                yield return(new WaitForFixedUpdate());
            }
            aiMode = SlimeAIMode.Idle;
        }

        IEnumerator MoveTo(Vector2 target)
        {
            float timeout = 2f;

            while (Vector2.Distance(target, transform.position) > 0.1f && timeout > 0f)
            {
                timeout           -= Time.deltaTime;
                transform.position = Vector2.MoveTowards(transform.position, target, speed * Time.deltaTime);
                yield return(null);
            }
            moveRoutine = null;
        }
    }