GS2-Buff SDK for Game Engine API 레퍼런스
모델
EzBuffEntryModel
버프 엔트리 모델
버프의 적용량은 버프 엔트리 모델로 관리하며, 동일한 대상에 대해 여러 버프 엔트리 모델을 연결할 수 있습니다.
버프 엔트리 모델의 적용 순서는 버프 엔트리 모델의 priority 로 관리하며, priority 값이 작을수록 우선순위가 높아집니다.
버프의 적용 방식은 3종류가 있으며 “Rate Add”, “Mul”, “Value Add"가 있습니다.
Rate Add 는 버프의 적용 레이트에 가산하는 명령이며, Mul 은 버프의 적용 레이트에 곱하는 명령입니다.
Value Add 는 버프 보정 계산 후의 값에 가산을 수행하는 명령입니다.
예를 들어 기본 레이트가 1.0 이고 Rate Add 0.2 를 설정하면 버프 적용 레이트는 1.2 가 됩니다.
Mul 0.5 를 설정하면 버프 적용 레이트는 현재 레이트의 0.5배가 됩니다.
버프 엔트리 모델에는 GS2-Schedule 의 이벤트를 연결할 수 있으며, 이벤트 개최 기간 중에만 버프를 적용하도록 설정하는 것도 가능합니다.
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| name | string | ✓ | ~ 128자 | 버프 엔트리 모델 이름 버프 엔트리 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||||||||||
| metadata | string | ~ 2048자 | 메타데이터 메타데이터에는 임의의 값을 설정할 수 있습니다. 이 값들은 GS2의 동작에는 영향을 주지 않으므로, 게임 내에서 사용하는 정보를 저장하는 용도로 사용할 수 있습니다. | |||||||||||
| targetType | 문자열 열거형 enum { “model”, “action” } | ✓ | 버프를 적용할 대상의 종류 버프를 모델의 필드 값에 적용할지, 액션의 파라미터에 적용할지를 지정합니다. “Model"은 GS2 리소스 모델의 필드를 대상으로 하며, “Action"은 GS2 액션(예: 획득량이나 소비량)의 파라미터를 대상으로 합니다.
| |||||||||||
| targetModel | EzBuffTargetModel | {targetType} == “model” | ✓※ | 버프를 적용할 대상 모델 버프를 적용할 GS2 리소스 모델과 필드를 지정합니다. 모델 이름, 필드 이름, 대상 리소스를 특정하는 조건 GRN, 그리고 레이트 값이 포함됩니다. ※ targetType이(가) “model” 이면 필수 | ||||||||||
| targetAction | EzBuffTargetAction | {targetType} == “action” | ✓※ | 버프를 적용할 대상 액션 버프를 적용할 GS2 액션과 파라미터를 지정합니다. 액션 이름, 필드 이름, 대상 리소스를 특정하는 조건 GRN, 그리고 레이트 값이 포함됩니다. ※ targetType이(가) “action” 이면 필수 | ||||||||||
| expression | 문자열 열거형 enum { “rate_add”, “mul”, “value_add” } | ✓ | 버프의 적용 타입 버프 값을 대상에 어떻게 적용할지를 지정합니다. “Rate Add"는 보정 레이트에 가산(예: 1.0 + 0.2 = 1.2), “Mul"은 보정 레이트에 곱함(예: 레이트 * 0.5), “Value Add"는 레이트 기반 보정 계산 후의 값에 직접 가산합니다.
| |||||||||||
| applyPeriodScheduleEventId | string | ~ 1024자 | 버프를 적용할 이벤트의 개최 기간 GRN
이 버프의 유효 기간을 제어하는 GS2-Schedule 이벤트의 GRN입니다. 지정한 경우, 이벤트 개최 기간 중에만 버프가 적용됩니다. 지정하지 않은 경우, 버프는 항상 유효합니다. |
EzBuffTargetModel
버프 적용 대상 모델
버프 적용의 대상이 되는 GS2 리소스 모델과 필드를 정의합니다. 어떤 모델의 어떤 필드 값을 버프로 변경할지 지정하며, 대상 리소스 인스턴스를 특정하는 조건 GRN과 적용할 레이트 값을 포함합니다.
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| targetModelName | 문자열 열거형 enum { } | ✓ | 버프를 적용할 모델의 종류 | |||
| targetFieldName | string | ✓ | ~ 64자 | 버프 적용 대상 필드명 버프에 의해 값이 변경되는 대상 모델 상의 수치 필드명입니다. 예를 들어 경험치나 공격력 등의 수치 속성을 나타내는 필드가 대상이 됩니다. | ||
| conditionGrns | List<EzBuffTargetGrn> | ✓ | 1 ~ 10 items | 버프 적용 조건 GRN 목록 버프 적용의 대상 리소스 인스턴스를 특정하는 GRN 패턴의 목록입니다. 여러 GRN을 조합하여 리소스를 정확하게 특정하는 복합 조건을 구성합니다. | ||
| rate | float | ✓ | 0 ~ 1000000 | 보정 레이트 적용되는 버프 값입니다. 적용 타입에 따라 의미가 다릅니다. “Rate Add"의 경우 기본 레이트에 가산, “Mul"의 경우 현재 레이트에 곱셈, “Value Add"의 경우 레이트 계산 후의 필드 값에 직접 가산됩니다. |
EzBuffTargetAction
버프 적용 대상 액션
버프 적용의 대상이 되는 GS2 액션과 파라미터를 정의합니다. 어떤 액션의 어떤 파라미터를 버프로 변경할지 지정하며, 대상 리소스 인스턴스를 특정하는 조건 GRN과 적용할 레이트 값을 포함합니다.
EzBuffTargetGrn
버프 적용 조건이 되는 리소스의 GRN 패턴
버프가 유효해지는 리소스 인스턴스를 좁히기 위한 조건 GRN 패턴입니다.
targetModelName 으로 GS2 서비스 모델의 종류를 특정하며, targetGrn 에는 런타임에 해결되는 컨텍스트 변수({region}, {ownerId})를 포함할 수 있습니다.
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| targetModelName | string | ✓ | ~ 64자 | 버프 적용 조건의 모델 이름 조건 GRN을 해결하기 위해 사용되는 GS2 서비스 모델의 이름입니다. GRN 패턴이 어느 서비스의 리소스 모델을 참조하는지를 특정합니다. | ||
| targetGrn | string | ✓ | ~ 1024자 | 버프의 적용 조건 GRN 런타임에 해결되는 컨텍스트 플레이스홀더(예: {region}, {ownerId})를 포함한 GRN 템플릿입니다. 버프의 대상이 되는 특정 리소스 인스턴스를 특정하기 위해 사용됩니다. |
메서드
getBuffEntryModel
이름으로 버프 정의 조회
이름을 지정하여 버프 엔트리 모델을 1건 조회합니다.
조회되는 정보에는 적용 방법(Rate Add / Mul / Value Add), 버프의 대상,
우선순위, 그리고 설정되어 있는 경우 버프가 활성화되는 이벤트 기간이 포함됩니다.
특정 버프의 효과 내용이나 활성 기간 등의 상세 정보를 표시할 때 사용합니다.
Request
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| buffEntryName | string | ✓ | ~ 128자 | 버프 엔트리 모델 이름 버프 엔트리 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
Result
| 타입 | 설명 | |
|---|---|---|
| item | EzBuffEntryModel | 버프 엔트리 모델 |
구현 예제
var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
).BuffEntryModel(
buffEntryName: "character-level"
);
var item = await domain.ModelAsync(); var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
).BuffEntryModel(
buffEntryName: "character-level"
);
var future = domain.ModelFuture();
yield return future;
var item = future.Result; const auto Domain = Gs2->Buff->Namespace(
"namespace-0001" // namespaceName
)->BuffEntryModel(
"character-level" // buffEntryName
);
const auto Future = Domain->Model();
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}var domain = ez.buff.namespace_(
"namespace-0001"
).buff_entry_model(
"character-level"
)
var async_result = await domain.model()
if async_result.error != null:
push_error(str(async_result.error))
return
var result = async_result.result값 변경 이벤트 핸들링
var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
).BuffEntryModel(
buffEntryName: "character-level"
);
// 이벤트 핸들링 시작
var callbackId = domain.Subscribe(
value => {
// 값이 변화했을 때 호출됨
// value에는 변경 후의 값이 전달됨
}
);
// 이벤트 핸들링 정지
domain.Unsubscribe(callbackId); var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
).BuffEntryModel(
buffEntryName: "character-level"
);
// 이벤트 핸들링 시작
var callbackId = domain.Subscribe(
value => {
// 값이 변화했을 때 호출됨
// value에는 변경 후의 값이 전달됨
}
);
// 이벤트 핸들링 정지
domain.Unsubscribe(callbackId); const auto Domain = Gs2->Buff->Namespace(
"namespace-0001" // namespaceName
)->BuffEntryModel(
"character-level" // buffEntryName
);
// 이벤트 핸들링 시작
const auto CallbackId = Domain->Subscribe(
[](TSharedPtr<Gs2::Buff::Model::FBuffEntryModel> value) {
// 값이 변화했을 때 호출됨
// value에는 변경 후의 값이 전달됨
}
);
// 이벤트 핸들링 정지
Domain->Unsubscribe(CallbackId);var domain = ez.buff.namespace_(
"namespace-0001"
).buff_entry_model(
"character-level"
)
# 이벤트 핸들링 시작
var callback_id = domain.subscribe_model(func(value):
# 값이 변화했을 때 호출됨
# value에는 변경 후의 값이 전달됩니다
pass
)
# 이벤트 핸들링 정지
domain.unsubscribe_model(callback_id)이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.
로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.
따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.
listBuffEntryModels
버프 엔트리 모델 목록 조회
이 네임스페이스에 등록된 모든 버프 엔트리 모델을 조회합니다.
각 버프 엔트리 모델은 하나의 버프 효과를 정의합니다.
대상(모델의 스탯이나 액션의 파라미터), 적용 방법(Rate Add / Mul / Value Add), 우선순위,
그리고 선택적으로 버프가 활성화되는 이벤트 기간이 포함됩니다.
게임 UI에서 버프 목록을 표시하거나, 현재 설정된 버프를 확인할 때 사용합니다.
Request
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
Result
| 타입 | 설명 | |
|---|---|---|
| items | List<EzBuffEntryModel> | 버프 엔트리 모델 목록 |
구현 예제
var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
);
var items = await domain.BuffEntryModelsAsync(
).ToListAsync(); var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
);
var it = domain.BuffEntryModels(
);
List<EzBuffEntryModel> items = new List<EzBuffEntryModel>();
while (it.HasNext())
{
yield return it.Next();
if (it.Error != null)
{
onError.Invoke(it.Error, null);
break;
}
if (it.Current != null)
{
items.Add(it.Current);
}
else
{
break;
}
} const auto Domain = Gs2->Buff->Namespace(
"namespace-0001" // namespaceName
);
const auto It = Domain->BuffEntryModels(
);
TArray<Gs2::UE5::Buff::Model::FEzBuffEntryModelPtr> Result;
for (auto Item : *It)
{
if (Item.IsError())
{
return false;
}
Result.Add(Item.Current());
}값 변경 이벤트 핸들링
var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
);
// 이벤트 핸들링 시작
var callbackId = domain.SubscribeBuffEntryModels(
() => {
// 리스트의 요소가 변화했을 때 호출됨
}
);
// 이벤트 핸들링 정지
domain.UnsubscribeBuffEntryModels(callbackId); var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
);
// 이벤트 핸들링 시작
var callbackId = domain.SubscribeBuffEntryModels(
() => {
// 리스트의 요소가 변화했을 때 호출됨
}
);
// 이벤트 핸들링 정지
domain.UnsubscribeBuffEntryModels(callbackId); const auto Domain = Gs2->Buff->Namespace(
"namespace-0001" // namespaceName
);
// 이벤트 핸들링 시작
const auto CallbackId = Domain->SubscribeBuffEntryModels(
[]() {
// 리스트의 요소가 변화했을 때 호출됨
}
);
// 이벤트 핸들링 정지
Domain->UnsubscribeBuffEntryModels(CallbackId);이 이벤트는 SDK가 가진 로컬 캐시의 값이 변경되었을 때 호출됩니다.
로컬 캐시는 SDK가 가진 API의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-Distributor를 통한 스탬프 시트의 실행, 또는 GS2-Gateway의 알림을 활성화한 GS2-JobQueue의 실행에 의해 변화한 것만이 대상이 됩니다.
따라서 이 방법 이외로 값이 변경된 경우 콜백은 호출되지 않습니다.
applyBuff
현재 플레이어에게 버프 적용
이 네임스페이스에 등록된 모든 버프 설정을 평가하여, 조건에 맞는 것을 플레이어에게 적용합니다.
예를 들어 “이벤트 중 경험치 2배”, “특정 아이템 소지 시 골드 드롭률 +10%“와 같은 버프를 설정할 수 있습니다.
버프의 적용 방법은 3가지가 있습니다:
- Rate Add: 배율에 가산합니다(예: 기본 1.0 + 0.2 = 1.2배)
- Mul: 현재 배율에 곱합니다(예: 배율 × 0.5)
- Value Add: 배율 계산 후의 값에 고정값을 가산합니다
GS2-Schedule 이벤트에 연동된 버프는 해당 이벤트 개최 기간 동안만 유효합니다.
여러 버프는 우선순위 순서로 적용됩니다(값이 작을수록 우선순위가 높음).
Request
| 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128자 | 네임스페이스 이름 네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. | ||
| gameSession | GameSession | ✓ | GameSession |
Result
| 타입 | 설명 | |
|---|---|---|
| items | List<EzBuffEntryModel> | 적용한 버프 목록 |
| newContextStack | string | 버프의 적용 상태를 기록한 컨텍스트 |
구현 예제
var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Buff(
);
var result = await domain.ApplyBuffAsync(
);
var item = await result.ModelAsync(); var domain = gs2.Buff.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Buff(
);
var future = domain.ApplyBuffFuture(
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.ModelFuture();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result; const auto Domain = Gs2->Buff->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->Buff(
);
const auto Future = Domain->ApplyBuff(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// 변경된 값 / 결과 값을 취득
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();var domain = ez.buff.namespace_(
"namespace-0001"
).me(game_session).buff(
)
var async_result = await domain.apply_buff(
)
if async_result.error != null:
push_error(str(async_result.error))
return
var result = async_result.result