TIL(64)

이채원·2026년 9월 30일

TIL

목록 보기
66/73
  • 로비 배경화면 마우스 따라서 움직임 부여

  • 전투로직

무기마다 개별 액터를 생성하지 않고 UCombatComponent라는 단일 컴포넌트로 독립적으로 설계했습니다. 사격이나 재장전을 할 때마다 인벤토리 컴포넌트와 실시간으로 연동해가지고 지금 장착 중인 총 종류나 데미지, 탄약 갯수 같은 데이터를 동적으로 불러오게 했습니다.
그리고 타격 판정은 LineTrace를 활용해서 레이캐스트가 적중하면 대상의 태그나 클래스를 검사해서, 좀비를 맞췄을 때와 벽을 맞췄을 때의 타격이펙트를 다르게 출력하도록 분리했습니다.

무기마다 개별 액터를 생성하지 않고 단일 컴포넌트로 독립적으로 설계한 가장 큰 이유는 무기를 개별 액터로 만들면 무기를 교체할 때마다 기존 액터를 파괴하고 새 액터를 메모리에 스폰해야하니까 객체지향적으로 하고 싶어서 이렇게 컴포넌트로 설계했습니다. 새로운 무기가 추가되더라도 코드 수정 없이 데이터만 추가하면 되도록 설계했습니다.)

  • 누워있던 시체 일어나는 점프스퀘어

    시체 부활 점프스퀘어는
    먼저 BeginPlay에 할당한 좀비 행동 트리를 멈추게 해서 시체처럼 보이도록 했습니다. 그리고 투명한 박스 콜리전을 설치하고 델리게이트를 바인딩해가지고 총알이나 다른 AI가 지나갈 때 오작동하지 않도록 Cast로 오직 플레이어에게만 반응하게끔 했습니다.
    트리거가 작동하면 좀비를 깨워서 추격을 시작하고, 발동 직후에는 버그나지 않게 트리거 액터 자체를 Destroy()로 없앴습니다.

  • 정전형 귀신

    시작되면 화면을 돌려서 회피하는 걸 못하게 하고 싶어서 PlayerController를 통해 플레이어의 이동과 시선 입력을 차단하고 그다음에 switch-case문으로 귀신이 다가오는 8단계를 구현하고 TimerManager로 조명이 깜빡이는 딜레이에 맞춰 귀신의 트랜스폼만 단계적으로 앞당겨 배치해서 만들었습니다.

  • 멀리서 문 닫히는 소리 페이크(단발성)

  • 여자 아이 콧노래 소리 페이크(지속성)

    페이크 사운드
    이 두개는 하나의 클래스에서 모두 처리하도록 만들었는데 문소리는 소리 재생 후 바로 액터를 삭제해서 메모리를 최적화했고, 여자아이 노랫소리는 플레이랑 스톱 이렇게 두 개의 박스 콜리전을 분리해서 플레이어가 이동하는 거에 따라 소리가 켜지고 꺼지도록 했습니다.
    그리고 소리가 꺼질 때 갑자기 뚝 끊기면 몰입이 깨질 거 같아서 FadeOut 연출을 적용했는데요. 액터가 바로 삭제될 때 소리가 잘리지 않게 Destroy 함수 대신 SetLifeSpan 함수를 사용했습니다.

  • 아이템 획득 후 뒤에서 좀비 스폰

    단순하게 그냥 등 뒤 좌표에 좀비를 스폰시키면 계단이나 경사로에서 좀비가 바닥에 파묻히거나 공중에 뜨는 버그가 있었어서 스폰 위치 위아래로 레이캐스트를 쏴서 바닥 Z 좌표를 찾고, 좀비 캡슐의 절반 높이를 더해 어떤 지형에서도 잘 스폰되도록 처리했습니다.
    그리고 이제 좀 더 놀라게 만들고 싶어서 PlayerController를 통해 화면이 흔들리는 카메라 셰이크 연출을 더했습니다.

  • 우는천사

    우는 천사 기믹은 '시야 판정'과 '상태 및 데미지 제어'에 중점을 두고 구현했습니다.
    먼저 카메라 전방 벡터와 우는 천사의 방향 벡터를 내적해서 60도 시야각을 계산하고, 레이캐스트(LineTrace)를 쏴서 장애물에 가려졌는지까지 이중으로 매 프레임 검증하는 로직으로 작성했습니다. 그래서 시야에 들어오면 즉시 이동 속도를 0으로 만들고 반대로 시야에서 사라지면 (FindLookAtRotation으로) 플레이어 쪽을 즉각 바라보며 다시 쫓아오게 만들었습니다.
    일반적인 총격으로는 죽지 않게 TakeDamage에서 데미지를 무시하도록 처리했고, BeginOverlap에서 플레이어와 닿을 때 즉사하도록 했습니다.
    우는 천사 기믹을 만들 때 정밀한 시야 판정을 구현하는 것이 가장 어려웠습니다. 처음에 카메라 전방 벡터와 우는천사 방향 벡터의 내적만 계산해서 60도 시야각 안에 있는지를 판정했했는데 이렇게 하니까 시야각 안이긴 한데 벽 뒤에 가려져서 플레이어 눈에는 안 보일 때도 멈춰버리는 오류가 발생했습니다.
    판정 로직을 이중으로 나눠가지고 1차로 내적을 통해 시야각 검사를 하고, 조건이 맞으면 2차로 LineTrace를 쏴서 벽 같은 장애물이 있는지 충돌 검사를 추가해서 해결했습니다.

profile
초보 개발자

0개의 댓글