12.01 - TIL

김혁·2025년 12월 1일

TIL

목록 보기
68/84

오늘의 코드카타

  • 공 이동 시뮬레이션
    • 쿼리에 기록되어 있는 방향과 거리만큼 이동했을 때, 특정 지점에 도달하는 공의 개수 구하기
    • 문제의 특이한 점은 공이 벽에 있어도 벽 쪽으로 이동할 수 있다는 가정이다. 이를 통해 왼쪽 벽에 붙어있더라도 왼쪽으로 갈 수 있으니, 지점에 도달할 수 있는 공의 개수가 늘어난다는 점이다.
    • 모든 지점에서 공을 출발시키는 것은 시간초과가 발생하기 때문에 도착점에서 출발해서 가능한 공의 범위 기반으로 계산을 하는 것이 가장 효율적인 것으로 보인다.
    • https://school.programmers.co.kr/learn/courses/30/lessons/87391

오늘의 공부

팀 프로젝트 진행 내용

1. 공격 로직 설계

  • AI 공격 로직 흐름 : AI 공격 몽타주 재생
    -> 몽타주 내에서 노티파이 스테이트를 통해 공격 범위 및 공격 타이밍 지정하고, 공격하는 GA_MeleeAttack 실행
    -> GA_MeleeAttack 내에서 캐릭터에게 데미지 GE 실행 및 피격 Gameplay Event 전송 (태그 기반)
    -> 캐릭터에서 Event와 바인딩을 해서 피격 Event 발생 시에 공격받는 몽타주 실행
  • 위의 로직은 하나의 컴포넌트에서 처리할 예정이고, AI와 캐릭터 모두에게 적용되게 할 것이다.

2. 발소리 사운드 설정

  • 패키징을 통해 테스트를 진행해봤는데, 플레이어 간의 거리가 멀어도 발소리 등의 소리가 너무 크게 들렸다. 해당 경우를 해결하기 위해 사운드 어테뉴에이션을 적용해서 플레이어 간의 사운드를 조절하고자 했다.
  • 사운드 어테뉴에이션의 거리가 정확하게 감이 안 잡혀서 임시로 액터를 만들어서 거리를 측정했고, 이를 기반으로 에셋을 제작했다.
  • 발걸음 소리의 경우는 아래와 같이 내부 반지름은 400, 감쇠거리는 1000으로 지정을 했다.
  • Walk, Run 같은 동작의 경우에는 해당 어테뉴에이션을 적용했다.
  • 점프나 파쿠르 동작 시의 손 짚는 소리 등의 경우는 발걸음만큼 크지 않아야 하기 때문에 별도의 사운드 어테뉴에이션을 적용했다.
  • Jump, Land, Handplant, Scuff, Tumble 동작의 경우에는 해당 어테뉴에이션을 적용했다.

3. Sprint 동작으로 스태미나 0 도달 시에 버벅이는 동작 수정

  • Sprint 동작은 현재 GAS를 통해 제작을 했는데, 스태미나가 0이 되면 달리는 동작이 캔슬되고, 리젠 효과로 인해 스태미나가 다시 일정치 상승을 하고, Sprint 동작을 계속 시도하면 스태미나가 감소하면서 버벅이는 현상이 존재했다.
  • 이를 해결하려고 처음에는 0에 도달하면 지치는 애니메이션을 실행하려고 했는데, 임시로 그렇게 생각을 했다보니 애니메이션 에셋이 존재하지 않았다. 따라서 다른 방식으로 해당 문제를 해결했다.
  • 현재는 Attribute Set의 데이터를 델리게이트로 바인딩을 해서 0에 도달하면 해당 Ability가 끝나게끔 했다. 이를 이용해서 0에 도달하면 LockOut으로 제한을 걸고, 임계값에 도달하면 다시 Sprint를 할 수 있게끔 구현하고자 했다.
  • 임계값인 스태미나는 나중에 아이템으로 인해 증가할 수 있기 때문에 퍼센트로 접근했다.
void UAO_GameplayAbility_Sprint::OnStaminaChanged(const FOnAttributeChangeData& Data)
{
	if (Data.NewValue <= 0.f)
	{
		bIsStaminaLockOut = true;
		
		K2_EndAbility();
	}
}

void UAO_GameplayAbility_Sprint::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
                                                 const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
                                                 const FGameplayEventData* TriggerEventData)
{
	...

	const UAO_PlayerCharacter_AttributeSet* AttributeSet = Character->GetAbilitySystemComponent()->GetSet<UAO_PlayerCharacter_AttributeSet>();
	if (!AttributeSet)
	{
		EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
		return;
	}

	const float CurrentStamina = AttributeSet->GetStamina();
	const float MaxStamina = AttributeSet->GetMaxStamina();

	// 현재 스태미나가 최대 스태미나의 임계값만큼 도달하지 못한 경우
	if (bIsStaminaLockOut && CurrentStamina < MaxStamina * RequiredStaminaPercent)
	{
		EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
		return;
	}

	if (bIsStaminaLockOut && CurrentStamina >= MaxStamina * RequiredStaminaPercent)
	{
		bIsStaminaLockOut = false;
	}
	
    // 기존 로직
	Character->StartSprint_GAS(true);

	Character->GetAbilitySystemComponent()->GetGameplayAttributeValueChangeDelegate(AttributeSet->GetStaminaAttribute())
		.AddUObject(this, &UAO_GameplayAbility_Sprint::OnStaminaChanged);
	
}

오늘의 CS

Windows에서 메모리 구조 확인하기

VMMap

  • 윈도우즈에서 활용할 수 있는 프로세스 가상 및 실제 메모리 분석 유틸리티
  • 운영 체제에서 해당 유형에 할당한 물리적 메모리의 양뿐만 아니라 프로세스의 커밋된 가상 메모리 유형에 대한 분석을 보여줌
  • 유용한 경우
    • 메모리 누수 진단 : 특정 작업을 반복 수행한 후 스냅샷을 비교하여 Private Data 영역이 해제되지 않고 증가하는 것을 시각적으로 판단 가능
    • 메모리 파편화 분석 : 할당된 작은 메모리 블록들이 가상 주소 공간에 넓게 퍼져 있어 비효율적인 메모리 사용 패턴을 확인할 수 있음
    • 리소스 과다 사용 확인 : 너무 많은 스레드가 생성되너 스택 메모리를 과도하게 점유하는 경유를 확인할 수 있음

Image 영역

  • Image 영역은 실행 중인 프로세스의 코드와 정적 데이터를 포함하고 있는 핵심적인 메모리 영역
  • 주요하게 text, data, bss 등의 내용들이 묶여있는 영역임
  1. Text (코드 영역)
    • 프로그램의 기계어 코드가 저장됨
    • 읽기 전용 : 코드는 실행 중에 변경되어서는 안 되므로, 읽기 전용으로 보호됨
    • 공유 가능 : 같은 라이브러리(.dll)을 사용하는 여러 프로세스 간에 이 영역을 공유할 수 있음
  2. Data (초기화된 데이터 영역)
    • 프로그램이 시작될 때 명시적으로 초기화 값을 가진 전역 변수와 정적 변수가 저장됨
    • 읽기/쓰기 가능 : 프로그램 실행 중 값이 변경될 수 있음
  3. BSS (초기화되지 않은 데이터 영역)
    - 프로그램이 시작될 때 초기화되지 않은 전역 변수와 정적 변수가 저장됨
    - 0으로 초기화 : 프로그램이 로드될 때 이 영역을 모두 0으로 초기화함
    - 효율성 : BSS 영역은 디스크의 실행 파일에는 실제 값을 저장할 필요가 없어 파일 크기를 줄이는 역할을 함

profile
게임 개발자를 향해..

0개의 댓글