뽑기 보상 데이터 획득까지

This commit is contained in:
Ino 2025-09-12 13:54:04 +09:00
parent cb03719e5b
commit b0f3d07a86
18 changed files with 2721 additions and 8 deletions

View File

@ -15,7 +15,7 @@ MonoBehaviour:
m_DefaultGroup: 965ebc3298ffc3f429a28032069aceb5
m_currentHash:
serializedVersion: 2
Hash: bec6c0dd3465e4efbf0bd870c628a769
Hash: f1a544726123312496592bc759becd92
m_OptimizeCatalogSize: 0
m_BuildRemoteCatalog: 0
m_CatalogRequestsTimeout: 0

View File

@ -0,0 +1 @@
[{"n_GachaGrade": "1", "n_GachaGradeRate": "100000"}, {"n_GachaGrade": "2", "n_GachaGradeRate": "60000"}, {"n_GachaGrade": "3", "n_GachaGradeRate": "30000"}, {"n_GachaGrade": "4", "n_GachaGradeRate": "5000"}, {"n_GachaGrade": "5", "n_GachaGradeRate": "2500"}, {"n_GachaGrade": "6", "n_GachaGradeRate": "1000"}, {"n_GachaGrade": "7", "n_GachaGradeRate": "500"}, {"n_GachaGrade": "8", "n_GachaGradeRate": "10"}]

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e54692b0a16f5db49aa99bb4736ebdc5
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1 @@
[{"n_GachaGrade": "1", "e_GachaRewardType": "AlbumOpen", "n_GachaRate": "10", "n_RewardMinCount": "10", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1.5"}, {"n_GachaGrade": "1", "e_GachaRewardType": "Chat", "n_GachaRate": "1", "n_RewardMinCount": "5", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "1", "e_GachaRewardType": "Gacha", "n_GachaRate": "100", "n_RewardMinCount": "1", "n_RewardMaxCount": "1", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "1", "e_GachaRewardType": "Lucky", "n_GachaRate": "50", "n_RewardMinCount": "1", "n_RewardMaxCount": "2", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "2", "e_GachaRewardType": "AlbumOpen", "n_GachaRate": "10", "n_RewardMinCount": "10", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1.5"}, {"n_GachaGrade": "2", "e_GachaRewardType": "Chat", "n_GachaRate": "1", "n_RewardMinCount": "5", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "2", "e_GachaRewardType": "Gacha", "n_GachaRate": "100", "n_RewardMinCount": "1", "n_RewardMaxCount": "1", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "2", "e_GachaRewardType": "Lucky", "n_GachaRate": "50", "n_RewardMinCount": "1", "n_RewardMaxCount": "2", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "3", "e_GachaRewardType": "AlbumOpen", "n_GachaRate": "10", "n_RewardMinCount": "10", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1.5"}, {"n_GachaGrade": "3", "e_GachaRewardType": "Chat", "n_GachaRate": "1", "n_RewardMinCount": "5", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "3", "e_GachaRewardType": "Gacha", "n_GachaRate": "100", "n_RewardMinCount": "1", "n_RewardMaxCount": "1", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "3", "e_GachaRewardType": "Lucky", "n_GachaRate": "50", "n_RewardMinCount": "1", "n_RewardMaxCount": "2", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "4", "e_GachaRewardType": "AlbumOpen", "n_GachaRate": "10", "n_RewardMinCount": "10", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1.5"}, {"n_GachaGrade": "4", "e_GachaRewardType": "Chat", "n_GachaRate": "1", "n_RewardMinCount": "5", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "4", "e_GachaRewardType": "Gacha", "n_GachaRate": "100", "n_RewardMinCount": "1", "n_RewardMaxCount": "1", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "4", "e_GachaRewardType": "Lucky", "n_GachaRate": "50", "n_RewardMinCount": "1", "n_RewardMaxCount": "2", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "5", "e_GachaRewardType": "AlbumOpen", "n_GachaRate": "10", "n_RewardMinCount": "10", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1.5"}, {"n_GachaGrade": "5", "e_GachaRewardType": "Chat", "n_GachaRate": "1", "n_RewardMinCount": "5", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "5", "e_GachaRewardType": "Gacha", "n_GachaRate": "100", "n_RewardMinCount": "1", "n_RewardMaxCount": "1", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "5", "e_GachaRewardType": "Lucky", "n_GachaRate": "50", "n_RewardMinCount": "1", "n_RewardMaxCount": "2", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "6", "e_GachaRewardType": "AlbumOpen", "n_GachaRate": "10", "n_RewardMinCount": "10", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1.5"}, {"n_GachaGrade": "6", "e_GachaRewardType": "Chat", "n_GachaRate": "1", "n_RewardMinCount": "5", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "6", "e_GachaRewardType": "Gacha", "n_GachaRate": "100", "n_RewardMinCount": "1", "n_RewardMaxCount": "1", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "6", "e_GachaRewardType": "Lucky", "n_GachaRate": "50", "n_RewardMinCount": "1", "n_RewardMaxCount": "2", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "7", "e_GachaRewardType": "AlbumOpen", "n_GachaRate": "10", "n_RewardMinCount": "10", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1.5"}, {"n_GachaGrade": "7", "e_GachaRewardType": "Chat", "n_GachaRate": "1", "n_RewardMinCount": "5", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "7", "e_GachaRewardType": "Gacha", "n_GachaRate": "100", "n_RewardMinCount": "1", "n_RewardMaxCount": "1", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "7", "e_GachaRewardType": "Lucky", "n_GachaRate": "50", "n_RewardMinCount": "1", "n_RewardMaxCount": "2", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "8", "e_GachaRewardType": "AlbumOpen", "n_GachaRate": "10", "n_RewardMinCount": "10", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1.5"}, {"n_GachaGrade": "8", "e_GachaRewardType": "Chat", "n_GachaRate": "1", "n_RewardMinCount": "5", "n_RewardMaxCount": "20", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "8", "e_GachaRewardType": "Gacha", "n_GachaRate": "100", "n_RewardMinCount": "1", "n_RewardMaxCount": "1", "f_LuckyBonusRate": "1"}, {"n_GachaGrade": "8", "e_GachaRewardType": "Lucky", "n_GachaRate": "50", "n_RewardMinCount": "1", "n_RewardMaxCount": "2", "f_LuckyBonusRate": "1"}]

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 222361f77d66c3144a8590dd2c3da445
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -13,6 +13,8 @@ GameObject:
- component: {fileID: 4248464231039979418}
- component: {fileID: 3406607454547331508}
- component: {fileID: -8931448971597107390}
- component: {fileID: 7007693330691602423}
- component: {fileID: 1208839188713729391}
m_Layer: 0
m_Name: Tables
m_TagString: Untagged
@ -86,3 +88,29 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_json: {fileID: 4900000, guid: 608c6faf21aacec4cadeca7d022b9546, type: 3}
--- !u!114 &7007693330691602423
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4255407216469596348}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0ae15d3fbc50f9c49ad619966ac6566b, type: 3}
m_Name:
m_EditorClassIdentifier:
m_json: {fileID: 4900000, guid: e54692b0a16f5db49aa99bb4736ebdc5, type: 3}
--- !u!114 &1208839188713729391
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4255407216469596348}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ef3ead03c5c7c0444b148dfc707dc0fe, type: 3}
m_Name:
m_EditorClassIdentifier:
m_json: {fileID: 4900000, guid: 222361f77d66c3144a8590dd2c3da445, type: 3}

Binary file not shown.

View File

@ -0,0 +1,65 @@
using GUPS.AntiCheat.Protected;
using Newtonsoft.Json;
using System.Collections.Generic;
public class gacharateconfigtabledata
{
protected ProtectedInt32 _n_GachaGrade;
public int n_GachaGrade
{
get { return _n_GachaGrade; }
set { _n_GachaGrade = value; _n_GachaGrade.Obfuscate(); }
}
protected ProtectedInt32 _n_GachaGradeRate;
public int n_GachaGradeRate
{
get { return _n_GachaGradeRate; }
set { _n_GachaGradeRate = value; _n_GachaGrade.Obfuscate(); }
}
}
public class table_gacharateconfig : table_base
{
public static table_gacharateconfig Ins;
List<gacharateconfigtabledata> tableDatas;
protected override void Awake()
{
Ins = this;
base.Awake();
}
protected override void Start()
{
tableDatas = JsonConvert.DeserializeObject<List<gacharateconfigtabledata>>(json_last);
base.Start();
}
public gacharateconfigtabledata Get_RadomData()
{
if (tableDatas == null || tableDatas.Count == 0)
return null;
int totalRate = 0;
foreach (var data in tableDatas)
{
totalRate += data.n_GachaGradeRate;
}
// 1 ~ totalRate 사이 난수 생성
int rand = UnityEngine.Random.Range(1, totalRate + 1);
int cumulative = 0;
foreach (var data in tableDatas)
{
cumulative += data.n_GachaGradeRate;
if (rand <= cumulative)
return data;
}
// fallback (논리상 여기 안 옴)
return tableDatas[tableDatas.Count - 1];
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 0ae15d3fbc50f9c49ad619966ac6566b

View File

@ -0,0 +1,104 @@
using GUPS.AntiCheat.Protected;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class gacharewardtabledata
{
protected ProtectedInt32 _n_GachaGrade;
public int n_GachaGrade
{
get { return _n_GachaGrade; }
set { _n_GachaGrade = value; _n_GachaGrade.Obfuscate(); }
}
protected ProtectedInt32 _n_GachaRate;
public int n_GachaRate
{
get { return _n_GachaRate; }
set { _n_GachaRate = value; _n_GachaRate.Obfuscate(); }
}
protected ProtectedInt32 _n_RewardMinCount;
public int n_RewardMinCount
{
get { return _n_RewardMinCount; }
set { _n_RewardMinCount = value; _n_RewardMinCount.Obfuscate(); }
}
protected ProtectedInt32 _n_RewardMaxCount;
public int n_RewardMaxCount
{
get { return _n_RewardMaxCount; }
set { _n_RewardMaxCount = value; _n_RewardMaxCount.Obfuscate(); }
}
public eMoney e_GachaRewardType; // enum은 그대로 유지
protected ProtectedFloat _f_LuckyBonusRate;
public float f_LuckyBonusRate
{
get { return _f_LuckyBonusRate; }
set { _f_LuckyBonusRate = value; _f_LuckyBonusRate.Obfuscate(); }
}
}
public class table_gachareward : table_base
{
public static table_gachareward Ins;
List<gacharewardtabledata> tableDatas;
protected override void Awake()
{
Ins = this;
base.Awake();
}
protected override void Start()
{
tableDatas = JsonConvert.DeserializeObject<List<gacharewardtabledata>>(json_last);
base.Start();
}
public (eMoney, int) Get_Reward(int grade)
{
// grade에 맞는 모든 보상 후보 가져오기
var candidates = tableDatas.Where(d => d.n_GachaGrade == grade).ToList();
if (candidates.Count == 0)
{
Debug.LogError($"[table_gachareward] No reward found for grade {grade}");
return (default(eMoney), 0);
}
// 가중치 합산
int totalRate = candidates.Sum(d => d.n_GachaRate);
// 랜덤 값 뽑기
int rand = Random.Range(0, totalRate);
int accum = 0;
gacharewardtabledata selected = null;
foreach (var c in candidates)
{
accum += c.n_GachaRate;
if (rand < accum)
{
selected = c;
break;
}
}
if (selected == null)
{
Debug.LogError($"[table_gachareward] Failed to select reward for grade {grade}");
return (default(eMoney), 0);
}
// 보상 개수 랜덤
int count = Random.Range(selected.n_RewardMinCount, selected.n_RewardMaxCount + 1);
return (selected.e_GachaRewardType, count);
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: ef3ead03c5c7c0444b148dfc707dc0fe

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,155 @@
fileFormatVersion: 2
guid: c45b32b44486408478ebd2261e7e3a1f
TextureImporter:
internalIDToNameTable:
- first:
213: -2030814768571935651
second: ad icon_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: ad icon_0
rect:
serializedVersion: 2
x: 0
y: 10
width: 63
height: 44
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: d5417aa4ab811d3e0800000000000000
internalID: -2030814768571935651
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@ -0,0 +1,155 @@
fileFormatVersion: 2
guid: 675de6444dcdbeb4cb98763bbd3eddcb
TextureImporter:
internalIDToNameTable:
- first:
213: -7090185713337039704
second: treasure_box_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: treasure_box_0
rect:
serializedVersion: 2
x: 38
y: 27
width: 444
height: 433
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 8a40ffcb8a99a9d90800000000000000
internalID: -7090185713337039704
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a3de008f0170cea44956d41328e7746b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -6,4 +6,11 @@ public class GachaUI : MonoBehaviour
{
gameObject.SetActive(true);
}
public void OnClick_Gacha()
{
var gradedata = table_gacharateconfig.Ins.Get_RadomData();
var reward = table_gachareward.Ins.Get_Reward(gradedata.n_GachaGrade);
Debug.Log(reward);
}
}