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개의 댓글

관련 채용 정보