void lookPlayer() { DIRECTION = (player.GetComponent<Transform>().position.x < transform.position.x ? -1 : 1); //player와 자신(보스)의 x좌표를 비교해서 적당한 상수를 DIRECTION에 저장한다. float scale = transform.localScale.z; transform.localScale = new Vector3(DIRECTION * -1 * scale, scale, scale); //DIRECTION변수를 이용해서 player쪽을 바라보도록한다. } IEnumerator rush() { animator.SetTrigger("ready"); //돌진을 준비하는 animation lookPlayer();//player 쪽을 보게한다. yield return new WaitForSeconds(1); animator.SetTrigger("rushing"); //돌진하는 animation bool isBroken = false; while (!isBroken) { yield return new WaitForSeconds(0.1f); if (speedx > rigid2D.velocity.x * DIRECTION) //AddForce를 이용해서 자연스럽게 움직이도록 하되 speedx보다 빠르지 않도록한다. { rigid2D.AddForce(transform.right * DIRECTION * 1000); } pos = new Vector2(transform.position.x + DIRECTION * 5, transform.position.y); boxSize = new Vector2(1, 2); Collider2D[] collider2Ds = Physics2D.OverlapBoxAll(pos, boxSize, 0);//자신(보스) 앞쪽에 있는 모든 충돌체들을 저장한다. foreach (Collider2D collider in collider2Ds) { if (collider != this.GetComponent<CapsuleCollider2D>() && (collider.tag == "Ground")) //충돌체가 자신(보스)의 충돌체가 아니고 tag가 Ground일 때 멈추도록한다. { rigid2D.velocity = new Vector2(0, rigid2D.velocity.y); isBroken = true; break; } } } animator.SetBool("stunned", true); //부딪혀서 스턴 당한 animation StartCoroutine("stunCounter"); //4초후에 stunned를 false로 설정하는 coroutine을 호출한다. yield return new WaitForSeconds(1.5f); this.glopGenerator_1.GetComponent<GlopGenerator>().summonGlop(); //Glop(몬스터를 소환한다.) this.glopGenerator_2.GetComponent<GlopGenerator>().summonGlop(); this.glopGenerator_3.GetComponent<GlopGenerator>().summonGlop(); nextPattern = EAT; // 연계를 위해서 yield return new WaitForSeconds(3); nextPatternPlay(); //다음 패턴을 실행한다. } IEnumerator eat() { animator.SetTrigger("ready"); lookPlayer(); yield return new WaitForSeconds(1); animator.SetTrigger("eating"); this.isCanDamaged = true; int eatCount = 0; bool isBroken = false; while (!isBroken) { yield return new WaitForSeconds(0.1f); if (speedx > rigid2D.velocity.x * DIRECTION) { rigid2D.AddForce(transform.right * DIRECTION * 1000); } pos = new Vector2(transform.position.x + DIRECTION * 5, transform.position.y); boxSize = new Vector2(1, 2); Collider2D[] collider2Ds = Physics2D.OverlapBoxAll(pos, boxSize, 0); foreach (Collider2D collider in collider2Ds) { if (collider.gameObject != gameObject && (collider.tag == "Ground")) { isBroken = true; break; } else if (collider.gameObject != gameObject && collider.tag == "Villain") //tag가 villain일 때 즉 아까 소환한 Glop(몬스터)일 때 그것을 파괴하고 그 숫자를 센다. { Destroy(collider.gameObject); eatCount += 1; } } } animator.SetBool("stunned", true); StartCoroutine("stunCounter"); this.isCanDamaged = false; amountOfBone = eatCount * 3; //먹은(파괴한) Glop(몬스터)의 수에 따라서 뼈의 수를 정한다. if (amountOfBone == 0) //뼈가 없을 때는 랜텀으로 다음 패턴을 정한다. { if (0 == Random.Range(0, 2)) nextPattern = RUSH; else nextPattern = JUMP; } else //뼈가 있을 때는 연계를 위해서 강제로 다음 패턴을 정한다. { nextPattern = SPIT; } yield return new WaitForSeconds(3); nextPatternPlay(); } IEnumerator stunCounter() //위에서 호출되는 함수로 4초가 지난 후에 stunned를 false로 설정한다. { yield return new WaitForSeconds(4); animator.SetBool("stunned", false); } |