MayHeCome/Assets/Scripts/GatheringBall.cs

134 lines
4.5 KiB
C#
Raw Normal View History

2024-12-18 09:55:34 +00:00
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<Transform, Vector3> GatherBalls = new();
public Dictionary<Transform, Vector3> 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<TopBarUI>().EmitFaith(incrementAmount, transform.position);
// GameProcedureManager.Instance.FaithCount += incrementAmount;
yield return new WaitForSeconds(xIncreaseInterval);
}
// FindObjectOfType<TopBarUI>().EmitFaith(count,transform.position);
ExcludeFaithForce.gameObject.SetActive(false);
print("释放信仰");
//Singleton<GameProcedureManager>.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;
}
}