[task] | two_turn [pass] | ✅ 통과 [title] | ReadOnlyList<V> [question] | ReadOnlyList의 Count 프로퍼티와 Contains 메서드는 어떤 상황에서 주로 활용되나요? [answer] | `ReadOnlyList`는 읽기 전용 동적 배열로, 1부터 시작하는 인덱스로 요소에 접근하며 데이터 추가, 제거, 검색 기능을 제공합니다. 질문하신 `Count` 프로퍼티와 `Contains` 메서드의 주요 활용 상황은 다음과 같습니다. **1. Count 프로퍼티** * **활용 상황:** 리스트에 포함된 요소의 총 개수를 확인해야 할 때 사용됩니다. * **특징:** `[ReadOnly]` 속성을 가지며, 타입은 `number`입니다. * **예시:** 반복문을 통해 리스트의 모든 요소를 순회할 때, 마지막 인덱스 [followup] | Count가 0일 때의 예외 처리와 Contains가 false를 반환했을 때의 구체적인 코드 예시를 보여주세요. [followup_answer] | 참고 문서에 `Count`가 0일 때 발생하는 예외나 에러 코드에 대한 명시된 정보가 없습니다. `Count`는 단순히 리스트에 포함된 요소의 개수를 반환하는 읽기 전용 프로퍼티이며, 0인 경우의 동작 방식이나 예외 처리 지침은 문서에 나와 있지 않습니다. `Contains` 메서드가 `false`를 반환했을 때(요소가 리스트에 없는 경우)의 구체적인 코드 예시는 다음과 같습니다. ```lua Property: [Sync] number targetValue = 0 Method: [server only] void OnBeginP [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서와 시스템 규칙에 근거하여 Count와 Contains의 정의 및 활용 상황을 정확하고 명확하게 설명했으며, 불필요한 지어내기가 없습니다. [source_doc] | 동적 크기를 가지는 배열입니다. 1부터 시작하는 인덱스로 요소에 접근할 수 있으며 데이터 추가, 제거, 검색 기능을 제공합니다. 배열에 추가할 수 있는 데이터 타입을 V로 표현합니다. # Properties - **number Count [ReadOnly]** List에 포함된 요소의 개수를 가져옵니다 # Methods - **boolean Contains(V item)** List에 요소가 있는지 여부를 확인합니다. - **number IndexOf(V item)** 요소를 처음부터 검색해, List에서 처음으로
[task] | single_turn [pass] | ✅ 통과 [title] | Vector4 [question] | Vector4의 Distance 메서드를 호출했는데 예외가 발생하지 않고 항상 0이 반환되는 것 같은데, 벡터 값이 잘못 입력되었거나 다른 원인이 있을까요? [answer] | 제공된 참고 문서에는 `Vector4`의 `Distance` 메서드 구현 내부 로직, 예외 처리 정책, 또는 특정 조건에서 0이 반환되는 버그에 대한 정보가 포함되어 있지 않습니다. 따라서 문서 근거만으로는 "항상 0이 반환되는 원인"을 특정할 수 없습니다. 다만, 문서에 정의된 `Vector4` API를 바탕으로 코드가 의도대로 동작하지 않는 일반적인 점검 사항(값이 실제로 0인 경우)은 다음과 같습니다. ### 1. 벡터 값이 실제로 동일한지 확인 `Distance`는 두 벡터 사이의 거리를 구합니다. 만약 두 벡터의 `x, [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 없는 버그 원인을 지어내지 않고, 문서에 정의된 API(인스턴스/정적 메서드, Lerp, Project)를 바탕으로 합리적인 디버깅 방향을 제시했으며, mLua 문법 사용도 적절합니다. [source_doc] | 4차원 벡터입니다. # Properties - **float w** 벡터의 w축 원소입니다. - **float x** 벡터의 x축 원소입니다. - **float y** 벡터의 y축 원소입니다. - **float z** 벡터의 z축 원소입니다. - **Vector4 negativeInfinity [Static] [ReadOnly] [HideFromInspector]** Vector4(-inf, -inf, -inf, -inf)를 간단히 사용할 수 있습니다. - **Vector4 one [Static] [ReadOn
[task] | code [pass] | ✅ 통과 [title] | Vector4 [question] | Vector4 UnaryNegation, Addition, Equality를 사용하여 입력 벡터의 역벡터를 생성하고 원본 벡터와 더했을 때 제로 벡터가 되는지 검증하는 로직을 포함하는 스크립트를 작성해줘 [answer] | `Vector4`의 `UnaryNegation`, `Addition`, `Equality` 정적 메서드를 사용하여 역벡터 생성 및 제로 벡터 검증 로직을 구현한 스크립트입니다. ```lua Method: [server only] void OnBeginPlay() { local originalVector = Vector4(5, 10, 15, 20) -- Vector4.UnaryNegation을 사용하여 역벡터 생성 local negatedVector = Vector4.UnaryNegation(origi [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 Vector4 정적 메서드(UnaryNegation, Addition, Equality)와 mLua 표준 문법을 정확히 사용하여 요구된 검증 로직을 구현했으며, 불필요한 설명 없이 명확하고 정답입니다. [source_doc] | - **Vector4 Addition(Vector4 left, Vector4 right) [Static]** 두 벡터를 더한 Vector4 객체를 생성해 반환합니다. - **Vector4 Division(Vector4 left, float right) [Static]** 벡터를 실수로 나눈 Vector4 객체를 생성해 반환합니다. - **boolean Equality(Vector4 left, Vector4 right) [Static]** 두 벡터가 같은지 비교합니다. 같으면 true, 그렇지 않으면 false를 반환합니다
[task] | instruction_following [pass] | ✅ 통과 [title] | RoomSharedMemory [question] | RoomSharedMemory에서 변수를 삭제할 때 사용할 수 있는 Wait/Async 메서드 두 개의 시그니처를 코드만 출력하고 설명은 주석으로. [answer] | ```lua -- RoomSharedMemory에서 변수를 삭제할 때 사용할 수 있는 Wait/Async 메서드 두 개의 시그니처 -- Wait 버전: 입력한 이름들에 해당하는 변수들을 삭제합니다. 수행하는 동안 스크립트 실행을 중단합니다. -- Async 버전: 입력한 이름들에 해당하는 변수들을 삭제합니다. 작업이 완료되면 callbackFunction이 호출됩니다. local function DeleteVariablesWaitExample(mem, names) -- names: List<string> (삭제할 변수 이름 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 명시된 두 메서드의 시그니처와 반환 타입을 정확히 반영하여 요청대로 코드와 주석만 깔끔하게 제시했습니다. [source_doc] | Room끼리 공유하는 메모리를 나타내는 객체입니다. # Properties - **string Name [ReadOnly]** 공유 메모리의 이름입니다. # Methods - **Dictionary<string, SharedVariableResult> BatchCreateVariableAndWait(Dictionary<string, string> nameValues) [ServerOnly] [Yield]** 입력한 이름, 값 쌍들로 변수들을 할당합니다. 변수 이름과 결과 쌍을 담고 있는 table을 반환합니다. 수행하
[task] | two_turn [pass] | ❌ 탈락 [title] | ReadOnlyList<V> [question] | ReadOnlyList의 IndexOf 메서드는 요소를 찾지 못했을 때 0을 반환하는데, 1부터 시작하는 인덱스 체계에서 0을 반환하는 이유는 무엇인가요? [answer] | ReadOnlyList는 1부터 시작하는 인덱스 체계를 사용하며, 이는 Lua의 테이블(array) 인덱스 규칙을 따릅니다. 이 체계에서 1은 목록의 첫 번째 요소를 가리키는 유효한 인덱스입니다. 반면, `IndexOf` 메서드가 요소를 찾지 못했을 때 0을 반환하는 이유는 **0이 유효한 인덱스가 아니기 때문**입니다. 즉, 0은 "찾지 못했다(not found)"라는 상태를 나타내는 특수한 값(sentinel value)으로 사용됩니다. 만약 0이 유효한 인덱스였다면(예: 0부터 시작하는 인덱스 체계), "찾지 못했다"를 나타 [followup] | IndexOf의 반환값을 직접 조건문으로 사용할 때 발생하는 버그를 방지하는 mLua 코드 패턴을 작성해 주세요. [followup_answer] | `IndexOf`는 요소를 찾지 못했을 때 `0`을 반환하고, 찾았을 때 `1` 이상의 정수 인덱스를 반환합니다. 따라서 반환값이 `0`인 경우를 반드시 분리하여 처리해야 합니다. 특히 Lua에서 `0`은 `nil`과 달리 truthy 값이 아니므로(실제로 Lua에서는 0도 truthy이지만, 여기서는 0이 "없음"을 의미하는 특수 값이므로 명시적 비교가 필요함), `if index then` 같은 단순 조건문으로 존재 여부를 판단하면 `index`가 `0`일 때에도 조건이 참으로 평가되어 버그가 발생할 수 있습니다. 안전한 패턴 [scores] | helpfulness=3 correctness=1 coherence=3 complexity=None verbosity=2 [judge_reason] | IndexOf가 0을 반환하는 설계 의도에 대한 설명은 합리적이지만, 참고 문서에 없는 Add 메서드와 생성자를 지어내어 코드가 잘못된 API를 사용하므로 정확도가 낮음 [source_doc] | 동적 크기를 가지는 배열입니다. 1부터 시작하는 인덱스로 요소에 접근할 수 있으며 데이터 추가, 제거, 검색 기능을 제공합니다. 배열에 추가할 수 있는 데이터 타입을 V로 표현합니다. # Properties - **number Count [ReadOnly]** List에 포함된 요소의 개수를 가져옵니다 # Methods - **boolean Contains(V item)** List에 요소가 있는지 여부를 확인합니다. - **number IndexOf(V item)** 요소를 처음부터 검색해, List에서 처음으로
[task] | single_turn [pass] | ✅ 통과 [title] | Vector4 [question] | Vector4의 Dot 메서드를 사용해 두 벡터의 각도를 구할 때, Magnitude나 SqrMagnitude와 어떻게 조합해서 계산해야 하는지 알고 싶어요. [answer] | 참고 문서에 `Vector4`의 `Dot`, `Magnitude`, `SqrMagnitude` 메서드는 포함되어 있지만, 두 벡터의 **각도(Angle)**를 직접 반환하는 메서드(예: `Angle`)는 문서에 없습니다. 또한 `Dot`을 각도 계산에 사용하는 공식(예: `cos(theta) = dot / (mag_a * mag_b)`)에 대한 설명도 문서에 명시되어 있지 않습니다. 따라서 제공된 문서 범위 내에서 **각도 값 자체를 구하는 방법은 확인할 수 없습니다.** 다만, 문서에 정의된 메서드들을 조합하여 **각도의 코사 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=3 coherence=4 complexity=3 verbosity=3 [judge_reason] | 문서에 없는 각도 계산 공식과 math.acos 사용 여부를 명시적으로 제한하여 정확성은 높으나, mLua가 Lua 5.3 기반이라는 시스템 규칙상 math.acos은 표준 라이브러리에 포함되어 있음에도 '확인 필요'라고 서술하여 도움이 제한적이며, 문서에만 없는 수학 원리를 설명하는 부분이 약간 장황함. [source_doc] | 4차원 벡터입니다. # Properties - **float w** 벡터의 w축 원소입니다. - **float x** 벡터의 x축 원소입니다. - **float y** 벡터의 y축 원소입니다. - **float z** 벡터의 z축 원소입니다. - **Vector4 negativeInfinity [Static] [ReadOnly] [HideFromInspector]** Vector4(-inf, -inf, -inf, -inf)를 간단히 사용할 수 있습니다. - **Vector4 one [Static] [ReadOn
[task] | instruction_following [pass] | ✅ 통과 [title] | SharedVariableKeyInfo [question] | SharedVariableKeyInfo를 이름과 ETag로 초기화하는 mLua 코드만 출력하고, 용도 설명은 주석으로만 작성하세요. [answer] | ```lua -- 용도: 이름과 ETag를 지정하여 SharedVariableKeyInfo를 초기화합니다. local keyInfo = SharedVariableKeyInfo("변수이름", "ETag값") ``` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=1 [judge_reason] | 참고 문서의 생성자 시그니처와 일치하며, 요청사항인 코드 출력과 주석 설명을 정확히 수행했습니다. [source_doc] | 공유 변수를 식별하는 데 사용하는 정보입니다. # Properties - **string ETag** 변수를 업데이트 할 때 현재 DB에 저장된 값과 같을 경우에만 실제로 업데이트를 수행합니다. 여러 곳에서 동시에 업데이트를 시도했을 때 동시 다발적 덮어쓰기 현상을 막는데 유용하게 사용됩니다. nil이나 빈 문자열을 주면 무조건 업데이트를 수행합니다. 변수가 업데이트 되면 새로운 ETag가 만들어집니다. - **string Name** 변수 이름입니다. # Constructors - **SharedVariableKey
[task] | instruction_following [pass] | ✅ 통과 [title] | SharedVariableKeyInfo [question] | ETag 프로퍼티의 동시 업데이트 방지 원리와 nil/빈 문자열 처리 방식을 3문장 이내로 설명하세요. [answer] | ETag는 업데이트 시점에 현재 DB에 저장된 값과 일치할 경우에만 실제 수정을 수행하여 동시 다발적 덮어쓰기를 방지합니다. 이때 nil이나 빈 문자열을 ETag로 전달하면 조건 검증 없이 무조건 업데이트가 실행됩니다. 성공적으로 업데이트가 완료되면 새로운 ETag가 발급되어 이후 수정 작업에 사용됩니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 ETag 원리, nil/빈 문자열 처리, 업데이트 후 신규 ETag 발급 내용을 정확하고 간결하게 요약했습니다. [source_doc] | 공유 변수를 식별하는 데 사용하는 정보입니다. # Properties - **string ETag** 변수를 업데이트 할 때 현재 DB에 저장된 값과 같을 경우에만 실제로 업데이트를 수행합니다. 여러 곳에서 동시에 업데이트를 시도했을 때 동시 다발적 덮어쓰기 현상을 막는데 유용하게 사용됩니다. nil이나 빈 문자열을 주면 무조건 업데이트를 수행합니다. 변수가 업데이트 되면 새로운 ETag가 만들어집니다. - **string Name** 변수 이름입니다. # Constructors - **SharedVariableKey
[task] | instruction_following [pass] | ✅ 통과 [title] | SharedVariableKeyInfo [question] | SharedVariableKeyInfo의 생성자 시그니처와 인자 순서를 표로 정리해서 출력하세요. [answer] | SharedVariableKeyInfo의 생성자 시그니처와 인자 순서는 다음과 같습니다. | 생성자 시그니처 | 인자 순서 | | :--- | :--- | | `SharedVariableKeyInfo()` | (인자 없음) | | `SharedVariableKeyInfo(string name, string eTag)` | 1. `name` (string)<br>2. `eTag` (string) | [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 두 가지 생성자의 시그니처와 인자 순서를 정확하고 간결하게 표로 정리하여 질문에 충실히 답변했습니다. [source_doc] | 공유 변수를 식별하는 데 사용하는 정보입니다. # Properties - **string ETag** 변수를 업데이트 할 때 현재 DB에 저장된 값과 같을 경우에만 실제로 업데이트를 수행합니다. 여러 곳에서 동시에 업데이트를 시도했을 때 동시 다발적 덮어쓰기 현상을 막는데 유용하게 사용됩니다. nil이나 빈 문자열을 주면 무조건 업데이트를 수행합니다. 변수가 업데이트 되면 새로운 ETag가 만들어집니다. - **string Name** 변수 이름입니다. # Constructors - **SharedVariableKey
[task] | single_turn [pass] | ✅ 통과 [title] | Vector3 [question] | Vector3 변수에 새 좌표를 대입했는데 엔티티가 이동하지 않고, 왜 레퍼런스 타입 특성상 직접 구성 요소를 수정하거나 전체 객체를 재할당해야 하는지 궁금합니다. [answer] | Vector3는 레퍼런스 타입으로 동작하기 때문에, 기존에 다른 변수나 엔티티의 위치 프로퍼티를 가리키고 있는 참조 변수에 단순히 새 Vector3 객체를 대입하는 것만으로는 원본 객체의 값이 변경되지 않습니다. 질문하신 상황(`Vector3 변수에 새 좌표를 대입했는데 엔티티가 이동하지 않음`)은 아래 두 가지 원인 중 하나일 가능성이 높습니다. 1. **참조 변수를 재할당(Reassignment)만 했을 경우:** `local position = self.Entity.TransformComponent.Position [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 예제 코드가 TransformComponent가 아닌 Transform을 사용하지만, 시스템 규칙에서 명시한 self.Entity.TransformComponent 사용법을 따랐으므로 정상이며, 레퍼런스 타입 동작 원리와 해결책을 정확히 설명했습니다. [source_doc] | # Operators - **Vector3 Addition(Vector3 left, Vector3 right) [Static]** 두 벡터를 더한 Vector3 객체를 생성해 반환합니다. - **Vector3 Division(Vector3 left, float right) [Static]** 벡터를 실수로 나눈 Vector3 객체를 생성해 반환합니다. - **boolean Equality(Vector3 left, Vector3 right) [Static]** 두 벡터가 같은지 비교합니다. 같으면 true, 그렇지 않으면
[task] | single_turn [pass] | ✅ 통과 [title] | RoomSharedMemory [question] | 한 월드에 RoomSharedMemory를 100개 이상 생성하려고 하면 어떤 문제가 발생하나요? [answer] | 한 월드에서 생성할 수 있는 RoomSharedMemory의 최대 개수는 100개입니다. 이 한도를 초과하여 100개 이상을 생성하려고 하면 제한 사항에 따라 정상적으로 생성되지 않거나 오류가 발생합니다. [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 문서에 명시된 100개 제한을 정확히 인용했으나, 초과 시 구체적인 오류 메시지나 동작은 문서에 없어 추측성 서술을 추가함. [source_doc] | # 제한 사항 RoomSharedMemory를 사용할 때는 아래의 제한 사항을 염두에 두고 사용해야 합니다. #### 작명 규칙 RoomSharedMemory와 공유 변수 이름은 아래 문자로만 작명할 수 있습니다. 최소 1글자 이상의 이름이어야 하며, 최대 100글자 이름일 수 있습니다. * 알파벳 대,소문자 * 숫자 * 공백 * _, \, - #### 수량 및 용량 제한 * 한 월드 당 생성 가능한 RoomSharedMemory는 최대 100개입니다. * 하나의 공유 변수에 저장할 수 있는 최댓값은 80,000 byte
[task] | single_turn [pass] | ✅ 통과 [title] | Vector3 [question] | Vector3의 up, forward 같은 상수 벡터와 number를 곱할 때 곱셈 순서가 바뀌어도 결과가 같은지, 그리고 mLua에서 += 같은 복합 대입 연산자를 사용할 수 없는 이유를 알고 싶습니다. [answer] | 참고 문서에 따르면, `Vector3`과 `number`의 곱셈은 두 가지 순서 모두 지원되며, 수학적으로 동일한 결과를 반환합니다. 문서에는 다음과 같은 정적 메서드(Static Method)가 정의되어 있습니다. 1. `Vector3 Multiply(float left, Vector3 right) [Static]`: 실수를 왼쪽으로, 벡터를 오른쪽으로 받아 곱합니다. (예: `10 * Vector3.up`) 2. `Vector3 Multiply(Vector3 left, float right) [Static]`: 벡터를 왼쪽으로 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 정적 메서드 정의와 Lua 5.3 문법 제한을 정확히 인용하여 곱셈 순서 지원 여부와 복합 대입 불가 이유를 명확하게 설명했습니다. [source_doc] | # Operators - **Vector3 Addition(Vector3 left, Vector3 right) [Static]** 두 벡터를 더한 Vector3 객체를 생성해 반환합니다. - **Vector3 Division(Vector3 left, float right) [Static]** 벡터를 실수로 나눈 Vector3 객체를 생성해 반환합니다. - **boolean Equality(Vector3 left, Vector3 right) [Static]** 두 벡터가 같은지 비교합니다. 같으면 true, 그렇지 않으면
[task] | single_turn [pass] | ✅ 통과 [title] | RoomSharedMemory [question] | 공유 변수 하나에 저장할 수 있는 데이터 크기가 80,000 bytes를 초과하면 어떻게 처리되나요? [answer] | 공유 변수 하나에 저장할 수 있는 데이터 크기가 80,000 bytes를 초과하면 해당 제한 사항을 위반하게 됩니다. 제공된 문서에는 80,000 bytes를 초과할 경우의 구체적인 처리 방식(예: 에러 발생, 데이터 잘림, 저장 실패 등)에 대한 설명이 포함되어 있지 않습니다. 따라서 초과 시 어떻게 처리되는지 알 수 없습니다. [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 없는 초과 시 처리 방식을 지어내지 않고 문서에 명시된 제한 사항과 정보 부재를 정확히 지적하여 질문의 의도에 부합하는 답변입니다. [source_doc] | # 제한 사항 RoomSharedMemory를 사용할 때는 아래의 제한 사항을 염두에 두고 사용해야 합니다. #### 작명 규칙 RoomSharedMemory와 공유 변수 이름은 아래 문자로만 작명할 수 있습니다. 최소 1글자 이상의 이름이어야 하며, 최대 100글자 이름일 수 있습니다. * 알파벳 대,소문자 * 숫자 * 공백 * _, \, - #### 수량 및 용량 제한 * 한 월드 당 생성 가능한 RoomSharedMemory는 최대 100개입니다. * 하나의 공유 변수에 저장할 수 있는 최댓값은 80,000 byte
[task] | single_turn [pass] | ✅ 통과 [title] | RoomSharedMemory [question] | RoomSharedMemory 변수 이름에 한국어나 특수문자를 넣지 못하게 된 이유는 무엇인가요? [answer] | RoomSharedMemory 변수 이름에 한국어나 특수문자를 사용할 수 없는 이유는, 시스템이 변수 이름을 식별할 때 특정 문자 세트만 허용하도록 작명 규칙이 제한되어 있기 때문입니다. 허용되는 문자는 다음과 같습니다: * 알파벳 대문자 및 소문자 * 숫자 * 공백 * `_` (언더스코어), `\` (백슬래시), `-` (하이픈) 이 목록에 포함되지 않는 한국어(한글) 문자나 기타 특수문자는 허용되지 않으므로, 변수를 생성할 때 이를 사용할 수 없습니다. 또한 이름은 최소 1글자 이상, 최대 100글자 이내여야 합니다. [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 명시된 허용 문자 목록과 길이 제한을 정확히 인용하여 질문의 '제한 사항' 부분에 충실히 답변하였으나, 문서에 기술되지 않은 기술적 '이유'(예: 인코딩, 파싱 효율 등)를 추측하지 않고 현상(규칙 제한)으로만 설명하여 정합성을 유지했습니다. [source_doc] | # 제한 사항 RoomSharedMemory를 사용할 때는 아래의 제한 사항을 염두에 두고 사용해야 합니다. #### 작명 규칙 RoomSharedMemory와 공유 변수 이름은 아래 문자로만 작명할 수 있습니다. 최소 1글자 이상의 이름이어야 하며, 최대 100글자 이름일 수 있습니다. * 알파벳 대,소문자 * 숫자 * 공백 * _, \, - #### 수량 및 용량 제한 * 한 월드 당 생성 가능한 RoomSharedMemory는 최대 100개입니다. * 하나의 공유 변수에 저장할 수 있는 최댓값은 80,000 byte
[task] | single_turn [pass] | ✅ 통과 [title] | SharedVariableInfo [question] | 공유 변수를 업데이트할 때 ETag를 nil이나 빈 문자열로 주면 동시 다발적 덮어쓰기 문제를 피할 수 있나요? [answer] | 아니요, ETag를 `nil`이나 빈 문자열로 주면 동시 다발적 덮어쓰기 문제를 피할 수 없습니다. ETag는 현재 데이터베이스에 저장된 값과 같을 경우에만 업데이트를 수행하여 동시 다발적 덮어쓰기를 방지하는 메커니즘입니다. 그러나 `nil`이나 빈 문자열을 ETag로 전달하면 조건 검사를 생략하고 **무조건 업데이트를 수행**합니다. 따라서 여러 클라이언트나 서버가 동시에 업데이트를 시도할 때 마지막 요청이 이전 요청을 덮어쓰는 문제가 발생할 수 있습니다. 동시성을 보장하려면 반드시 최신 `ETag` 값을 확인하여 `Share [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=4 verbosity=2 [judge_reason] | 질문에 대한 논리적 반론은 정확하지만, 참고 문서에 없는 구체적인 API(SharedMemoryService, SharedVariableKeyInfo 등)를 지어내어 코드 예시가 실제 동작하지 않습니다. [source_doc] | 공유 변수 정보입니다. # Properties - **string ETag [ReadOnly]** 변수를 업데이트 할 때 현재 DB에 저장된 값과 같을 경우에만 실제로 업데이트를 수행합니다. 여러 곳에서 동시에 업데이트를 시도했을 때 동시 다발적 덮어쓰기 현상을 막는데 유용하게 사용됩니다. nil이나 빈 문자열을 주면 무조건 업데이트를 수행합니다. 변수가 업데이트 되면 새로운 ETag가 만들어집니다. - **string Name [ReadOnly]** 변수 이름입니다. - **string Value [ReadOnly]**
[task] | single_turn [pass] | ✅ 통과 [title] | RoomSharedMemory [question] | 이벤트 프로퍼티를 전송할 때 총 용량이 80,000 byte를 넘지 않도록 주의해야 하는 이유는 무엇인가요? [answer] | 이벤트 프로퍼티 전송 시 총 용량이 80,000 byte를 초과할 수 없는 이유는 **RoomSharedMemory의 시스템적 제한** 때문입니다. RoomSharedMemory는 월드 내에서 데이터를 공유하고 이벤트를 전송하는 데 사용되며, 이때 전송되는 이벤트 프로퍼티의 총 용량은 하드웨어 및 네트워크 처리 효율을 위해 80,000 byte로 엄격하게 제한되어 있습니다. 이 용량을 초과하는 데이터를 이벤트 프로퍼티로 전송하려고 하면 시스템이 처리하지 못할 수 있으므로, 개발 시 반드시 이 한도 내에서 데이터를 구성해야 합니다. [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=2 verbosity=3 [judge_reason] | 문서에 명시된 제한 사항을 정확히 인용하되, 문서에 없는 '하드웨어 및 네트워크 처리 효율'이라는 이유를 추론하여 서술하여 도움이 약간 제한적입니다. [source_doc] | # 제한 사항 RoomSharedMemory를 사용할 때는 아래의 제한 사항을 염두에 두고 사용해야 합니다. #### 작명 규칙 RoomSharedMemory와 공유 변수 이름은 아래 문자로만 작명할 수 있습니다. 최소 1글자 이상의 이름이어야 하며, 최대 100글자 이름일 수 있습니다. * 알파벳 대,소문자 * 숫자 * 공백 * _, \, - #### 수량 및 용량 제한 * 한 월드 당 생성 가능한 RoomSharedMemory는 최대 100개입니다. * 하나의 공유 변수에 저장할 수 있는 최댓값은 80,000 byte
[task] | instruction_following [pass] | ❌ 탈락 [title] | RoomSharedMemory [question] | 문서에 명시된 메서드 중 [Yield] 태그가 붙은 메서드와 ETag 검증 로직을 설명하는 메서드를 표로 정리하세요. [answer] | 요청하신 [Yield] 태그가 붙은 메서드와 ETag 검증 로직이 포함된 메서드를 정리하면 다음과 같습니다. ### 1. [Yield] 태그가 붙은 메서드 이 메서드들은 실행되는 동안 스크립트 실행을 중단합니다. | 메서드 시그니처 | 설명 | | :--- | :--- | | `SharedVariableResult CreateVariableAndWait(string name, string value)` | 변수를 할당합니다. 요청 결과는 반환된 객체로 확인할 수 있습니다. | | `SharedMemoryResultCode Del [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | 요청된 메서드 분류는 정확했으나, 문서에 없는 API(_WorldInstanceService, SharedMemoryResultCode.PreconditionFailed)와 구조를 지어내어 정확도가 낮음. [source_doc] | leKeyInfo의 ETag가 최신이 아니면 값을 수정하지 않습니다. ETag가 nil 또는 빈 문자열이면 무조건 값을 수정합니다. 변수 이름과 결과 쌍을 담고 있는 table을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void BatchUpdateVariableAsync(Dictionary<SharedVariableKeyInfo, string> keyValues, func<Dictionary<string, SharedVariableResult>> callbackFunction) [ServerOnly]**
[task] | instruction_following [pass] | ❌ 탈락 [title] | SharedVariableInfo [question] | ETag가 nil이거나 빈 문자열일 때 발생하는 업데이트 동작과 그 결과를 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua local code, mem = _WorldInstanceService:GetSharedMemory("MemoryName") -- ETag가 nil이거나 빈 문자열일 때 발생하는 업데이트 동작과 그 결과를 코드만 출력하고 설명은 주석으로 작성하세요. -- 1. ETag가 nil인 경우 -- SharedVariableKeyInfo의 두 번째 인자로 nil을 전달합니다. -- 이 경우 ETag 검증을 건너뛰고 무조건 업데이트를 수행합니다. local keyInfoNilETag = SharedVariableKeyInfo( [followup] | [followup_answer] | [scores] | helpfulness=1 correctness=0 coherence=3 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 없는 _WorldInstanceService, GetSharedMemory, SharedVariableKeyInfo, UpdateVariableAndWait 등 API를 지어냈으며, 문서의 SharedVariableInfo 구조(Readonly 속성)를 무시하고 존재하지 않는 메서드 체인을 사용했습니다. [source_doc] | 공유 변수 정보입니다. # Properties - **string ETag [ReadOnly]** 변수를 업데이트 할 때 현재 DB에 저장된 값과 같을 경우에만 실제로 업데이트를 수행합니다. 여러 곳에서 동시에 업데이트를 시도했을 때 동시 다발적 덮어쓰기 현상을 막는데 유용하게 사용됩니다. nil이나 빈 문자열을 주면 무조건 업데이트를 수행합니다. 변수가 업데이트 되면 새로운 ETag가 만들어집니다. - **string Name [ReadOnly]** 변수 이름입니다. - **string Value [ReadOnly]**
[task] | instruction_following [pass] | ✅ 통과 [title] | WorldInstanceSharedMemory [question] | BatchCreateVariableAndWait와 BatchCreateVariableAsync의 차이점을 [ServerOnly] 및 [Yield] 속성 관점에서 2문장 이내로 설명하세요. [answer] | `BatchCreateVariableAndWait`는 `[Yield]` 속성을 가져 호출 시 스크립트 실행이 중단된 채 완료될 때까지 대기하지만, `BatchCreateVariableAsync`는 비동기 방식으로 즉시 반환하여 콜백 함수를 통해 결과를 전달합니다. 두 메서드 모두 `[ServerOnly]` 속성을 가져 서버 공간에서만 실행됩니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 메서드 시그니처와 속성([ServerOnly], [Yield]) 정보를 정확히 추출하여 요구된 분량(2문장 이내) 내에서 명확하게 차이점을 설명했습니다. [source_doc] | WorldInstance끼리 공유하는 메모리입니다. # Properties - **string Name [ReadOnly]** 공유 메모리의 이름입니다. # Methods - **Dictionary<string, SharedVariableResult> BatchCreateVariableAndWait(Dictionary<string, string> nameValues) [ServerOnly] [Yield]** 입력한 이름, 값 쌍들로 변수들을 할당합니다. 변수 이름과 결과 쌍을 담고 있는 table을 반환합니다. 수행하
[task] | single_turn [pass] | ❌ 탈락 [title] | SharedVariableInfo [question] | 여러 클라이언트가 동시에 공유 변수를 수정하려고 할 때 ETag가 일치하지 않으면 어떤 동작을 하게 되나요? [answer] | 여러 클라이언트가 동시에 공유 변수를 수정하려고 할 때, `ETag`가 일치하지 않으면 수정이 수행되지 않습니다. 구체적인 동작은 다음과 같습니다. 1. **수정 실패**: `UpdateVariableAndWait` 호출 시, 전달된 `SharedVariableKeyInfo`의 `ETag` 값이 현재 DB에 저장된 최신 `ETag`와 다르면 업데이트가 거부됩니다. 2. **오류 코드 반환**: 수정이 실패하면 결과 객체의 `Code` 프로퍼티에 `SharedMemoryResultCode.PreconditionFailed` 오 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=0 coherence=3 complexity=3 verbosity=3 [judge_reason] | 참고 문서에 없는 API(_WorldInstanceService, SharedVariableKeyInfo, SharedMemoryResultCode 등)와 로직을 지어내어 정확도가 0점입니다. [source_doc] | 공유 변수 정보입니다. # Properties - **string ETag [ReadOnly]** 변수를 업데이트 할 때 현재 DB에 저장된 값과 같을 경우에만 실제로 업데이트를 수행합니다. 여러 곳에서 동시에 업데이트를 시도했을 때 동시 다발적 덮어쓰기 현상을 막는데 유용하게 사용됩니다. nil이나 빈 문자열을 주면 무조건 업데이트를 수행합니다. 변수가 업데이트 되면 새로운 ETag가 만들어집니다. - **string Name [ReadOnly]** 변수 이름입니다. - **string Value [ReadOnly]**
[task] | single_turn [pass] | ❌ 탈락 [title] | RoomSharedMemory [question] | GetVariableAsync의 콜백 함수에서 받는 SharedVariableResult 객체를 통해 어떤 정보를 확인할 수 있나요? [answer] | `GetVariableAsync`의 콜백 함수에서 전달받는 `SharedVariableResult` 객체를 통해 다음 정보를 확인할 수 있습니다. 1. **`Code`**: 작업의 결과를 나타내는 코드입니다. - 성공 여부를 판단할 수 있으며, 실패 시에는 구체적인 오류 코드(예: `SharedMemoryResultCode.PreconditionFailed` 등)가 포함될 수 있습니다. 2. **`Info`**: 변수의 상세 정보를 담고 있는 객체입니다. - **`Name`**: 변수의 이름 (string) - * [followup] | [followup_answer] | [scores] | helpfulness=1 correctness=0 coherence=3 complexity=3 verbosity=2 [judge_reason] | 참고 문서와 시스템 규칙에 없는 _WorldInstanceService, GetSharedMemory, SharedVariableResult의 필드(Code, Info 등)를 지어내어 사실이 아님. [source_doc] | leKeyInfo의 ETag가 최신이 아니면 값을 수정하지 않습니다. ETag가 nil 또는 빈 문자열이면 무조건 값을 수정합니다. 변수 이름과 결과 쌍을 담고 있는 table을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void BatchUpdateVariableAsync(Dictionary<SharedVariableKeyInfo, string> keyValues, func<Dictionary<string, SharedVariableResult>> callbackFunction) [ServerOnly]**
[task] | single_turn [pass] | ✅ 통과 [title] | RoomSharedMemory [question] | RoomSharedMemory의 총 용량 제한인 80MiB와 공유 변수별 80,000 bytes 제한은 어떻게 다른가요? [answer] | RoomSharedMemory의 용량 제한은 두 가지 다른 레벨에서 적용됩니다. 1. **공유 변수별 제한 (80,000 bytes)** * 개별 공유 변수 1개에 저장할 수 있는 데이터의 최대 크기입니다. * 즉, 하나의 변수에 80,000 bytes를 초과하는 데이터를 한 번에 저장할 수 없습니다. 2. **RoomSharedMemory 전체 용량 제한 (80MiB)** * 하나의 RoomSharedMemory 객체 내에 존재하는 모든 공유 변수들이 차지하는 총 용량의 합계 제한입니다. * 80MiB ( [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 두 가지 용량 제한(변수별 80,000 bytes, 전체 80MiB)을 정확히 구분하여 설명하고, 비유를 통해 이해를 돕고 있어 질문의 의도를 완벽히 충족함. [source_doc] | # 제한 사항 RoomSharedMemory를 사용할 때는 아래의 제한 사항을 염두에 두고 사용해야 합니다. #### 작명 규칙 RoomSharedMemory와 공유 변수 이름은 아래 문자로만 작명할 수 있습니다. 최소 1글자 이상의 이름이어야 하며, 최대 100글자 이름일 수 있습니다. * 알파벳 대,소문자 * 숫자 * 공백 * _, \, - #### 수량 및 용량 제한 * 한 월드 당 생성 가능한 RoomSharedMemory는 최대 100개입니다. * 하나의 공유 변수에 저장할 수 있는 최댓값은 80,000 byte
[task] | two_turn [pass] | ❌ 탈락 [title] | SharedVariableInfo [question] | 공유 변수 정보(SharedVariableInfo)의 ETag 속성이 동시 다발적 덮어쓰기를 방지하는 데 어떤 역할을 하는지 설명해 주세요. [answer] | 공유 변수 정보(SharedVariableInfo)의 `ETag` 속성은 여러 클라이언트나 서버가 동시에 같은 공유 변수를 수정하려고 할 때 발생하는 동시 다발적 덮어쓰기 문제를 방지하는 낙관적 락(Optimistic Locking) 메커니즘으로 동작합니다. 구체적인 역할과 동작 방식은 다음과 같습니다. 1. **버전 관리 역할**: 공유 변수가 업데이트될 때마다 서버는 새로운 `ETag` 값을 생성하여 반환합니다. 이 값은 해당 변수의 현재 상태를 나타내는 고유 식별자입니다. 2. **조건부 업데이트**: 공유 변수를 수정 [followup] | ETag 값이 nil 또는 빈 문자열일 때 업데이트 동작은 어떻게 달라지며, 이 예외 상황을 처리하는 mLua 스크립트 예제를 보여주세요. [followup_answer] | `ETag` 값이 `nil` 또는 빈 문자열(`""`)인 경우, 서버는 현재 DB에 저장된 값과 비교하는 검증 과정을 건너뛰고 **무조건 업데이트를 수행**합니다. 이 동작은 일반적인 낙관적 락(Optimistic Locking) 방식에서 벗어나, 동시성 충돌을 무시하고 최신 요청 값을 그대로 덮어쓰는 "최후 승자(Winner-takes-all)" 방식이 됩니다. 따라서 여러 곳에서 동시에 업데이트를 시도할 경우, 마지막 요청이 처리되는 순서대로 값이 덮어쓰기되며 중간에 발생한 값은 유실될 수 있습니다. 이 예외 상황(무조건 업 [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | ETag의 개념 설명은 정확하지만, 문서에 없는 _WorldInstanceService, GetVariableAndWait, SharedMemoryResultCode 등 구체적인 API와 코드 예시를 지어내어 정확도에서 감점되었습니다. [source_doc] | 공유 변수 정보입니다. # Properties - **string ETag [ReadOnly]** 변수를 업데이트 할 때 현재 DB에 저장된 값과 같을 경우에만 실제로 업데이트를 수행합니다. 여러 곳에서 동시에 업데이트를 시도했을 때 동시 다발적 덮어쓰기 현상을 막는데 유용하게 사용됩니다. nil이나 빈 문자열을 주면 무조건 업데이트를 수행합니다. 변수가 업데이트 되면 새로운 ETag가 만들어집니다. - **string Name [ReadOnly]** 변수 이름입니다. - **string Value [ReadOnly]**
[task] | code [pass] | ❌ 탈락 [title] | RoomSharedMemory [question] | OnEndPlay에서 RoomSharedMemory의 BatchDeleteVariableAsync 메서드를 호출하여 "score"와 "level" 변수를 삭제하고 결과 코드를 log로 확인하는 스크립트를 작성해줘 [answer] | 사용자가 요청한 `OnEndPlay`에서 `BatchDeleteVariableAsync`를 호출하는 스크립트입니다. 참고 문서에 따르면 `BatchDeleteVariableAsync`는 `List<string>` 타입의 이름 목록과 결과를 전달받는 콜백 함수를 인자로 받으며, 서버에서 실행됩니다. `RoomSharedMemory` 객체는 `_WorldInstanceService:GetSharedMemory("이름")`을 통해 가져올 수 있습니다. ```lua Method: [server only] void OnEndPlay() [followup] | [followup_answer] | [scores] | helpfulness=2 correctness=0 coherence=3 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 존재하지 않는 _WorldInstanceService:GetSharedMemory API를 지어내어 객체 획득 방법을 잘못 서술했으므로 정확도가 0점입니다. [source_doc] | Room끼리 공유하는 메모리를 나타내는 객체입니다. # Properties - **string Name [ReadOnly]** 공유 메모리의 이름입니다. # Methods - **Dictionary<string, SharedVariableResult> BatchCreateVariableAndWait(Dictionary<string, string> nameValues) [ServerOnly] [Yield]** 입력한 이름, 값 쌍들로 변수들을 할당합니다. 변수 이름과 결과 쌍을 담고 있는 table을 반환합니다. 수행하
[task] | single_turn [pass] | ❌ 탈락 [title] | RoomSharedMemory [question] | BatchUpdateVariableAsync를 호출하면 스크립트 실행이 중단되나요, 아니면 비동기적으로 처리되나요? [answer] | `BatchUpdateVariableAsync`는 **비동기적으로 처리**됩니다. 이 메서드는 스크립트 실행을 중단하지 않으며, 작업이 완료된 후에 `callbackFunction`으로 전달된 함수를 호출합니다. 참고 문서에 따르면 "수행하는 동안 스크립트 실행을 중단합니다"라는 설명은 `Wait`로 끝나는 동기 메서드(예: `CreateVariableAndWait`, `GetVariableAndWait` 등)에만 적용되며, `Async`로 끝나는 메서드들은 콜백 기반의 비동기 처리 방식을 사용합니다. ```lua -- Batc [followup] | [followup_answer] | [scores] | helpfulness=2 correctness=1 coherence=3 complexity=2 verbosity=2 [judge_reason] | BatchUpdateVariableAsync의 비동기 처리라는 핵심 답변은 정확하지만, 코드 예시에서 문서와 규칙에 없는 _WorldInstanceService, GetSharedMemory, SharedVariableKeyInfo 생성자 등을 지어내어 정확성이 매우 낮음 [source_doc] | leKeyInfo의 ETag가 최신이 아니면 값을 수정하지 않습니다. ETag가 nil 또는 빈 문자열이면 무조건 값을 수정합니다. 변수 이름과 결과 쌍을 담고 있는 table을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void BatchUpdateVariableAsync(Dictionary<SharedVariableKeyInfo, string> keyValues, func<Dictionary<string, SharedVariableResult>> callbackFunction) [ServerOnly]**
[task] | single_turn [pass] | ❌ 탈락 [title] | SharedVariableInfo [question] | SharedVariableInfo에서 Name과 Value 프로퍼티가 ReadOnly로 표시되어 있는데, 이 값들을 직접 수정해서 변경할 수 있는 방법이 있나요? [answer] | 네, `SharedVariableInfo`의 `Name`과 `Value` 프로퍼티가 `ReadOnly`로 표시되어 있어 직접 대입을 통해 변경할 수는 없습니다. 이는 객체 자체의 속성을 수정하는 것이 아니라, 공유 메모리 시스템의 메서드를 호출하여 서버 측 데이터를 수정하는 방식으로만 변경이 가능합니다. 특히 `Value`를 변경하려면 `SharedVariableKeyInfo`를 생성하여 `UpdateVariableAndWait` 메서드를 사용해야 합니다. 이때 `SharedVariableKeyInfo`의 두 번째 인자로 `ETa [followup] | [followup_answer] | [scores] | helpfulness=1 correctness=0 coherence=3 complexity=2 verbosity=3 [judge_reason] | 참고 문서에 없는 _WorldInstanceService, GetSharedMemory, UpdateVariableAndWait, SharedVariableKeyInfo, DeleteVariableAndWait 등 API와 코드 예제를 완전히 지어내어 정확도가 0점입니다. [source_doc] | 공유 변수 정보입니다. # Properties - **string ETag [ReadOnly]** 변수를 업데이트 할 때 현재 DB에 저장된 값과 같을 경우에만 실제로 업데이트를 수행합니다. 여러 곳에서 동시에 업데이트를 시도했을 때 동시 다발적 덮어쓰기 현상을 막는데 유용하게 사용됩니다. nil이나 빈 문자열을 주면 무조건 업데이트를 수행합니다. 변수가 업데이트 되면 새로운 ETag가 만들어집니다. - **string Name [ReadOnly]** 변수 이름입니다. - **string Value [ReadOnly]**
[task] | instruction_following [pass] | ❌ 탈락 [title] | WorldInstanceSharedMemory [question] | BatchGetVariableAsync를 사용하여 변수 정보를 비동기적으로 조회하는 mLua 코드만 출력하고, 각 매개변수 용도는 주석으로만 설명하세요. [answer] | ```lua Method: [server only] void GetVariablesAsync() { -- WorldInstanceService를 통해 공유 메모리에 접근합니다. local code, mem = _WorldInstanceService:GetSharedMemory("MemoryName") -- 조회할 공유 변수들의 이름을 담은 List입니다. local names = { "b_var1", "b_var2" } -- BatchGetVariableAsync의 첫 번째 매개변수: 조회할 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | _WorldInstanceService API가 문서와 규칙에 존재하지 않으며, BatchGetVariableAsync는 WorldInstanceSharedMemory 객체 메서드임이 명확하나 응답이 이를 지어낸 서비스 메서드로 접근하고 있어 정확성 오류가 큼. [source_doc] | WorldInstance끼리 공유하는 메모리입니다. # Properties - **string Name [ReadOnly]** 공유 메모리의 이름입니다. # Methods - **Dictionary<string, SharedVariableResult> BatchCreateVariableAndWait(Dictionary<string, string> nameValues) [ServerOnly] [Yield]** 입력한 이름, 값 쌍들로 변수들을 할당합니다. 변수 이름과 결과 쌍을 담고 있는 table을 반환합니다. 수행하
[task] | single_turn [pass] | ❌ 탈락 [title] | RoomSharedMemory [question] | SetVariableAndWait와 CreateVariableAndWait를 사용할 때 변수가 이미 존재하는 경우의 동작 차이는 무엇인가요? [answer] | `SetVariableAndWait`와 `CreateVariableAndWait`는 변수가 이미 존재하는 경우의 동작에서 명확한 차이가 있습니다. **`SetVariableAndWait`** * **동작:** 변수가 없으면 새 변수를 할당하고, **이미 존재하면 기존 변수의 값을 수정**합니다. * **결과:** 성공적으로 변수를 생성하거나 값을 업데이트하여 `SharedVariableResult` 객체를 반환합니다. **`CreateVariableAndWait`** * **동작:** 단순히 변수를 할당(생성)하는 역 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 명시되지 않은 'CreateVariableAndWait'의 중복 생성 시 실패 동작을 지어냈고, 코드 예시의 _WorldInstanceService API 명칭이 문서에 없습니다. [source_doc] | leKeyInfo의 ETag가 최신이 아니면 값을 수정하지 않습니다. ETag가 nil 또는 빈 문자열이면 무조건 값을 수정합니다. 변수 이름과 결과 쌍을 담고 있는 table을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void BatchUpdateVariableAsync(Dictionary<SharedVariableKeyInfo, string> keyValues, func<Dictionary<string, SharedVariableResult>> callbackFunction) [ServerOnly]**
[task] | code [pass] | ✅ 통과 [title] | Vector4 [question] | Vector4 Division, Multiply, Subtraction을 조합하여 주어진 벡터를 특정 값으로 나누고 다시 배수화한 후 원래 벡터와의 차이를 계산하여 오차 범위를 확인하는 스크립트를 작성해줘 [answer] | 주어진 `Vector4`의 `Division`, `Multiply`, `Subtraction` 정적 메서드와 `Equality`를 조합하여 벡터 연산과 오차 범위를 확인하는 스크립트입니다. 참고: 제공된 문서에는 `Vector4`의 `Distance` 또는 `Length` 메서드가 명시되어 있지 않습니다. 따라서 "오차 범위" 확인을 위해 두 벡터의 차이를 구한 후, 각 성분(`x`, `y`, `z`, `w`)의 절대값이 특정 임계값(예: 0.01) 이하인지 직접 비교하는 방식으로 구현했습니다. ```lua Property: [ [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 없는 메서드를 지어내지 않고, 주어진 정적 메서드와 표준 구문을 정확히 활용하여 질문의 요구사항을 충실히 구현했습니다. [source_doc] | - **Vector4 Addition(Vector4 left, Vector4 right) [Static]** 두 벡터를 더한 Vector4 객체를 생성해 반환합니다. - **Vector4 Division(Vector4 left, float right) [Static]** 벡터를 실수로 나눈 Vector4 객체를 생성해 반환합니다. - **boolean Equality(Vector4 left, Vector4 right) [Static]** 두 벡터가 같은지 비교합니다. 같으면 true, 그렇지 않으면 false를 반환합니다
[task] | instruction_following [pass] | ✅ 통과 [title] | WorldInstanceSharedMemory [question] | WorldInstanceSharedMemory에서 BatchSetVariableAsync와 BatchUpdateVariableAsync의 차이점을 ETag 검증 로직 기준으로 3문장 이내로 설명하세요. [answer] | BatchSetVariableAsync는 이름과 값 쌍을 받아 변수가 없으면 생성하고, 이미 존재하면 ETag 검증을 거치지 않고 무조건 값을 수정합니다. 반면 BatchUpdateVariableAsync는 SharedVariableKeyInfo를 입력받아 ETag가 최신이 아니면 수정을 거부하며, ETag가 nil 또는 빈 문자열인 경우에만 무조건 수정합니다. 따라서 전자는 존재 여부에 따라 생성 또는 덮어쓰기를 수행하고, 후자는 ETag 기반의 동시성 제어(optimistic concurrency)를 적용하여 충돌을 방지하는 것 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 API 설명을 정확히 대조하여 ETag 검증 유무라는 핵심 차이점을 3문장 이내로 명확하고 정확하게 설명했습니다. [source_doc] | 다. 이미 있으면 기존 변수들의 값을 수정합니다. 변수 이름과 결과 쌍을 담고 있는 table을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void BatchSetVariableAsync(Dictionary<string, string> nameValues, func<Dictionary<string, SharedVariableResult>> callbackFunction) [ServerOnly]** 입력한 이름, 값 쌍들로 변수가 없으면 새 변수들을 할당합니다. 이미 있으면 기존 변수들의 값을 수정합니다. 작업