[Unity] Monster 구현 : M_VE - 2

유니티로고.png

Monster M_VE - 2

m_ve2.gif

 

Monster M_VE - 2 기본정보

요청사항

  • Player를 탐색하지 않는 경우에는 Idle 애니메이션 재생
  • Player를 탐색한 경우에는 Attack 애니메이션 재생 후 총알 발사
  • 제자리에 가만히 있다가 공격만 하는 몬스터로 Player를 한 번 탐색하면 사거리가 늘어나는 몬스터

 

필요한 변수들 선언

using System.Collections;
using UnityEngine;

public class M_VE_2 : MonsterBase
{
    public float AttackCoolTime;
    public GameObject BulletPrefab;  // 발사할 총알 프리팹
    public Transform FirePoint;      // 총알 발사 위치
    public float BulletSpeed = 10f;  // 총알 속도

    ...
}

각각의 변수는 쓰임새를 알 수 있도록 이름을 지었다.

 

기본 함수(Start, Update)

using System.Collections;
using UnityEngine;

public class M_VE_2 : MonsterBase
{
    ...
    
    protected override void Start()
    {
        base.Start();
        monsterType = MonsterType.M_VE_2;
        StartCoroutine(MonsterRoutine());
    }

    // Update is called once per frame
    void Update()
    {

    }

    ...
}

타 몬스터들과 유사하게 기본 함수에서는 타입 지정과 코루틴을 시작하게 만들었다.

 

코루틴 관련 함수

using System.Collections;
using UnityEngine;

public class M_VE_2 : MonsterBase
{
    ...
    
    public override IEnumerator MonsterRoutine()
    {
        while (true)
        {
            if (!DetectionSuccess && DetectionPlayerPosition())
                DetectionSuccess = true;

            if (DetectionSuccess)
            {
                // Debug.Log("Player 탐지 완료");
                DetectingAreaR = 15.0f;
                yield return AttackPreparation();
            }

            yield return null;
        }
    }

    public override IEnumerator AttackPreparation()
    {
        if (!MAnimator.GetBool("Detected"))
        {
            MAnimator.SetBool("Detected", true);
            yield return new WaitForSeconds(1.30f);

            DetectingAreaR = 15;
            AttackCoolTime = 1;
        }

        MAnimator.SetTrigger("Shot");
        yield return new WaitForSeconds(1.05f); 

        DetectionPlayerPosition();
        Fire();

        yield return new WaitForSeconds(AttackCoolTime);
    }
    
    ...
}

M_V1처럼 탐색 후 사거리가 늘어나도록 만들었다.

또한 쿨타임마다 총알을 발사하게 만들어줬다.

 

공격 함수

using System.Collections;
using UnityEngine;

public class M_VE_2 : MonsterBase
{
    ...

    private void Fire()
    {
        GameObject bullet = Instantiate(BulletPrefab, FirePoint.position, FirePoint.rotation);
        Physics2D.IgnoreCollision(bullet.GetComponent<Collider2D>(), GetComponent<Collider2D>());

        Vector2 fireDirection = (TargetPosition - FirePoint.position).normalized;

        Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
        rb.velocity = fireDirection * BulletSpeed;
    }
}

 

몬스터 내부에서만 쓰이므로 private으로 정의했다.

몬스터와 총알이 바로 충돌하지 않도록 충돌 처리 후 Rigidbody를 이용해 총알을 발사시켰다.

 

참고 사항

MonsterBase

https://gdoo.tistory.com/21

 

[Unity] Monster Base 구현

MonsterBase의 구현프로젝트에서 몬스터를 구현을 담당하게 되어서 몬스터 스크립트의 베이스가 되는 MonsterBase를 만들어봤다. 필요한 변수들의 선언using System.Collections;using System.Collections.Generic;usin

gdoo.tistory.com

 

마무리하며..

기존에 만들어둔 몬스터 알고리즘에서 약간의 수정만 해서 만들었다.

큰 어려움 없이 완성했다.

'Unity > Hackers Window' 카테고리의 다른 글

[Unity] UI 1 : HUD  (0) 2024.11.19
[Unity] UI Manager 구현  (0) 2024.11.18
[Unity] Monster 구현 : M_VE - 1  (1) 2024.11.16
[Unity] Monster 구현 : M_V3  (0) 2024.11.15
[Unity] Monster 구현 : M_V2  (0) 2024.11.14