Files
XMen/Assets/Scripts/StoryManager.cs

239 lines
7.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 DragonLi.Core;
using Mirror;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XPlugin.Data.JsonLiteDB;
public class StoryManager : NetworkBehaviour
{
public static StoryManager Ins { get; private set; }
[SyncVar]
/// <summary>
/// 当前选择的难度
/// </summary>
public int gameDifficulty;
[SyncVar]
/// <summary>
/// 当前剧情在哪
/// </summary>
public int currentStoryIndex = 0;
// json数据库
private JsonLiteDB DB;
public static void Init()
{
Ins = new StoryManager();
}
[ClientRpc]
public void ShowResultPlane()
{
CoroutineTaskManager.Instance.WaitSecondTodo(() =>
{
WorldUIManager.Ins.Cover("UI/ResultPlane", false);
}, 1f);
}
public void Start()
{
Ins = this;
// currentStoryIndex = 7;
EventDispatcher.AddEventListener("NextTrriger", NextTrriger);
}
[Command(requiresAuthority = false)]
public void SetGameDifficultyCmd(int index)
{
gameDifficulty = index;
}
public void NextTrriger()
{
StartCoroutine(MyCoroutine());
}
// public IEnumerator MyCoroutine1()
// {
// // 根据当前剧情索引获取剧情信息
// StoryInfo1 storyInfo1 = GameManager.Ins.GameStoryInfos[currentStoryIndex];
// //创建物体
// }
public IEnumerator MyCoroutine()
{
StoryInfo storyInfo = GameManager.Ins.StoryDescInfos[currentStoryIndex];
//修改处等待AI介绍完成
while (!GameManager.Ins.isAIIntroductionComplete)
{
yield return null;
}
//根据难度选择
GameManager.Ins.AllEnemyAmount = storyInfo.ALLEnemyAmount[gameDifficulty];
int pathId = storyInfo.PathId;
int crackAmount = storyInfo.CrackAmount[gameDifficulty];
currentStoryIndex = storyInfo.NextId;
if (storyInfo.EnergyMask != null)
{
// 遍历字典的键值对
foreach (KeyValuePair<int, Vector3> kvp in storyInfo.EnergyMask)
{
int key = kvp.Key; // 获取键
Vector3 value = kvp.Value; // 获取值
GameManager.Ins.CreateProp((PropType)(key), value);
}
}
//修改处等待AI介绍完成后再触发教学相关内容
yield return new WaitUntil(() => GameManager.Ins.isAIIntroductionComplete);
//表中传送门数量大于0 需要创建传送门
if (crackAmount > 0)
{
for (int i = 0; i < crackAmount; i++)
{
if (i > 0)
{
yield return new WaitForSeconds(3.0f);
}
else
{
//EventDispatcher.TriggerEvent("PlayEnemyInfo", storyInfo.Id);
//修改处确保AI介绍完成后再显示敌人信息
yield return new WaitUntil(() => GameManager.Ins.isAIIntroductionComplete);
ShowEnemyInfoMessage(storyInfo.Id);
}
GameObject crack = GameManager.Ins?.CreateCrack(storyInfo.CracksPos[i], storyInfo.Angle[i]);
//临时存储创建出来的传送门
GameManager.Ins?.cracksList.Add(crack);
//传送门创建出来后根据表内容创建怪物
for (int j = 0; j < storyInfo.EnemyAmount[gameDifficulty]; j++)
{
float interval = Random.Range(storyInfo.CreateInterva[0], storyInfo.CreateInterva[1]);
if (j > 0)
{
yield return new WaitForSeconds(interval); // ÿ ε ֮ ȴ 1
}
string pathid = (pathId + i).ToString();
GameManager.Ins?.GenerateEnemy((EnemyType)(storyInfo.type), storyInfo.EnemysPos[i], storyInfo.Angle[i], storyInfo.EnemysScale[0], pathid);
}
}
if (GameManager.Ins.cracksList.Count > 0)
{
for (int i = 0; i < GameManager.Ins.cracksList.Count; i++)
{
Crack crack = GameManager.Ins.cracksList[i].GetComponent<Crack>();
crack.CloseCrack();
}
}
}
//如果传送门为0
else
{
//如果怪物个数超过1
if (GameManager.Ins.AllEnemyAmount > 1)
{
yield return new WaitForSeconds(storyInfo.Wait);
//EventDispatcher.TriggerEvent("PlayEnemyInfo", storyInfo.Id);
ShowEnemyInfoMessage(storyInfo.Id);
for (int i = 0; i < storyInfo.EnemysPos.Length; i++)
{
if (i > 0)
{
yield return new WaitForSeconds(2.0f); //
}
for (int j = 0; j < storyInfo.EnemyAmount[gameDifficulty]; j++)
{
string pathid = (pathId + i).ToString();
GameManager.Ins?.GenerateEnemy((EnemyType)(storyInfo.type), storyInfo.EnemysPos[i], storyInfo.Angle[0], storyInfo.EnemysScale[0], pathid);
float interval = Random.Range(storyInfo.CreateInterva[0], storyInfo.CreateInterva[1]);
yield return new WaitForSeconds(interval);
}
}
}
else
{
yield return new WaitForSeconds(storyInfo.Wait);
//修改处确保AI介绍完成后再显示敌人信息
yield return new WaitUntil(() => GameManager.Ins.isAIIntroductionComplete);
ShowEnemyInfoMessage(storyInfo.Id);
GameManager.Ins?.GenerateEnemy((EnemyType)(storyInfo.type), storyInfo.EnemysPos[0], storyInfo.Angle[0], storyInfo.EnemysScale[0], pathId.ToString());
}
}
}
[ClientRpc]
public void ShowEnemyInfoMessage(int index)
{
//只有在AI介绍完成后才出发敌人信息
if (GameManager.Ins.isAIIntroductionComplete)
{
//修改处:原来只有下面一行
EventDispatcher.TriggerEvent("PlayEnemyInfo", index);
}
else
{
//如果AI介绍未完成延迟触发
StartCoroutine(DelayedShowEnemyInfoMessage(index));
}
}
//修改处:添加方法
private IEnumerator DelayedShowEnemyInfoMessage(int index)
{
//等待AI介绍完成
yield return new WaitUntil(() => GameManager.Ins.isAIIntroductionComplete);
//触发敌人信息事件
EventDispatcher.TriggerEvent("PlayerEnemyInfo", index);
}
[Server]
public void CreateStoryItem()
{
StoryInfo storyInfo = GameManager.Ins.StoryDescInfos[currentStoryIndex];
if (storyInfo.EnergyPump != null)
{
foreach (KeyValuePair<int, Vector3> kvp in storyInfo.EnergyPump)
{
int key = kvp.Key; // 获取键
Vector3 value = kvp.Value; // 获取值
GameManager.Ins.CreateProp((PropType)(key), value);
}
}
}
public void Update()
{
//Transform player= MRNetworkManager.Ins.roomSlots[0].transform;
//Debug.Log("玩家当前移动距离:" + Mathf.Floor(player.position.x) + "|" + Mathf.Floor(player.position.y) + "|" + Mathf.Floor(player.position.z));
}
}