using GUPS.AntiCheat.Protected; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; public class Game_Lucky : MonoBehaviour { public TextMeshProUGUI[] texts; // 0 시간, 1 획득 재화 public GameObject go_dropobj; // 떨어질 공 prefab public Transform tf_cup; // 컵 (움직이고 회전하는 부분) public Transform tf_cupin; // 컵 안 (공들이 들어가는 위치 부모) List list_dropobj = new List(); // 회전 관련 변수 private bool isRotating = false; private float targetZ = 0f; private float rotateSpeed = 150f; // 초당 몇 도 회전할지 bool bRotCup = false; ProtectedFloat m_Time; ProtectedInt32 _get; public int m_Amount { get { return _get; } set { _get = value; _get.Obfuscate(); } } ProtectedInt32 _bb; public int m_BubbleAmount { get { return _bb; } set { _bb = value; _bb.Obfuscate(); } } ProtectedInt32 TotalBubbleAmount = 50; public void Set() { gameObject.SetActive(true); bRotCup = false; // tf_cup 초기화 tf_cup.localPosition = Vector3.zero; tf_cup.rotation = Quaternion.Euler(0, 0, 0); // list_dropobj.Count 가 0 이면 50개 생성해서 tf_cupin 안에 넣기 if (list_dropobj.Count == 0) { TotalBubbleAmount.Obfuscate(); for (int i = 0; i < TotalBubbleAmount; i++) { GameObject obj = Instantiate(go_dropobj, tf_cupin); obj.transform.localPosition = Get_CupInLocalPos(); list_dropobj.Add(obj); } } Set_Ball(); Init_game(); Set_Texts(); } void Set_Ball() { list_dropobj.ForEach(f => f.GetComponent().Init(Get_CupInLocalPos())); // 컵 안에서 시작 //list_dropobj.ForEach(f => f.GetComponent().gravityScale = Random.Range(0.01f, 0.3f)); } void Init_game() { Time.timeScale = 1f; m_Time = 30f; m_Time.Obfuscate(); m_Amount = 0; m_BubbleAmount = 0; } void Set_Texts() { texts[0].text = m_Time.Value.ToString("N0"); texts[1].text = m_Amount.ToString(); } 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() { list_dropobj.ForEach(f => f.GetComponent().StopObj()); yield return new WaitForSecondsRealtime(3f); // TODO : 결과 보여주기 (결과 화면 나갈 때, Time.timeScale = 1f; 필수) gameObject.SetActive(false); // 지금은 그냥 나가기 } Vector3 Get_CupInLocalPos() { return new Vector3(Random.Range(-50f, 50f), 30f + Random.Range(-50f, 50f), 0f); } public void OnMyDrag() { if (!bRotCup) { // 마우스/터치 입력 위치 → 월드 좌표 변환 Vector3 mousePos = Input.mousePosition; Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos); // tf_cup을 터치한 위치의 x 값만 받아서 거기에 위치시킴 Vector3 cupPos = tf_cup.position; cupPos.x = worldPos.x; tf_cup.position = cupPos; } } public void OnClick_Screen() { if (bRotCup) { gameObject.SetActive(false); return; } bRotCup = true; // 마우스/터치 입력 위치 → 월드 좌표 변환 Vector3 mousePos = Input.mousePosition; Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos); // tf_cup을 터치한 위치의 x 값만 받아서 거기에 위치시킴 Vector3 cupPos = tf_cup.position; cupPos.x = worldPos.x; tf_cup.position = cupPos; // 회전 시작 (목표: -150도) targetZ = -150f; isRotating = true; list_dropobj.ForEach(f => f.GetComponent().Tilt_Cup()); } 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; } } if (m_Time > 0f) { m_Time -= Time.deltaTime; Debug.Log(m_Time); Set_Texts(); if (m_Time <= 0f) GameOver(); } } }