using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.EventSystems; public class GatheringBall : MonoBehaviour, IPointerClickHandler,IPointerEnterHandler,IPointerExitHandler { public float Radius = 10f; public Dictionary GatherBalls = new(); public Dictionary DivorceBalls = new(); public float Force = 10f; public int MaxCapacity = 100; private int count = 0; public GameObject GatheringBallObject; public ParticleSystem Releaserpc; public GameObject ExcludeFaithForce; private int curCapacityLevel = 0; private int[] Levels = new int[3]{ 100, 1000, 10000 }; void Update() { foreach (var balls in GatherBalls) { var ballTrans = balls.Key; var ballVelocity = balls.Value; ballVelocity += (transform.position - ballTrans.position) * Time.deltaTime; ballTrans.position += ballVelocity * (Time.deltaTime * Force); } } public void CapacityUpgrade() { //后面要补颜色变化逻辑 curCapacityLevel++; MaxCapacity = Levels[curCapacityLevel]; Debug.Log("curCapacity:"+MaxCapacity); } public void AddBall(GameObject gameObject, Vector3 position) { gameObject.transform.position = position; if (GatherBalls.Count > MaxCapacity) { DivorceBalls[gameObject.transform] = Vector3.zero; } else { gameObject.transform.SetParent(this.transform); GatherBalls[gameObject.transform] = Vector3.zero; } } //Max 3 public void AddFaith(int num) { //Debug.Log("CurrentFaith "+count); if (count + num <= MaxCapacity) { count+=num; GatheringBallObject.transform.localScale += 3*Vector3.one*num/MaxCapacity; } else { ExcludeFaithForce.gameObject.SetActive(true); } } private bool isCoroutineRunning = false; // 标记协程状态 public void OnPointerEnter(PointerEventData eventData) { CursorManager.Instance.SetHover(); } public void OnPointerExit(PointerEventData eventData) { CursorManager.Instance.SetNormal(); } public void OnPointerClick(PointerEventData eventData) { if (!isCoroutineRunning) { StartCoroutine(EmitParticlesAndReduceScale()); } GatherBalls.Clear(); } private IEnumerator EmitParticlesAndReduceScale() { float xIncreaseInterval = 0.5f / 10; int incrementAmount = count / 10; for (int i = 0; i < 10; i++) { FindObjectOfType().EmitFaith(incrementAmount, transform.position); // GameProcedureManager.Instance.FaithCount += incrementAmount; yield return new WaitForSeconds(xIncreaseInterval); } // FindObjectOfType().EmitFaith(count,transform.position); ExcludeFaithForce.gameObject.SetActive(false); print("释放信仰"); //Singleton.Instance.FaithCount += count; // //ExcludeFaithForce.gameObject.SetActive(false); isCoroutineRunning = true; float elapsedTime = 0f; float emissionDuration = count / (float)(Levels[curCapacityLevel]); float scaleReductionSpeed = GatheringBallObject.transform.localScale.x / emissionDuration; // // 启用粒子系统,并设置发射速率 //var emissionModule = Releaserpc.emission; //emissionModule.rateOverTime = count / emissionDuration; //Releaserpc.Play(); count = 0; // 每帧缩减GatheringBallObject的scale,保持匀速减小 while (elapsedTime < emissionDuration) { // 缩减GatheringBallObject的scale float scaleReduction = scaleReductionSpeed * Time.deltaTime; GatheringBallObject.transform.localScale -= new Vector3(scaleReduction, scaleReduction, scaleReduction); // 确保scale不会缩减到负值 //GatheringBallObject.transform.localScale = Vector3.Max(GatheringBallObject.transform.localScale, Vector3.zero); elapsedTime += Time.deltaTime; yield return null; } // // // 停止粒子系统 //Releaserpc.Stop(); isCoroutineRunning = false; yield return null; } }