using System.Collections; using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; using DG.Tweening; using TMPro; using UnityEngine; public class GameObjectPool : Singleton { public Dictionary> storedObject = new(); public Canvas IconCanvas; public TextMeshProUGUI TargetIcon; public void CreateDebugSphere(Vector3 position) { var s = GameObject.CreatePrimitive(PrimitiveType.Sphere); s.transform.position = position; } public GameObject Spawn(string resourcePath, Vector3 position = default, Quaternion rotation = default) { if (!storedObject.ContainsKey(resourcePath)) { storedObject[resourcePath] = new List(); } var availableObject = storedObject[resourcePath].Where(o => !o.activeSelf); GameObject result = null; var gameObjects = availableObject as GameObject[] ?? availableObject.ToArray(); if (!gameObjects.Any()) { //如果一个可用的都找不出来的话,就去生成 result = Instantiate(Resources.Load(resourcePath), position, rotation); storedObject[resourcePath].Add(result); } else { result = gameObjects.First(); result.transform.position = position; result.transform.rotation = rotation; } result.SetActive(true); return result; } public async UniTaskVoid GenerateIcon(GameObject source) { var go = GameObjectPool.Instance.Spawn("ResourceIcon"); var rect = go.GetComponent(); IconCanvas = GameObject.Find("Canvas").GetComponent(); go.transform.SetParent(IconCanvas.transform); rect.anchoredPosition = Vector2.zero; // IconCanvas.worldCamera.WorldToScreenPoint(source.transform.position); // go.GetComponent().anchoredPosition = R; TargetIcon = GameObject.Find("Canvas/TopBar/FaithStatus/FaithCountLabel").GetComponent(); // print($"from {go.transform.position} to {TargetIcon.rectTransform.anchoredPosition}"); // var tweenSequence = DOTween.Sequence(); var randTime = Random.Range(0.2f, 0.8f); await rect.DOAnchorPos((Random.insideUnitCircle - Vector2.down) * 100, 0.2f); await UniTask.WaitForSeconds(0.1f); rect.DOMoveX(TargetIcon.rectTransform.position.x, randTime).SetEase(ArrayUtils.UIEasing.RandomPick()); await rect.DOMoveY(TargetIcon.rectTransform.position.y, randTime).SetEase(ArrayUtils.UIEasing.RandomPick()); // print("resource icon ++"); go.SetActive(false); // TargetIcon.rectTransform.DOPunchScale(Vector3.one, 0.1f); GameProcedureManager.Instance.FaithCount += 1; } }