11.28 - TIL

김혁·2025년 11월 28일

TIL

목록 보기
67/84

오늘의 코드카타

  • 2차원 동전 뒤집기
    • 같은 줄에 있는 모든 동전을 뒤집어야 할 때, 최소 횟수로 목표하는 상태로 만들기
    • 그리디하게 0번째 행과 열을 기준으로 할 시에 최솟값이라고 보장할 수 없기 때문에 완전탐색을 실행해야 함
    • 나는 행을 기준으로 특정 행을 뒤집고, 안 뒤집고를 dfs를 통해 구현함
    • 마지막 행이 되면, 첫 번째 행의 값을 기준으로 열을 뒤집을지 안 뒤집을지 판단해서 목표와 비교
    • https://school.programmers.co.kr/learn/courses/30/lessons/131703

오늘의 공부

팀 프로젝트 진행 내용

1. 공격 노티파이 정상적으로 동작하는지 확인

  • 어제 추가한 공격 몽타주에 정상적으로 데미지가 적용되는지 확인하기 위해 위와 같은 로직으로 몽타주를 실행시켰다.
  • 근데 에디터 환경(서버)에서는 노티파이가 실행은 되지만, PerformMeleeDamage()가 실행되지 않아서 디버그용으로 설정한 Trace 동작과정이 보이지 않았다.
  • 그리고 클라에서는 PerformMeleeDamage()가 두 번 실행되서 서버의 캐릭터가 공격을 두 번 받는 상황이 생겼다.
  • 사람을 3개로 늘려서 테스트를 해보니까 노티파이 실행이 3번이 되고, 모든 곳에서 PerformMeleeDamage() 함수가 정상적 실행이 되지 않았다.

원인 추측

  • 공격하는 몽타주는 캐릭터의 이동이 있을 것으로 보여서 Root Motion을 설정했기 때문에 서버와 클라 모두에서 실행시켜주기 위해 위와 같은 로직으로 작성했는데, 서버와 클라에서 모두 실행시켜서 노티파이를 2번 보내는데 서버를 검사하는 로직이 없어서 2번 발동하나 싶었다.
void UAO_DamageComponent::PerformMeleeDamage(TSubclassOf<UGameplayEffect> DamageEffectClass, float DamageAmount,
                                             FVector TraceStart, FVector TraceEnd, float TraceRadius)
{
	if (!GetOwner()->HasAuthority())
	{
		AO_LOG_NET(LogKH, Warning, TEXT("PerformMeleeDamage called from non-authority actor"));
		return;
	}
    ...
}

-> 근데 해당의 경우를 테스트하기 위해서 서버를 검사하는 로직에서 확인을 해보니 서버에서 실행할 때, 해당 검사에 걸리는 경우가 있었다. 서버에서 실행을 노티파이는 정상적으로 작동을 하는데, !HasAuthority()에 걸리는 것은 뭔가 이상하다고 생각을 해서 다양한 테스트를 해봤다.

  • 그래서 처음에는 서버에서만 아예 PerformMeleeDamage()를 실행시키기 위해서 노티파이에서 Server가 아니라면 ServerRPC를 통해 데미지 로직을 서버로 보내버리게끔 했다.
    -> 하지만 동일한 오류가 발생했다.
  • 클라를 하나 더 추가해서 3개를 사용했더니 로그가 3개 나오는게 뭔가 이상하다고 생각을 했다. 동작한 클라와 서버에서만 로그가 나와야지 정상이 아닌가라는 생각을 했다.
    -> 그렇다면 클라와 서버가 하나의 프로세스에서 돌아가서 뭔가 충돌이 발생하는 건가 라는 생각을 했다. 따라서 Editor Preferences에 있는 Run Under One Process 옵션을 확인했더니 해당 옵션이 켜져있었다.
    -> 멀티 테스트를 할 때는 항상 해당 옵션을 꺼야 된다는 사실을 잠시 망각했던 것 같다...

2. 에셋 찾기 및 패키징

  • 오늘 블랙프라이데이로 다양한 에셋을 할인하길래 일주일 내내 회의해서 살 에셋을 명확히 정해서 프로젝트에 추가하기로 했다.
  • 플레이어는 피격, 사망 애니메이션이 추가되었고, 관련 발자국 VFX, 사운드도 추가됐다.
profile
게임 개발자를 향해..

0개의 댓글