Unity: Boss의 공격 구현

이재형·2024년 7월 17일
0
post-thumbnail

Unity 실습

Boss의 공격 구현

보스의 기본 구현

1. 직접 이동을 하지 않음

2. 플레이어를 향해서 공격을 가함 (쿨타임이 있을 때는 가만히)

3. 체력이 40%이하가 되면 특수 공격을 가하고 폭주(2페이지)를 시작

4. 폭주 시 모든 공격 쿨타임 감소

기획 진행: (플레이어를 향해서 공격함)

1. 플레이어를 향해 돌진 후 2초 후 근처에 공격 (미구현)

2. 검기를 0.5초마다 5~7회 발사하여 공격 (임시 구현)

3. 짧게 3번 돌진 공격 (임시 구현)

4. 미정 (미구현)

1. 기본 공격 패턴 시작

bool crash = false;      // 몸 충돌 데미지 적용 여부
bool attacking = false;  // 공격중인지 여부
float attackDelayTime = 0;    // 공격대기 시간
WaitForSeconds oneHalfDelay = new WaitForSeconds(1.5f);
WaitForSeconds halfDelay = new WaitForSeconds(0.5f);

BossEnemy bossEnemy;

public GameObject Skill2Projectile;

private void Awake()
{
    bossEnemy = GetComponent<BossEnemy>();
}

private void Update()
{
    if (attackDelayTime > 0)
    {
        attackDelayTime -= Time.deltaTime;
    }
    else
    {
        attackDelayTime = 0;
        if (!attacking)
        {
            attacking = true;
            //UseSkill(Random.Range(1, 4));
        }
    }
}

private void AttackReayOn()
{
    attacking = false;
    attackDelayTime = 5.0f;
}


2. 검기를 0.5초마다 5~7회 발사하여 공격 (임시 구현)

// 적(플레이어) 방향으로 검기 5~7개
public IEnumerator Skill2()
{
    for(int i = 0; i < Random.Range(5, 8); i++)
    {
        GameObject clone = Managers.Pool.Pop(Skill2Projectile, transform).gameObject;
        clone.transform.position = transform.position;
        clone.GetComponent<ProjectileController>().direction = (bossEnemy.target.transform.position - transform.position).normalized; 

        // 공격 애니메이션
        yield return halfDelay;
    }

    AttackReayOn();
}

ObjectPool로 검기를 생성하고 전에 만들었던 발사체 컴포넌트를 추가하여 방향을 정해준 다음 캐싱한 변수 halfDelay를 사용하여 처리하였음


3. 짧게 3번 돌진 공격 (임시 구현)

public class BossMovement : MonoBehaviour
{
    public Rigidbody2D rigid;

    private void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
    }

    public void AddForce(Vector3 target, float speed)
    {
        rigid.velocity = Vector2.zero;
        rigid.AddForce(target.normalized * speed, ForceMode2D.Impulse);
    }
}

//아래는 BossSkill.cs
// 플레이어를 향해 짧게 3번 돌진
public IEnumerator Skill3()
{
    crash = true;
    // AddForce 3번
    for (int i = 0; i < 3; i++)
    {
        bossEnemy.movement.AddForce(bossEnemy.target.position - transform.position, 30.0f);

        // 공격 애니메이션

        yield return halfDelay;

        crash = false;

        yield return oneHalfDelay;
    }

    AttackReayOn();
    crash = false;
}

private void OnTriggerEnter2D(Collider2D collision)
{
    if (!crash) return;

    if (collision.CompareTag("Player"))
    {
        if(collision.TryGetComponent<IDamagable>(out IDamagable damagable))
        {
            damagable.ApplyDamage(1);
        }
    }
}

movement(BossMovement)에 AddForce()를 생성하고 거기서 rigidbody의 AddForce를 이용하여 짧은 대쉬를 구현을 하고 구현한 메서드를 이용하여 처리하였음


정리

배운 내용

1. 없음

해결 못한 문제

1. 없음

문제점

1. 없음

profile
한국사람

0개의 댓글