Shegotwet/Assets/Scripts/Game/Game_Lucky.cs

245 lines
7.4 KiB
C#
Raw Normal View History

2025-09-12 19:39:24 +00:00
using GUPS.AntiCheat.Protected;
2025-09-12 20:15:49 +00:00
using System.Collections;
2025-09-12 12:48:21 +00:00
using System.Collections.Generic;
2025-09-12 19:39:24 +00:00
using TMPro;
2025-09-12 12:48:21 +00:00
using UnityEngine;
2025-09-13 04:33:26 +00:00
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
2025-09-12 12:48:21 +00:00
public class Game_Lucky : MonoBehaviour
{
2025-09-13 02:32:17 +00:00
public Game_Lucky_Result m_Game_Lucky_Result;
2025-09-18 07:13:50 +00:00
public Image i_girl, i_girlsd;
2025-09-13 04:40:43 +00:00
public GameObject[] gos_boobs;
2025-09-12 19:39:24 +00:00
public TextMeshProUGUI[] texts; // 0 시간, 1 획득 재화
2025-09-12 12:48:21 +00:00
public GameObject go_dropobj; // 떨어질 공 prefab
public Transform tf_cup; // 컵 (움직이고 회전하는 부분)
public Transform tf_cupin; // 컵 안 (공들이 들어가는 위치 부모)
List<GameObject> list_dropobj = new List<GameObject>();
public List<LuckyRandomBlock> list_randomblock;
2025-09-12 12:48:21 +00:00
// 회전 관련 변수
private bool isRotating = false;
private float targetZ = 0f;
private float rotateSpeed = 150f; // 초당 몇 도 회전할지
2025-09-18 06:55:43 +00:00
float Cup_minX, Cup_maxX;
[SerializeField] private float cupMargin = 128.5f; // 간격
2025-09-12 12:48:21 +00:00
bool bRotCup = false, updateTime = false;
2025-09-12 19:39:24 +00:00
ProtectedFloat m_Time;
ProtectedInt32 _get; public int m_Amount { get { return _get; } set { _get = value; _get.Obfuscate(); } }
2025-09-12 20:15:49 +00:00
ProtectedInt32 _bb; public int m_BubbleAmount { get { return _bb; } set { _bb = value; _bb.Obfuscate(); } }
ProtectedInt32 TotalBubbleAmount = 50;
2025-09-12 12:48:21 +00:00
2025-09-18 07:13:50 +00:00
AsyncOperationHandle m_Handle, m_HandleSD;
2025-09-13 04:33:26 +00:00
2025-09-18 06:55:43 +00:00
private void Awake()
{
// 화면 좌표 (0,0) → 월드 좌표
Vector3 leftWorld = Camera.main.ScreenToWorldPoint(
new Vector3(0 + cupMargin, Screen.height / 2f, Camera.main.nearClipPlane));
// 화면 좌표 (Screen.width,0) → 월드 좌표
Vector3 rightWorld = Camera.main.ScreenToWorldPoint(
new Vector3(Screen.width - cupMargin, Screen.height / 2f, Camera.main.nearClipPlane));
Cup_minX = leftWorld.x;
Cup_maxX = rightWorld.x;
}
2025-09-12 12:48:21 +00:00
public void Set()
{
gameObject.SetActive(true);
2025-09-19 19:31:06 +00:00
SoundInfo.Ins.Play_BGM(eBGM.b007_LuckyGame);
2025-09-13 02:32:17 +00:00
m_Game_Lucky_Result.gameObject.SetActive(false);
2025-09-18 06:55:43 +00:00
ADInfo.Ins.Set_Banner(false);
2025-09-12 12:48:21 +00:00
bRotCup = false;
2025-09-13 04:33:26 +00:00
i_girl.enabled = false;
AddrResourceMgr.Ins.LoadObject<Sprite>($"Girl_LuckyGame/{SaveMgr.Ins.Get_SelectGirlID()}.png", handle =>
{
m_Handle = handle;
i_girl.enabled = true;
i_girl.sprite = handle.Result;
});
2025-09-18 07:13:50 +00:00
i_girlsd.enabled = false;
AddrResourceMgr.Ins.LoadObject<Sprite>($"Girl_Game/{SaveMgr.Ins.Get_SelectGirlID()}sd.png", handle =>
{
m_HandleSD = handle;
i_girlsd.enabled = true;
i_girlsd.sprite = handle.Result;
});
2025-09-13 04:40:43 +00:00
DSUtil.InActivateGameObjects(gos_boobs, SaveMgr.Ins.Get_SelectGirlID() - 1);
2025-09-13 04:33:26 +00:00
2025-09-12 19:39:24 +00:00
// tf_cup 초기화
tf_cup.localPosition = Vector3.zero;
2025-09-12 12:48:21 +00:00
tf_cup.rotation = Quaternion.Euler(0, 0, 0);
// list_dropobj.Count 가 0 이면 50개 생성해서 tf_cupin 안에 넣기
if (list_dropobj.Count == 0)
{
2025-09-12 20:15:49 +00:00
TotalBubbleAmount.Obfuscate();
for (int i = 0; i < TotalBubbleAmount; i++)
2025-09-12 12:48:21 +00:00
{
GameObject obj = Instantiate(go_dropobj, tf_cupin);
obj.transform.localPosition = Get_CupInLocalPos();
list_dropobj.Add(obj);
}
}
StartCoroutine(Co_Block());
2025-09-12 20:45:21 +00:00
2025-09-12 12:48:21 +00:00
Set_Ball();
2025-09-12 19:39:24 +00:00
Init_game();
Set_Texts();
2025-09-12 12:48:21 +00:00
}
void Set_Ball()
{
2025-09-12 19:39:24 +00:00
list_dropobj.ForEach(f => f.GetComponent<LuckyGameObj>().Init(Get_CupInLocalPos())); // 컵 안에서 시작
2025-09-12 12:48:21 +00:00
//list_dropobj.ForEach(f => f.GetComponent<Rigidbody2D>().gravityScale = Random.Range(0.01f, 0.3f));
}
2025-09-12 19:39:24 +00:00
void Init_game()
{
updateTime = true;
2025-09-12 19:39:24 +00:00
m_Time = 30f; m_Time.Obfuscate();
m_Amount = 0;
2025-09-12 20:15:49 +00:00
m_BubbleAmount = 0;
2025-09-12 19:39:24 +00:00
}
void Set_Texts()
{
texts[0].text = m_Time.Value.ToString("N0");
texts[1].text = m_Amount.ToString();
}
2025-09-12 20:15:49 +00:00
public void Add_Amount(int amout)
{
m_Amount += amout;
Set_Texts();
++m_BubbleAmount;
if (m_BubbleAmount >= TotalBubbleAmount)
GameOver();
}
void GameOver()
{
StartCoroutine(Co_GameOver());
}
IEnumerator Co_GameOver()
{
updateTime = false;
2025-09-12 20:15:49 +00:00
list_dropobj.ForEach(f => f.GetComponent<LuckyGameObj>().StopObj());
yield return new WaitForSecondsRealtime(0.5f);
2025-09-13 02:32:17 +00:00
m_Game_Lucky_Result.Set(m_Amount);
StopAllCoroutines();
2025-09-12 20:15:49 +00:00
}
2025-09-12 19:39:24 +00:00
2025-09-13 04:33:26 +00:00
public void ReleaseImage()
{
AddrResourceMgr.Ins.Relese(m_Handle);
i_girl.sprite = null;
2025-09-18 07:13:50 +00:00
AddrResourceMgr.Ins.Relese(m_HandleSD);
i_girlsd.sprite = null;
2025-09-13 04:33:26 +00:00
gameObject.SetActive(false);
}
2025-09-12 12:48:21 +00:00
Vector3 Get_CupInLocalPos()
{
2025-09-18 06:55:43 +00:00
return new Vector3(Random.Range(-50f, 50f), Random.Range(-50f, 50f), 0f);
2025-09-12 12:48:21 +00:00
}
public void OnMyDrag()
{
if (!bRotCup)
{
Vector3 mousePos = Input.mousePosition;
2025-09-18 06:55:43 +00:00
Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, Camera.main.nearClipPlane));
2025-09-12 12:48:21 +00:00
2025-09-18 06:55:43 +00:00
// 컵의 x 위치를 화면 경계 안으로 Clamp
2025-09-12 12:48:21 +00:00
Vector3 cupPos = tf_cup.position;
2025-09-18 06:55:43 +00:00
cupPos.x = Mathf.Clamp(worldPos.x, Cup_minX, Cup_maxX);
2025-09-12 12:48:21 +00:00
tf_cup.position = cupPos;
}
}
public void OnClick_Screen()
{
if (bRotCup)
{
return;
}
bRotCup = true;
// 마우스/터치 입력 위치 → 월드 좌표 변환
Vector3 mousePos = Input.mousePosition;
Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
// tf_cup을 터치한 위치의 x 값만 받아서 거기에 위치시킴
Vector3 cupPos = tf_cup.position;
cupPos.x = Mathf.Clamp(worldPos.x, Cup_minX, Cup_maxX);
2025-09-12 12:48:21 +00:00
tf_cup.position = cupPos;
// 회전 시작 (목표: -150도)
targetZ = -150f;
isRotating = true;
2025-09-12 20:15:49 +00:00
2025-09-19 20:24:20 +00:00
SoundInfo.Ins.Play_OneShot((eSound)Random.Range(14, 16));
2025-09-12 12:48:21 +00:00
}
private void Update()
{
if (isRotating)
{
// 현재 z 회전값
float currentZ = tf_cup.eulerAngles.z;
if (currentZ > 180f) currentZ -= 360f; // -180~180 범위로 맞추기
// 목표 각도로 부드럽게 이동
float newZ = Mathf.MoveTowards(currentZ, targetZ, rotateSpeed * Time.deltaTime);
tf_cup.rotation = Quaternion.Euler(0, 0, newZ);
// 목표 각도 도달했으면 정지
if (Mathf.Approximately(newZ, targetZ))
{
isRotating = false;
list_dropobj.ForEach(f => f.GetComponent<LuckyGameObj>().Tilt_Cup());
2025-09-12 12:48:21 +00:00
}
}
2025-09-12 19:39:24 +00:00
if (updateTime && m_Time > 0f)
2025-09-12 19:39:24 +00:00
{
m_Time -= Time.deltaTime;
Set_Texts();
if (m_Time <= 0f)
2025-09-12 20:15:49 +00:00
GameOver();
2025-09-12 19:39:24 +00:00
}
2025-09-12 12:48:21 +00:00
}
IEnumerator Co_Block()
{
list_randomblock.ForEach(f => f.Init());
LuckyRandomBlock PreBlock = null;
while (true)
{
for (int i = 0; i < list_randomblock.Count; i++)
{
if (!list_randomblock[i].IsMoving() && (PreBlock == null || PreBlock.IsCrossCenter()))
{
PreBlock = list_randomblock[i];
PreBlock.Move();
}
}
yield return null;
}
}
2025-09-12 12:48:21 +00:00
}