강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

seo_0915님의 프로필 이미지
seo_0915

작성한 질문수

실전! 언리얼 소울라이크 개발: A to Z

방어구 시스템 구현

방어구 시스템 구현 질문

작성

·

41

·

수정됨

0

강사님이 타이핑해주신 SetArmour함수에 궁금한 부분이 있어 질문합니다. PickupItem destory로 처리한 후 ArmourMap[ArmourType] = NewArmour;로 처리해주셨는데. 따로 Remove를 추가 안 하신 이유가 궁금합니다. 만약 이 흐름으로 진행된다면 59번 줄에서 false처리로 되어 큰 영향은 없어 보이지만 조금 의문이 들어 문의 남깁니다.

image.png

 

답변 3

0

seo_0915님의 프로필 이미지
seo_0915
질문자

답변 감사합니다. 강사님이 작성해주신 내용을 보고 바로 궁금증이 풀렸습니다!

0

Spector님의 프로필 이미지
Spector
지식공유자

안녕하세요!

첨부해주신 스크린샷을 보고 설명드리면, 해당 코드는 ArmourMap에서 같은 부위의 방어구가 있는지 확인합니다.

있을 경우:

  • PickupItem으로 만들어서 바닥에 떨어뜨리고, ArmourMap의 해당 key(슬롯)에 있는 방어구를 NewArmour로 교체합니다

없을 경우:

  • ArmourMap에 해당 방어구 타입에 대한 key/value가 존재하지 않기 때문에 ArmourMap.Add(ArmourType, NewArmour)로 새로운 key을 생성하여 NewArmour를 할당합니다

질문해주신 내용을 쉽게 설명드리자면, 기존에 같은 슬롯에 다른 방어구가 있는 상황에서 굳이 슬롯을 삭제했다가 다시 생성해서 NewArmour를 복사할 필요는 없습니다.

이미 존재하는 슬롯의 값만 변경하는 것(ArmourMap[ArmourType] = NewArmour)이 Remove() 후 Add()를 사용하는 것보다 성능상 더 효율적입니다.

 

void UDS1CombatComponent::SetArmour(ADS1Armour* NewArmour)
{
    const EDS1ArmourType ArmourType = NewArmour->GetArmourType();

    // 이미 같은 부위에 장착된 방어구가 있으면 PickupItem으로 떨군다.
    if (ADS1Armour* EquippedArmourPart = GetArmour(ArmourType))
    {
        if (IsValid(EquippedArmourPart))
        {
            ...
            // 픽업 아이템 생성
        }

        ArmourMap[ArmourType] = NewArmour;
    }
    else
    {
        ArmourMap.Add(ArmourType, NewArmour);
    }
}

그리고 if (ADS1Armour* EquippedArmourPart = GetArmour(ArmourType)) 구문에 의해서 해당 방어구타입에 대한 key(슬롯)가 존재한다는 것이 보장되기 때문에

ArmourMap[ArmourType] = NewArmour 구문은 안전합니다.

 

그럼 좋은 하루 되세요~

 

 

0

안녕하세요, 인프런 AI 인턴입니다. seo_0915님.

질문해주신 SetArmour 함수의 동작과 관련하여, ArmourMap에서 특정 방어구를 제거하지 않는 이유에 대한 궁금증을 가지고 계신 것 같습니다. 이러한 상황은 일반적으로 현재 착용 중인 방어구를 다른 방어구로 교체할 때 자동으로 처리가 되기 때문입니다.

함수의 동작 메커니즘

  • ArmourMap[ArmourType] = NewArmour: 이 부분은 새로운 방어구를 추가하거나 교체하는 역할을 합니다. 기존의 방어구가 맵에 남아있는 것이 아니라, 맵의 해당 위치에 새로운 방어구가 덮어씌워지게 됩니다.

  • Remove 호출 필요성 부재: 대부분의 경우, Remove 함수는 특정 조건 하에 아이템을 회수 또는 제거할 수 있도록 구현됩니다. 그러나, 방어구 같은 경우, 기존의 것을 새 것으로 덮어쓰는 방식으로 처리되기 때문에 별도의 삭제가 필요하지 않을 수 있습니다.

코딩 방안

  • 리소스 관리: 이미 메모리에 할당된 리소스를 잘 관리하고 싶다면, 새로운 방어구 장착 시 이전 방어구에 대한 메모리 해제나 클린업이 필요할 수 있습니다. 그렇지 않으면, 특정 조건 하에서 메모리 누수가 발생할 수 있습니다.

이러한 설계는 작성하신 코드의 논리 흐름에서 존재하는 메커니즘에 따르는 것이며, false 처리 여부가 작동에 직접적인 영향을 미치지 않는 경우가 많습니다. 다만, 장기적으로 시스템의 안정성과 관리 효율성을 고려하여 메모리 관리 측면을 살펴보는 것이 좋습니다.

관련된 구현 방법이나 예제 코드 개편의 필요성을 느끼시면, 다른 유사한 질문 및 답변을 참조하실 수도 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

seo_0915님의 프로필 이미지
seo_0915

작성한 질문수

질문하기