유니티/AA(3D 쿼터뷰 액션 게임)

AA(23) - 다양한 형태의 몬스터 공격 구현

무직백수취업준비생 2021. 9. 27. 02:16
728x90
반응형

전에 만든 플레이어 피격 테스트용 오브젝트를 몬스터 자식으로 할당합니다.

 

    void Targerting()
    {
        float targetRadius = 1.5f;
        float targetRange = 3f;

        RaycastHit[] rayHits = Physics.SphereCastAll(transform.position, targetRadius, transform.forward, targetRange, LayerMask.GetMask("Player"));
        if(rayHits.Length > 0 && !isAttack)
        {
            StartCoroutine(Attack());
        }
    }
    IEnumerator Attack() //정지를 한 뒤 애니메이션과 공격범위 활성화
    {
        isChase = false;
        isAttack = true;
        anim.SetBool("isAttack", true);
        yield return new WaitForSeconds(0.2f);
        meleeArea.enabled = true;
        yield return new WaitForSeconds(1f);
        meleeArea.enabled = false;

        isChase = true;
        isAttack = false;
        anim.SetBool("isAttack", false);
    }

몬스터 A의 공격을 위한 스크립트를 작성합니다.

 

 

공격할 때만 Enumy Bullet이 활성화되며 캐릭터가 피격됩니다.

 

피격 시엔 체력이 깎이고 스킨매쉬랜더러가 붉게 변합니다.

 

다른 형태의 몬스터B를 만듭니다.

 

몬스터 B는 정지한 뒤 공격하는 A와 다르게 플레이어와 일정 거리 내에 들어오면 플레이어 방향으로 돌진하며 공격합니다.

 

void Targerting()
    {
        float targetRadius = 0;
        float targetRange = 0;

        switch (enemyType) //switch문으로 각 타겟팅 수치 정하기
        {
            case Type.A:
                targetRadius = 0.5f;
                targetRange = 0.5f;
                break;
            case Type.B:
                targetRadius = 0.5f;
                targetRange = 4f;
                break;
            case Type.C:
                break;
        }

        RaycastHit[] rayHits = Physics.SphereCastAll(transform.position, targetRadius, transform.forward, targetRange, LayerMask.GetMask("Player"));
        if(rayHits.Length > 0 && !isAttack)
        {
            StartCoroutine(Attack());
        }
    }
    IEnumerator Attack() //정지를 한 뒤 애니메이션과 공격범위 활성화
    {
        isChase = false;
        isAttack = true;
        anim.SetBool("isAttack", true);
        switch (enemyType)
        {
            case Type.A:
                yield return new WaitForSeconds(1f);
                meleeArea.enabled = true;
                yield return new WaitForSeconds(1.5f);
                meleeArea.enabled = false;
                yield return new WaitForSeconds(1.5f);
                break;
            case Type.B:
                yield return new WaitForSeconds(0.1f);
                rigid.AddForce(transform.forward * 5, ForceMode.Impulse);//AddForce()로 돌격 구현
                meleeArea.enabled = true;
                yield return new WaitForSeconds(0.8f);
                rigid.velocity = Vector3.zero;
                meleeArea.enabled = false;
                yield return new WaitForSeconds(0.2f);
                break;
            case Type.C:
                break;
        }

        isChase = true;
        isAttack = false;
        anim.SetBool("isAttack", false);
    }

 

AddForce()로 돌진을 구현했습니다.

 

 

정상적으로 플레이어를 향해 돌진하며, 충돌시 플레이어에게 피격 판정이 나옵니다.

 

 

원거리 공격을 하는 몬스터 C타입을 만듭니다.

 

몬스터 모델링은 막시모, 로켓포 모델링은 에셋스토어에서 받았습니다.

 

A타입과 B타입과는 다르게 오브젝트를 던져서 공격하므로

 

Melee Area에 트리거 오브젝트를 할당하는 식으로 하지 않습니다.

 

Bullet을 선언해주고 발사될 오브젝트를 Bullet에 할당해줍니다.

 

    void Targerting()
    {
        float targetRadius = 0;
        float targetRange = 0;

        switch (enemyType) //switch문으로 각 타겟팅 수치 정하기
        {
            case Type.A:
                targetRadius = 1f;
                targetRange = 0.5f;
                break;
            case Type.B:
                targetRadius = 1f;
                targetRange = 4f;
                break;
            case Type.C:
                targetRadius = 0.5f;
                targetRange = 12;
                break;
        }

        RaycastHit[] rayHits = Physics.SphereCastAll(transform.position, targetRadius, transform.forward, targetRange, LayerMask.GetMask("Player"));
        if(rayHits.Length > 0 && !isAttack)
        {
            StartCoroutine(Attack());
        }
    }
    IEnumerator Attack() //정지를 한 뒤 애니메이션과 공격범위 활성화
    {
        isChase = false;
        isAttack = true;
        anim.SetBool("isAttack", true);
        switch (enemyType)
        {
            case Type.A:
                yield return new WaitForSeconds(1f);
                meleeArea.enabled = true;
                yield return new WaitForSeconds(1.5f);
                meleeArea.enabled = false;
                yield return new WaitForSeconds(1.5f);
                break;
            case Type.B:
                yield return new WaitForSeconds(0.1f);
                rigid.AddForce(transform.forward * 5, ForceMode.Impulse);//AddForce()로 돌격 구현
                meleeArea.enabled = true;
                yield return new WaitForSeconds(0.8f);
                rigid.velocity = Vector3.zero;
                meleeArea.enabled = false;
                yield return new WaitForSeconds(0.2f);
                break;
            case Type.C:
                yield return new WaitForSeconds(1.3f);
                GameObject instantBullet = Instantiate(bullet, transform.position, transform.rotation); // 미사일 인스턴스화
                Rigidbody rigidBullet = instantBullet.GetComponent<Rigidbody>();
                rigidBullet.velocity = transform.forward * 20;
                yield return new WaitForSeconds(1.5f);
                break;
        }

 

C타입의 스크립트까지 추가해줍니다.

 

 

날아가는 오브젝트와 몬스터간의 충돌을 막기 위해 EnemyBullet과 Enemy의 충돌을 무시합니다.

 

 

플레이어를 향해 정상적으로 원거리 공격이 이루어집니다.

 

 

728x90
반응형