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

134 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}