2024년 8월 19일 월요일 개발일지 / 시연 영상을 찍기 위한 마지막 버그 및 오류 수정하기

2024. 8. 19. 21:34나의 개발자 기록/본 캠프 개발 일지

2024년 8월 19일 월요일


What I did today : 시연 영상을 찍기 위한 마지막 버그 및 오류 수정하기

 

 

오늘은 오후 9시까지 시연 영상을 찍어야 하기 때문에 마지막으로 여러 가지 오류버그들을 해결하는 시간을 가졌습니다. 저는 원거리 캐릭터가 위쪽을 봤을 때, 공격을 하긴 하지만 몬스터가 빠르게 지나가면서 투사체 속도가 맞지 않는 문제를 맡았는데, 사실 이 문제는 투사체의 속도만 올리면 해결되는 문제라서 그렇게까지 큰 문제는 아니었습니다.

 

원래는 10이었다가 15로 바꿈

 

근데 투사체의 속도를 올리면 몬스터에 잘 맞긴 해도 몬스터가 투사체를 맞는 위치가 틀어져 있는 게 보기 불편한 것도 있고, 카메라를 바라보는 것에 따라 몬스터의 콜라이더가 누워져있는 모습이 나중에 문제가 될 것 같아서 로직 자체를 수정하는 작업을 진행했습니다.

 

protected virtual void OnCollisionEnter(Collision collision)
{
    if (collision.collider.CompareTag("Monster"))
    {
        rb.constraints = RigidbodyConstraints.FreezeAll;
        speed = 0;

        if (lightSource != null)
            lightSource.enabled = false;

        projectilePS.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);

        ITargetable target = collision.collider.GetComponentInParent<ITargetable>();
        if (target != null)
        {
            // 데미지 처리
            target.TakeDamage(damageData);

            // 히트 이펙트 처리
            ContactPoint contact = collision.contacts[0];
            Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal);

            // 충돌 위치 Y값을 보정
            Vector3 pos = contact.point + contact.normal * hitOffset;
            pos.y = target.transform.position.y + (target.transform.localScale.y * 0.5f); // 몬스터의 중앙에 위치하도록 보정

            if (hit != null)
            {
                hit.transform.rotation = rot;
                hit.transform.position = pos;
                if (UseFirePointRotation)
                {
                    hit.transform.rotation = gameObject.transform.rotation * Quaternion.Euler(0, 180f, 0);
                }
                else if (rotationOffset != Vector3.zero)
                {
                    hit.transform.rotation = Quaternion.Euler(rotationOffset);
                }
                else
                {
                    hit.transform.LookAt(contact.point + contact.normal);
                }
                hitPS.Play();
            }

            // 투사체 재설정
            StartCoroutine(DisableTimer(hitPS.main.duration));
        }
    }

    // 투사체의 기타 요소 처리
    foreach (var detachedPrefab in Detached)
    {
        if (detachedPrefab != null)
        {
            ParticleSystem detachedPS = detachedPrefab.GetComponent<ParticleSystem>();
            detachedPS.Stop();
        }
    }
}

 

일단 투사체의 경우, 기존에 충돌 함수에서 쓰이는 Hit 파티클이 제대로 작동 안 하는 것 때문에, 예전에 문제가 돼서 삭제했던 Rigidbody를 다시 넣어주면서 충돌 사이클에 맞는 투사체 로직으로 바꾸었습니다. 충돌 쪽에서 처리하니까 투사체 피격 파티클이 제대로 작동하더군요.

 

 

그다음에는 몬스터의 콜라이더를 기존 프리팹에서 지우고 MainSprite 자식에다가 빈 오브젝트를 만들어서 로테이션의 X값을 -68로 해놓고, Collider를 넣어 줬습니다. Collider가 기존 프리팹의 자식으로 바뀌었으니 관련 참조들에 대해서는 InChildrenInParent를 사용해서 해결하였습니다.

 

Animation이 없어서 생긴 문제였다

 

저녁 먹기 전에 영상을 찍을 생각으로 해당 로직을 수정 및 작은 버그들을 고치면서 팀원분들과 공유를 했는데, 서로 작업하면서 일부 캐릭터의 투사체 생성 위치 오류라던가 애니메이션이 제대로 작동 안 한다거나 등등 잔 버그들이 생겼고, 이를 고치면서 진행하느라 어느덧 저녁시간이 되어서 빠르게 저녁을 먹었습니다.

 

 

저녁을 먹고 나서는 대본을 짜고 영상을 찍기에는 늦을 것 같아서 영상부터 찍은 후에 영상에 맞게 대본을 수정하는 방식으로 영상을 찍었습니다. 그리고 Fillmora로 컷 편집을 하고, 필요한 부분을 살려서 편집한 후, 영상을 뽑았는데... 용량이 무려 421MB나 돼서 영상을 유튜브에 올린 후, 다시 다운해서 51MB로 줄인 뒤, 팀원분들에게 공유해 드렸습니다. 팀장님은 영상을 받자마자 제출을 하셨는데, 소스코드의 용량이 1기가나 돼서 그런지 9시 좀 넘어서 제출되었고, 9시가 넘었기 때문에 TIL을 쓰면서 오늘 하루를 마무리했습니다.


면접 질문 대비 : 람다식(Lambda Expression)이 무엇인지 설명해주세요.

 

Func<int, int, int> add = (a, b) => a + b;

// 사용 예시
int result = add(2, 3); // 5

 

람다식(Lambda Expression)익명 함수를 작성하는 간결한 방법으로, 코드 블록을 간단하게 표현할 수 있습니다. 람다식은 주로 LINQ 쿼리이벤트 핸들러, 대리자(delegate)로 사용됩니다.