인벤토리 컨테이너(InventoryContainer)의 AddItem/MergeSlot 메서드를 구현하면서, "성공 여부"와 "실제 처리된 수량"을 동시에 반환해야 하는데 에디터가 경고를 띄우는 문제를 발견하고 해결했음
AddItem은 인벤토리가 가득 차서 일부만 추가된 경우를 호출부가 구분할 수 있어야 해서, 처음엔 값을 두 개 반환하도록 짰음
-- AddItem 내부
return isFullySucceeded, totalAdded -- success, amount 두 값 반환
Lua는 애초에 return a, b처럼 값 여러 개를 한 번에 반환하는 걸 언어 차원에서 기본 지원한다. 그래서 이 문법 자체를 쓰는 데는 아무 문제가 없다고 생각하고 그대로 짰음
문제는 MSW 에디터에서 메서드를 정의할 때, Return 타입 설정란은 boolean 하나만 선택해둔 상태였다는 것. 매개변수는 "Add Parameter" 버튼으로 여러 개를 자유롭게 추가할 수 있어서, Return도 당연히 같은 방식으로 여러 개 선언할 수 있을 거라 생각했는데, 실제로 확인해보니 Return 쪽에는 그 "추가" 버튼 자체가 없었음
그 상태로 호출부에서 값 두 개를 받으니 에디터가 경고를 띄웠음
local success, addedAmount = self._T.container:AddItem(itemId, amount, maxStack)
-- ⚠️ 리턴값이 1개인데 변수 2개에 할당하려 함
경고가 뜨는 게 "정말 두 번째 값이 유실된다"는 뜻인지, 아니면 "타입 선언과 실제 반환 개수가 안 맞는다"는 정적 경고일 뿐인지가 불확실했음. Lua 언어 자체는 다중 반환을 지원하는 게 맞지만, MSW의 mLua 에디터가 메서드 하나당 함수 몸통(Code)만 코드로 작성하고, 실제 함수 시그니처(function Name(...))는 에디터가 Name/Arguments/Return 설정을 조합해 자동으로 생성하는 구조라, 이 자동 생성된 시그니처가 선언된 Return 타입 개수로 강제되는지가 관건이었음
말로 추측하지 않고 별도의 임시 테스트 컴포넌트를 만들어 직접 실측함
-- TestFunc, Return 타입은 boolean 하나만 선언
return true, 999
-- OnBeginPlay (server only)
local success, extra = self:TestFunc()
log(success)
log(extra)
콘솔에 true와 999가 둘 다 정상적으로 찍힘을 확인함. 즉 mLua 자체가 다중 반환을 막는 게 아니라, 에디터의 Return 타입 선언란(UI)이 1개 슬롯만 제공할 뿐이고, 그 밑에서 실제로 실행되는 Lua 런타임은 선언된 개수와 무관하게 다중 반환을 그대로 통과시킴. 경고는 "타입 선언과 실제 동작이 다르다"는 정적 경고였을 뿐, 실행에는 문제가 없었음
동작 자체는 문제없지만, 선언(boolean 하나)과 실제 반환(두 값)이 다른 채로 두면 나중에 코드를 다시 볼 때(또는 다른 사람이 볼 때) 두 번째 값의 존재를 코드를 직접 열어보기 전엔 알 수 없고, 호출할 때마다 경고도 계속 떠서 정리하기로 함
값 두 개를 각각 반환하는 대신, success/amount 필드를 가진 InventoryUpdateResult라는 StructType 하나를 만들어 통째로 반환하도록 변경함
-- InventoryUpdateResult (StructType)
-- success: boolean, amount: integer
-- AddItem
local result = InventoryUpdateResult()
result.success = (remaining == 0)
result.amount = totalAdded
return result
Return 타입도 InventoryUpdateResult 하나로 선언하니 실제 반환값과 정확히 일치해서 경고가 사라짐. AddItem과 MergeSlot이 둘 다 "성공 여부 + 처리 수량"이라는 같은 모양의 결과가 필요해서, 타입 하나를 공유해 중복도 줄임
success/amount 두 값이 반환된다는 게 드러남AddItem, MergeSlot이 같은 결과 타입을 공유해 별도 타입을 두 개 만들 필요가 없어짐