Last Canary 19일차(범용적 기믹 클래스)

김재혁·2025년 6월 4일

기획 의도

목표 : 여러 맵에서 범용적으로 재사용 가능한 구조로 기믹 시스템 구축하기

  • 맵마다 컨셉이랑 구조가 달라 기믹의 컨셉은 달라지겠지만 결국 로직 자체는 비슷하다는 결론을 지어 이런 구조 결정

클래스 구조

LCBaseGimmcik : 공통 베이스 클래스

  • 메쉬, 사운드 쿨타임 타겟 트리거링등 기본 기능 구현
  • 자동 복귀 / 상태 유지 선택 가능

LCRotationGimmcik : 회전기믹 클래스

  • 지정하는 각도로 회전하는 기능
  • 회전 보간 처리

LCLocationGimmcik : 이동기믹 클래스

  • 지정하는 위치로 이동하는 기능
  • 이동 보간 처리

주요 구조 설계

1) 기능 작동은 Server 기준 : 모든 상호작용은 서버에서 실행되고 클라이언트는 요청만 수행

2) Multicast 연출 : 이동 / 회전은 모두 Multicast로 클라이언트 동기화

3) 타겟 트리거 : LinkedTargets을 통해 라인트레이스로 감지 후 상호 작용

4) 보간 방식 : Tick이 아닌 TimerManager를 사용해 보간

5) 모든 수치값이나 사용 여부는 에디터에서 수정가능하게 작성

트러블 슈팅

1) 시각적 보간 미적용

  • 회전이나 이동 시 캐릭터나 오브젝트가 부드럽게 움직이지 않고, 방향이 순간적으로 바뀌는 느낌이 들었음.
    -특히 Listen Server 화면(=호스트)에서 보간이 아예 적용되지 않아 시각적 괴리 발생.

원인

  • 회전/이동은 Multicast 함수로 전체 클라이언트에 전파했지만,
  • 내부 로직에서 HasAuthority() 조건문이 있어 Listen Server에서는 보간이 실행되지 않았음.

해결책

  • HasAuthority() 대신 IsRunningDedicatedServer() 사용하여 Listen Server도 포함하도록 조건 수정
    -> (HasAuthority() -> 서버는 항상 true / IsRunningDedicatedServer() → 전용 서버만 true, Listen Server는 false)
  • 회전이나 이동 시 보간을 넣어줘서 자연스러운 움직임이 나오게끔 보완

- 서버랑 클라이언트 둘다 해줘야 Host쪽도 자연스러움이 나옴

2) 클라이언트에서 상호작용이 안되는 문제

  • 가장 시간을 많이 잡아먹던 문제였음
  • 서버쪽에서는 상호작용도 되고 회전하는게 클라이언트 화면에서도 잘 보였지만 막상 클라이언트 화면에서 상호작용을 하면 로직이 동작을 안함
  • 로그 확인 결과 Server_InteractWithGimmick_Implementation()에는 진입하지만 내부에서 Interactor == nullptr로 판단되어 로직이 강제 종료됨

원인

  • Unreal의 Server RPC 구조상 꼭 필요한 전제 조건이있음

  1. 서버에 해당 Target 액터가 유효할것

2. 해당 엑터의 Owner가 존재할 것

하지만 Owner를 지정할 수 없었음.. 왜냐 -> Overlap 기믹은 사용하지 않았기 때문에 굳이 지정을 해주지 않아도 로직이 동작할수 있다고 생각했기 때문(이 생각때문에 하루를 날렸음...)

해결 방안

1)

  • 캐릭터 담당분께 상황을 설명드리고 컨트롤러에서 명시적으로 SetOwner(this) 호출
    -> 그 후 확인 결과 Interact함수는 호출되나 Cast시도 시 nullptr이 발생하고있음
  • 에디터에 배치된 액터는 기본적으로 Owner == None이라고 함 그렇기 때문에 서버는 누가 상호작용을 했는지 알 수가 없게됨..

2)

  • 기믹 내부에서는 GetOwner()를 기반으로 안전하게 Cast해서 Owner를 지정

추후 도전할 기능

  • 협동/경쟁 구조 기반 퍼즐 : 두 플레이어가 동시에 다른 핸들을 돌려야 문이 열림
    -> 타이머로 몇초 안에 둘다 사용되면 성공? Manager를 만들어서 관리해야할듯
  • 이동의 다양화 : 직선 이동이 아닌 커브나 경로 기반 이동
    -> Spline을 깔아서 그걸 기반으로 움직이게끔?
  • 조건부 활성화 : 열쇠 획득, 특정 아이템 사용, 미션 완료 시 기믹 사용 가능
    -> 열쇠를 만들고 플레이어 상태에 열쇠 유무를 저장? 기믹 시 유무를 판단할수 있게?
  • 연속 트리거 / 체인 반응 구조 : 하나의 기믹이 다른 기믹을 자동으로 연쇄 실행 -> 시간차를 둬서 자연스럽게 하는 방법이 가장 쉽긴할듯

0개의 댓글