Files
back_cantanBuilding/Assets/Scripts/SupplyDrop/SupplyDropCashGameRoot.cs
2026-05-26 16:15:54 +08:00

205 lines
7.1 KiB
C#

using DG.Tweening;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
public class SupplyDropCashGameRoot : MonoBehaviour
{
public SupplyDropItemCashGun gun;
public GameObject GrabCashTextReady;
public GameObject GrabCashTextTitle;
public Transform[] posFlyEndLeft;
public Transform[] posFlyEndRight;
public List<GameObject> cashs = new List<GameObject>();
public GameObject cashNum;
public List<SupplyDropCashEmitter> cashPosList = new List<SupplyDropCashEmitter>();
public SupplyDropCashEmitter pos_start;
public float CashGunFlyTime = 0.45f;
public Vector3 CashGunFlyPos = new(0, -1.5f, 3f);
//钞票枪发射阶段
public float PlaySprayStartDelay = 0.533f;
public float PlaySprayDuration = 1.5f;
public float PlaySprayCashFlyTime = 1f;
public float PlaySprayCashInterval = 0.066f;
public AnimationCurve PlayCashSprayAnimationCurve = AnimationCurve.Linear(0, 0, 1, 1);
//下落表现阶段
public float PlayCashFallStartDelay = 0.8f;
public float PlayCashFallDuration = 2f;
//抓钞票阶段
public float PlayFallToGrabDelay = 2;
public float GameDuration = 7.5f;
public float GrabCashDelay = 0.5f;
public float PlayUITitleDelay = 0.1f;
public float PlayUIReadyDelay = 2.5f;
float allWeight = 0f;
List<float> weightList = new List<float>();
List<int> dropCount = new List<int>();
SupplyDropGameplayCashCtrl ctrl;
public void Init(SupplyDropGameplayCashCtrl ctrl,
Vector3 startPos,
float allWeight,
List<float> weightList,
List<int> dropCount)
{
gun.gameObject.SetActive(true);
gun.transform.position = startPos;
GunMove();
this.ctrl = ctrl;
this.allWeight = allWeight;
this.weightList = weightList;
this.dropCount = dropCount;
ShowUI();
}
void GunMove()
{
gun.transform.DOMove(CashGunFlyPos, CashGunFlyTime);
}
async void ShowUI()
{
await Awaiters.Seconds(PlayUITitleDelay);
GrabCashTextTitle.SetActive(true);
await Awaiters.Seconds(PlayUIReadyDelay);
GrabCashTextReady.SetActive(true);
}
public async Task IntialStage()
{
//开始发射钞票
PlaySpray();
//开始降落钞票
await PlayCashFall();
}
public async Task StartPlay()
{
await Awaiters.Seconds(GrabCashDelay);
for (int i = 0; i < cashPosList.Count; i++)
{
SupplyDropCashEmitter emitter = cashPosList[i];
emitter.StartPlay(ctrl, allWeight, weightList, dropCount);
}
await Awaiters.Seconds(GameDuration);
for (int i = 0; i < cashPosList.Count; i++)
{
SupplyDropCashEmitter emitter = cashPosList[i];
emitter.StopAllCoroutines();
}
}
async Task PlaySpray()
{
await Awaiters.Seconds(PlaySprayStartDelay);
float sprayTime = 0;
int type = 0;
while (sprayTime < PlaySprayDuration)
{
sprayTime += 0.1f;
type = UnityEngine.Random.Range(0, cashs.Count);
SupplyDropCashItem item = ctrl.GetCashItem(type);
if (item != null)
{
Vector3 posW = gun.Point01.position;
item.gameObject.name = $"Cash_UP_{type}";
item.transform.position = posW;
item.PlayAni(1); // 随机播放动画
item.gameObject.SetActive(true);
//item.transform.rotation = point01.rotation;
if (posFlyEndLeft.Length > 1)
{
float x = Random.Range(posFlyEndLeft[0].position.x, posFlyEndLeft[1].position.x);
float y = Random.Range(posFlyEndLeft[0].position.y, posFlyEndLeft[1].position.y);
float z = Random.Range(posFlyEndLeft[0].position.z, posFlyEndLeft[1].position.z);
posW.x = x;
posW.y = y;
posW.z = z;
}
item.transform.DOMove(posW, PlaySprayCashFlyTime)
.SetEase(PlayCashSprayAnimationCurve)
.OnComplete(() => ctrl.Recycle(item));
}
SupplyDropCashItem item2 = ctrl.GetCashItem(type);
if (item2 != null)
{
Vector3 posW = gun.Point02.position;
item2.gameObject.name = $"Cash_UP_{type}";
item2.transform.position = posW;
item2.PlayAni(1); // 随机播放动画
item2.gameObject.SetActive(true);
//item2.transform.rotation = point02.rotation;
if (posFlyEndRight.Length > 1)
{
float x = Random.Range(posFlyEndRight[0].position.x, posFlyEndRight[1].position.x);
float y = Random.Range(posFlyEndRight[0].position.y, posFlyEndRight[1].position.y);
float z = Random.Range(posFlyEndRight[0].position.z, posFlyEndRight[1].position.z);
posW.x = x;
posW.y = y;
posW.z = z;
}
item2.transform.DOMove(posW, PlaySprayCashFlyTime)
.SetEase(PlayCashSprayAnimationCurve)
.OnComplete(() => ctrl.Recycle(item2));
}
await Awaiters.Seconds(PlaySprayCashInterval);
}
}
async Task PlayCashFall()
{
await Awaiters.Seconds(PlayCashFallStartDelay);
float cashFallTime = 0;
int type = 0;
while (cashFallTime < PlayCashFallDuration)
{
await Awaiters.Seconds(pos_start.emissionInterval);
cashFallTime += pos_start.emissionInterval;
for (int i = 0; i < pos_start.emissionCount; i++)
{
type = UnityEngine.Random.Range(0, cashs.Count);
SupplyDropCashItem item = ctrl.GetCashItem(type);
if (item != null)
{
item.gameObject.name = $"Cash_Down_{type}";
item.gameObject.SetActive(true);
if (pos_start.FlyIndexStart < pos_start.FlyIndexEnd)
{
item.PlayAni(UnityEngine.Random.Range(pos_start.FlyIndexStart, pos_start.FlyIndexEnd + 1)); // 随机播放动画
}
else
{
item.PlayAni(pos_start.FlyIndexStart); // 随机播放动画
}
item.transform.position = pos_start.transform.position;
item.transform.DOMove(pos_start.GetTargetAreaPos(),
pos_start.flyTime)
.SetEase(PlayCashSprayAnimationCurve)
.OnComplete(() => ctrl.Recycle(item));
}
}
}
await Awaiters.Seconds(PlayFallToGrabDelay);
}
public GameObject InstantiateItem(int type)
{
return Instantiate(cashs[type], transform);
}
public GameObject InstantiateNumItem()
{
return Instantiate(cashNum, transform);
}
}