using GUPS.AntiCheat.Protected; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; public enum eMiniGameObtacleType { White, Red, HpHeal, AlbumOpen, ChatCoin, GachaCoin, ItemBomb, ItemUmbrella, ItemDildo } public class MiniGameObtacle : MonoBehaviour { public RectTransform m_RectTransform; public Rigidbody2D m_Rigidbody2D; public Image i_img; public RectTransform tf_objend; eMiniGameObtacleType m_Type; ProtectedInt32 m_Dmg; public void Set(Dictionary dic_weight, RectTransform rtend) { gameObject.SetActive(true); SetRandomTypeByWeight(dic_weight); tf_objend = rtend; m_Rigidbody2D.gravityScale = Random.Range(table_GlobalValue.Ins.Get_Float("MiniGameSpeedMin"), table_GlobalValue.Ins.Get_Float("MiniGameSpeedMax")); var x = (Screen.width >> 1) - 50; m_RectTransform.anchoredPosition = new Vector2(Random.Range(-x, x), 0f); Set_Item(); i_img.transform.eulerAngles = Vector3.zero; void SetRandomTypeByWeight(Dictionary dic_weight) { // 총합 int totalWeight = dic_weight.Values.Sum(); if (totalWeight <= 0) { Debug.LogWarning("가중치 총합이 0 이하입니다. 기본값으로 White 선택."); m_Type = eMiniGameObtacleType.White; return; } // 랜덤 뽑기 int rand = Random.Range(0, totalWeight); int cumulative = 0; foreach (var pair in dic_weight) { cumulative += pair.Value; if (rand < cumulative) { m_Type = pair.Key; return; } } } } void Set_Item() { switch (m_Type) { case eMiniGameObtacleType.White: i_img.sprite = UIAtlasMgr.Ins.Get_Sprite("icon 1_mini game"); m_Dmg = table_GlobalValue.Ins.Get_Int("MiniGame_White_DMG"); break; case eMiniGameObtacleType.Red: i_img.sprite = UIAtlasMgr.Ins.Get_Sprite("icon 2_mini game"); m_Dmg = table_GlobalValue.Ins.Get_Int("MiniGame_Red_DMG"); break; case eMiniGameObtacleType.AlbumOpen: i_img.sprite = UIAtlasMgr.Ins.Get_Sprite(eMoney.AlbumOpen); m_Dmg = table_GlobalValue.Ins.Get_Int("MiniGame_Heart_Amount"); break; case eMiniGameObtacleType.ChatCoin: i_img.sprite = UIAtlasMgr.Ins.Get_Sprite(eMoney.Chat); m_Dmg = table_GlobalValue.Ins.Get_Int("MiniGame_ChatCoin_Amount"); break; case eMiniGameObtacleType.GachaCoin: i_img.sprite = UIAtlasMgr.Ins.Get_Sprite(eMoney.Gacha); m_Dmg = table_GlobalValue.Ins.Get_Int("MiniGame_GachaCoin_Amount"); break; case eMiniGameObtacleType.HpHeal: i_img.sprite = UIAtlasMgr.Ins.Get_Sprite("icon 5_mini game"); m_Dmg = table_GlobalValue.Ins.Get_Int("MiniGame_Heal"); break; case eMiniGameObtacleType.ItemBomb: i_img.sprite = UIAtlasMgr.Ins.Get_Sprite("item_bomb"); m_Dmg = 1; break; case eMiniGameObtacleType.ItemUmbrella: i_img.sprite = UIAtlasMgr.Ins.Get_Sprite("item_umbrella"); m_Dmg = 1; break; case eMiniGameObtacleType.ItemDildo: i_img.sprite = UIAtlasMgr.Ins.Get_Sprite("item_dildo"); m_Dmg = 1; break; } m_Dmg.Obfuscate(); i_img.SetNativeSize(); if (m_Type == eMiniGameObtacleType.AlbumOpen || m_Type == eMiniGameObtacleType.ChatCoin || m_Type == eMiniGameObtacleType.GachaCoin) i_img.transform.localScale = Vector3.one * 0.5f; else i_img.transform.localScale = Vector3.one; } public void Change_Item(Dictionary dic_weight) { switch (m_Type) { case eMiniGameObtacleType.White: case eMiniGameObtacleType.Red: case eMiniGameObtacleType.HpHeal: case eMiniGameObtacleType.ItemBomb: case eMiniGameObtacleType.ItemUmbrella: case eMiniGameObtacleType.ItemDildo: { // 후보 아이템 리스트 var candidates = new List { eMiniGameObtacleType.AlbumOpen, eMiniGameObtacleType.ChatCoin, eMiniGameObtacleType.GachaCoin }; // 총 가중치 합 int totalWeight = 0; foreach (var c in candidates) { if (dic_weight.TryGetValue(c, out int w)) totalWeight += w; } if (totalWeight <= 0) return; // 가중치가 전혀 없으면 리턴 // 랜덤 값 int rand = Random.Range(0, totalWeight); // 가중치 누적하면서 선택 foreach (var c in candidates) { if (!dic_weight.TryGetValue(c, out int w)) continue; if (rand < w) { m_Type = c; // 선택된 아이템으로 교체 break; } rand -= w; } } break; } Set_Item(); } private void Update() { if (m_RectTransform.position.y < tf_objend.position.y) { Off(false); } } public void Off_OnlyObtacle() { if (m_Type == eMiniGameObtacleType.White || m_Type == eMiniGameObtacleType.Red) Off(true); } void Off(bool showeffect, bool playsound = true) { gameObject.SetActive(false); if (showeffect) { LobbyUI.Ins.m_Game_Mini.Show_HitEffect(m_RectTransform.position); if (playsound) SoundInfo.Ins.Play_OneShot(eSound.s002_Bubble, 1f); } } private void OnTriggerEnter2D(Collider2D collision) { if (collision.tag.Equals("Player")) { Off(true); LobbyUI.Ins.m_Game_Mini.Hit(m_Type, m_Dmg); } } }