MayHeCome/Assets/Scripts/GameObjectPool.cs
2024-12-18 17:55:34 +08:00

74 lines
2.8 KiB
C#

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<GameObjectPool>
{
public Dictionary<string, List<GameObject>> 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<GameObject>();
}
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<GameObject>(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<RectTransform>();
IconCanvas = GameObject.Find("Canvas").GetComponent<Canvas>();
go.transform.SetParent(IconCanvas.transform);
rect.anchoredPosition = Vector2.zero;
// IconCanvas.worldCamera.WorldToScreenPoint(source.transform.position);
// go.GetComponent<RectTransform>().anchoredPosition = R;
TargetIcon = GameObject.Find("Canvas/TopBar/FaithStatus/FaithCountLabel").GetComponent<TextMeshProUGUI>();
// 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;
}
}