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

203 lines
4.9 KiB
C#

// 单轮游戏中管理游戏流程的部分
using System;
using System.Collections;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Playables;
public class GameProcedureManager: Singleton<GameProcedureManager>
{
private int currentDifficulty;
public Action<int> onDifficultyChange;
public int CurrentDifficulty
{
get => currentDifficulty;
set
{
currentDifficulty = value;
onDifficultyChange?.Invoke(currentDifficulty);
if (currentDifficulty >= 9000)
{
GameOverManager.Instance.LoseGame();
}
}
}
public int DayCount = 0;
public float CurrentTime;
public float MaxDayTime = 10;
public float MaxNightTime = 60;
[Header("在夜晚难度每多少秒涨1")]
public int DifficultyIncreaseSpeedAtNight = 20;
#region ResourceCode
// 木头
public Action<int> onWoodCountChange;
private int woodCount;
public int WoodCount
{
get
{
return woodCount;
}
set
{
if (value < 0)
return;
onWoodCountChange?.Invoke(value);
woodCount = value;
}
}
// 石头
public Action<int> onStoneCountChange;
private int stoneCount;
public int StoneCount
{
get
{
return stoneCount;
}
set
{
if (value < 0)
return;
onStoneCountChange?.Invoke(value);
stoneCount = value;
}
}
//信仰
public Action<int> onFaithCountChange;
private int faithCount;
public int FaithCount
{
get
{
return faithCount;
}
set
{
if (value < 0)
return;
onFaithCountChange?.Invoke(value);
faithCount = value;
}
}
//最大团子数
public int MaxBlobCount;
public int WrokingBlobCount;
public int LimitedBlobCount;
#endregion
public Action OnDay;
public Action OnNight;
public bool isDay = true;
public CancellationTokenSource UpdateDifficultyToken = new();
public CancellationTokenSource ForceDayToken = new();
public CancellationTokenSource ForceNightToken = new();
private void Start()
{
StartGameProcedure(ForceDayToken.Token,!isDay).Forget();
OnDay += () =>
{
UpdateDifficultyToken.Cancel();
};
OnNight += () =>
{
UpdateDifficultyToken = new();
UpdateDifficulty(UpdateDifficultyToken.Token);
};
}
public async UniTaskVoid UpdateDifficulty(CancellationToken token)
{
while (true)
{
print("update difficulty");
await UniTask.WaitForSeconds(DifficultyIncreaseSpeedAtNight,
cancellationToken: token);
CurrentDifficulty += 1;
}
}
public void ForceDay()
{
ForceDayToken.Cancel();
ForceDayToken = new();
DayCount += 1;
StartGameProcedure(ForceDayToken.Token, false).Forget();
}
public async UniTaskVoid StartGameProcedure(CancellationToken token,bool isNight = false)
{
print($"is night {isNight}");
if (isNight)
{
isDay = false;
print("夜晚开始");
await UniTask.WaitForSeconds(MaxNightTime, cancellationToken:token);
DayCount += 1;
}
while (true)
{
await UniTask.NextFrame();
//开始游戏或黑夜结束,进入白天
OnDay?.Invoke();
isDay = true;
print("白天开始");
await UniTask.WaitForSeconds(MaxDayTime, cancellationToken:token);
//白天结束,进入黑夜
OnNight?.Invoke();
isDay = false;
print("夜晚开始");
await UniTask.WaitForSeconds(MaxNightTime, cancellationToken:token);
DayCount += 1;
}
}
public PlayableDirector director;
public GameObject dd;
public void PlayTimelineAndInvoke()
{
dd.SetActive(true);
if (director == null)
{
Debug.LogWarning("PlayableDirector 未设置!");
return;
}
//director.gameObject.SetActive(true);
// 开始播放Timeline
director.Play();
// 开始一个协程,等待播放结束
StartCoroutine(WaitForTimelineToEnd());
}
private IEnumerator WaitForTimelineToEnd()
{
// 等待Timeline播放结束
yield return new WaitForSeconds(23f);
Debug.Log("Director OVer");
dd.SetActive(false);
// Timeline结束后等待3秒
// 调用函数B
ForceDay();
}
}