Unity_2기 내일배움캠프 TIL

Unity_2기 11주차 (230117)

잼잼재미 2024. 1. 17. 15:28

Player와 함께 싸울 Partner를 Enemy와 똑같은 로직으로 구현하고 Partner와 Enemy가 싸우는 기능을 구현했다.

 

 

구현 내용


1. 동료 구현

  • Enemy와 똑같은 상태패턴 로직을 사용 (같은 스크립트)
  • 캐릭터 에셋과 Tag만 구분
  • Physics.OverlapSphere를 사용해서 Target 지정 구현

 

 

 

https://kkln2486.tistory.com/248

 

범위 내 콜라이더 판별 (OverlapSphere)

OverlapSphere 3D 공간에서 구 형태의 영역 안의 모든 콜라이더를 검출 Layer 설정으로 원하는 Layer만 검출 가능 (설정하지 않으면 모든 콜라이더 검출) 중심 위치와 반지름으로 구 생성 private LayerMask _l

kkln2486.tistory.com

 

 

보완할 점

  • 적, 동료 애니메이션 전환 시 부자연스러운 부분이 있음
  • 적, 동료 전투시 Player가 개입하지 않으면 가만히 서로를 향해 총 공격만 함

 

 

트러블 슈팅


1.  Attack 상태 반복

 

 

주위에 적이 없을 때, Idle 상태가 아닌 Attack 상태가 반복되는 버그 발견

 

[SerializeField] private Collider[] _targets;
public float Distance { get; private set; }

private void Start()
{
	StartCoroutine(COTargetting());
	Distance = -1
}

private void Update()
{
    if (Target == null) Distance = -1;
    else Distance = (Target.transform.position - transform.position).magnitude;
}

IEnumerator COTargetting()
{
    while(true)
    {
        Targetting();

        yield return new WaitForSeconds(1f);
    }
}

private void Targetting()
{
    int layerMask = (1 << _layerMask);
    _targets = Physics.OverlapSphere(transform.position, 50f, layerMask);

    foreach (Collider enemy in _targets)
    {
        if (Target == null) Target = enemy.gameObject;
        else
        {
            if (SqrDistance(enemy.gameObject) <= SqrDistance(Target.gameObject)) Target = enemy.gameObject; 
        }
    }
}

private float SqrDistance(GameObject enemy)
{
    return (enemy.transform.position - transform.position).sqrMagnitude;
}

 

주위 콜라이더 판별은 코루틴으로 1초마다 실행하도록 했다. 게임 시작 시, 판별 전이므로 Distance에 -1을 할당하고 Update문에서 적이 있다면 가장 가까운 적의 Distance를 계속 할당했다.

 

 

private void Update()
{
    if (Target == null) Distance = -1;
    else Distance = (Target.transform.position - transform.position).magnitude;
}

 

위 코드로 동료가 적을 죽이면 Target이 null이 되고, Distance가 -1이 되어야 하는데 인스펙터 창에서 확인을 해보니, Distance 값이 변화가 없었다. 아마도 적이 죽어도 GameObject 자체는 파괴되지 않아서 그런 것 같다. 

 

 

private void Update()
{
    if (_targets.Length == 0) Distance = -1;
    else Distance = (Target.transform.position - transform.position).magnitude;
}

 

그래서 코드를 주변 적 콜라이더를 담는 _targets의 길이가 0이 될 때, Distace를 -1로 설정하는 것으로 수정했다.

 

 

 

해결 완료!

 

 

오늘의 회고


처음부터 동료에 대한 로직을 적과 동일하게 구상을 해서 생각보다 많이 어렵지는 않았다. 오히려 알맞은 캐릭터 에셋과 애니메이션을 구하는데 어려웠다. 추가로 동료는 Player를 공격하지 않고 적을 공격해야 하기 때문에 Target을 설정해주었고, 추가적인 약간의 코드 수정만 했다. 동료 구현도 어느정도 완료를 했기 때문에 적과 동료에 공통적으로 나타나는 버그들을 수정하도록 하겠다!

'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글

Unity_2기 11주차 (230119)  (0) 2024.01.19
Unity_2기 11주차 (230118)  (0) 2024.01.18
Unity_2기 11주차 (230116)  (0) 2024.01.16
Unity_2기 11주차 (230115)  (0) 2024.01.15
Unity_2기 10주차 (230112)  (0) 2024.01.12