using GFMain; using Mirror; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityCommon; using UnityEngine; using UnityEngine.AI; namespace DTYJ { public class ChengKeCtrl { [Server] public void RemoveAllChengKe() { listChengKeJinZhan.ForEach((ck) => { NetworkServer.Destroy(ck); }); listChengKeJinZhan.Clear(); for (int i = 0; i < listQueue.Count; i++) { listQueue[i].Clear(); } listChengKeChuZhan.ForEach((ck) => { NetworkServer.Destroy(ck); }); listChengKeChuZhan.Clear(); maxCount_ChuZhan = 0; RenShuTrigger.dicCount["站台"] = 0; RenShuTrigger.dicCount["站厅"] = 0; personTotalCount = 0; } [Server] public void GenerateImmidiately(int count) { GenereatePerson_immidiately(count); } public void RemoveCK(GameObject go) { if (listChengKeChuZhan.Contains(go)) { listChengKeChuZhan.Remove(go); } else if (listChengKeJinZhan.Contains(go)) { listChengKeJinZhan.Remove(go); for (int i = 0; i < listQueue.Count; ++i) { if (listQueue[i].Contains(go)) { listQueue[i].Remove(go); } } } NetworkServer.Destroy(go); personTotalCount--; if (personTotalCount < 0) { personTotalCount = 0; } } Dictionary> dicCkInTrain = new Dictionary>(); public void SetCKInTrain(string trainNo, GameObject goCk) { if (!dicCkInTrain.ContainsKey(trainNo)) { dicCkInTrain.Add(trainNo, new List()); } dicCkInTrain[trainNo].Add(goCk); if (listChengKeJinZhan.Contains(goCk)) { listChengKeJinZhan.Remove(goCk); } for (int i = 0; i < listQueue.Count; ++i) { if (listQueue[i].Contains(goCk)) { listQueue[i].Remove(goCk); } } //UpdateCKPosition(); } /// /// 设置进站未上车的乘客出站 /// public void SetCKChuZhan(int exitPort) { foreach (var item in listChengKeJinZhan) { var targetP = exitPort == 1 ? GetSpawnPoint_ChuZhan_target_1() : GetSpawnPoint_ChuZhan_target_2(); item.GetComponent().SetDestination(targetP.position); } for (int i = 0; i < listQueue.Count; ++i) { listQueue[i].Clear(); } cursor = -1; } public void GenerateInTrain(string trainNo) { if (TrainCtrl.TrainCtrlDic.ContainsKey(trainNo)) { var trainctrl = TrainCtrl.TrainCtrlDic[trainNo]; var points = trainctrl.GetPoints(); for (int i = 0; i < points.Count; ++i) { var tfOrg = points[i]; var goNew = OnlineCtrl.Instance.GenerateChengKe(GetRolePrefab(), tfOrg, $"列车角色{i}"); goNew.name = "Train" + trainNo; var agent = goNew.GetComponent(); agent.enabled = false; ++personTotalCount; } } } public void SetCkOutTrain(string trainNo, GameObject goCk) { if (dicCkInTrain.ContainsKey(trainNo)) { dicCkInTrain[trainNo].Remove(goCk); } } public void ClearCkInTrain() { foreach (var k in dicCkInTrain.Values) { foreach (var v in k) { RemoveCK(v); } } dicCkInTrain.Clear(); } /// /// 上车 /// /// 1上行 2下行 [Server] public void ShangChe(int xingbie) { Utility.DelayExe(2, () => {//延时两秒 等车门打开 if (xingbie == 2) { for (int i = 0; i < 57; ++i) { if (listQueue[i].Count > 0) { var goCkFirst = listQueue[i][0]; var tfFirst = listPoints_zhantai[i].transform; var targetP = tfFirst.transform.position + (tfFirst.transform.forward * 2.3f); goCkFirst.GetComponent().SetDestination(targetP); } } } else if (xingbie == 1) { for (int i = 57; i < listQueue.Count; ++i) { if (listQueue[i].Count > 0) { var goCkFirst = listQueue[i][0]; var tfFirst = listPoints_zhantai[i].transform; var targetP = tfFirst.transform.position + (tfFirst.transform.forward * 2.3f); goCkFirst.GetComponent().SetDestination(targetP); } } } }); } public void XiaChe(string trainNo) { if (dicCkInTrain.ContainsKey(trainNo)) { Utility.DelayExe(2, () => {//延时两秒 等车门打开 var xiacheCount = dicCkInTrain[trainNo].Count * 0.6f; var targetP = GetSpawnPoint_ChuZhan_target_1(); for (int i = 0; i < xiacheCount; ++i) { dicCkInTrain[trainNo][i].GetComponent().SetDestination(targetP.position); } }); } } private const float interval = 0.5f;//队列间距 private Transform tfSpawnPointRoot; private Transform tfSpawnPointRoot_chuzhan;//出站出生点 private Transform tfSpawnPointRoot_chuzhan_target;//出站目标点 private Transform tfSpawnPointRoot_chuzhan_target_2;//出站目标点 private Transform tfSpawnPointRoot_zhanting;//站厅 public int maxCount = 50000; public int maxCount_ChuZhan = 50; public ChengKeCtrl() { var tfRoot = GameObject.Find("角色默认位置/乘客位置/站台"); tfSpawnPointRoot = GameObject.Find("角色默认位置/乘客位置/进站出生点/2号口").transform; tfSpawnPointRoot_chuzhan = GameObject.Find("角色默认位置/乘客位置/出站出生点").transform; tfSpawnPointRoot_chuzhan_target = GameObject.Find("角色默认位置/乘客位置/出站目标点").transform; tfSpawnPointRoot_chuzhan_target_2 = GameObject.Find("角色默认位置/乘客位置/出站目标点_2").transform; tfSpawnPointRoot_zhanting = GameObject.Find("角色默认位置/乘客位置/站厅").transform; var points = tfRoot.GetComponentsInChildren(); listPoints_zhantai.AddRange(points.Skip(1).ToArray()); for (int i = 0; i < listPoints_zhantai.Count; i++) { listQueue.Add(new List()); } } List> listQueue = new List>(); public void UpdateCKPosition() { for (int i = 0; i < listQueue.Count; i++) { for (int j = 0; j < listQueue[i].Count; j++) { var ck = listQueue[i][j]; var tfFirst = listPoints_zhantai[i].transform; var targetP = tfFirst.transform.position + (-tfFirst.transform.forward * interval * j); ck.GetComponent().SetDestination(targetP); } } } public void TrainRunning(string trainNo, bool v) { if (dicCkInTrain.ContainsKey(trainNo)) { for (int i = 0; i < dicCkInTrain[trainNo].Count; i++) { dicCkInTrain[trainNo][i].GetComponent().enabled = !v && TrainCtrl.IsStopOnPlantform(trainNo); } } } private GameObject GetRolePrefab() { return OnlineNetworkManager.singleton.spawnPrefabs[UnityEngine.Random.Range(5, 12)]; } private Transform GetSpawnPoint() { return tfSpawnPointRoot.GetChild(UnityEngine.Random.Range(0, tfSpawnPointRoot.childCount)); } private Transform GetSpawnPoint_ChuZhan() { return tfSpawnPointRoot_chuzhan.GetChild(UnityEngine.Random.Range(0, tfSpawnPointRoot_chuzhan.childCount)); } private Transform GetSpawnPoint_ChuZhan_target_1() { return tfSpawnPointRoot_chuzhan_target.GetChild(UnityEngine.Random.Range(0, tfSpawnPointRoot_chuzhan_target.childCount)); } private Transform GetSpawnPoint_ChuZhan_target_2() { return tfSpawnPointRoot_chuzhan_target_2.GetChild(UnityEngine.Random.Range(0, tfSpawnPointRoot_chuzhan_target_2.childCount)); } public void StartProgress() { Utility.Update(1, Update); } private readonly List listPoints_zhantai = new List(); private void Update() { //进站 var countPerSec = CountPerMin / 60f;//每秒生成人数 int count = (int)countPerSec; GenereatePerson(count); countPerSec -= count;//小数部分 if (UnityEngine.Random.Range(0, 1f) < countPerSec) GenereatePerson(1); //出站 var countPerSec_chuzhan = CountPerMin_ChuZhan / 60f;//每秒生成人数 int count_chuzhan = (int)countPerSec_chuzhan; GenereatePerson_ChuZhan(count_chuzhan); countPerSec_chuzhan -= count_chuzhan;//小数部分 if (UnityEngine.Random.Range(0, 1f) < countPerSec_chuzhan) GenereatePerson_ChuZhan(1); float soundValue = personTotalCount / 300f; soundValue = Mathf.Clamp(soundValue, 0f, 1f); ControllerPanel.instance.RpcSetSoundValue(Mathf.Clamp(soundValue, 0f, 1f)); } private int personTotalCount = 0; private int personTotalCount_chuzhan = 0; int cursor = -1; int cursorMoveNext { get { cursor++; if (cursor >= listPoints_zhantai.Count) cursor = 0; return cursor; } } private readonly List listChengKeChuZhan = new List(); private readonly List listChengKeJinZhan = new List(); private void GenereatePerson(int count) { if (count <= 0 || personTotalCount >= maxCount) return; for (int i = 0; i < count; i++) { var tfOrg = GetSpawnPoint(); var goNew = OnlineCtrl.Instance.GenerateChengKe(GetRolePrefab(), tfOrg, $"进站角色{i}"); //goNew.name = "GenereatePerson"; var nowCursor = cursorMoveNext; listQueue[nowCursor].Add(goNew); var agent = goNew.GetComponent(); agent.Warp(tfOrg.position); var tfFirst = listPoints_zhantai[nowCursor].transform; var targetP = tfFirst.transform.position + (-tfFirst.transform.forward * interval * listQueue[nowCursor].Count); agent.SetDestination(targetP); ++personTotalCount; listChengKeJinZhan.Add(goNew); } Debug.Log($"总进站人数:{personTotalCount} 新增:{count}"); } private void GenereatePerson_immidiately(int count) { if (count <= 0 || personTotalCount >= maxCount) return; count = tfSpawnPointRoot_zhanting.childCount; for (int i = 0; i < count; i++) { var tfOrg = tfSpawnPointRoot_zhanting.GetChild(i);// GetSpawnPoint(); var goNew = OnlineCtrl.Instance.GenerateChengKe(GetRolePrefab(), tfOrg, $"立即生成角色{i}"); goNew.name = "GenereatePerson_immidiately"; var nowCursor = cursorMoveNext; listQueue[nowCursor].Add(goNew); var agent = goNew.GetComponent(); agent.Warp(tfOrg.position); var tfFirst = listPoints_zhantai[nowCursor].transform; var targetP = tfFirst.transform.position + (-tfFirst.transform.forward * interval * listQueue[nowCursor].Count); agent.SetDestination(targetP); ++personTotalCount; listChengKeJinZhan.Add(goNew); } Debug.Log($"总进站人数:{personTotalCount} 新增:{count}"); } private void GenereatePerson_ChuZhan(int count) { if (count <= 0 || personTotalCount_chuzhan >= maxCount_ChuZhan) return; for (int i = 0; i < count; i++) { var tfOrg = GetSpawnPoint_ChuZhan(); var goNew = OnlineCtrl.Instance.GenerateChengKe(GetRolePrefab(), tfOrg, $"出站角色{i}"); goNew.name = "GenereatePerson_ChuZhan"; var agent = goNew.GetComponent(); agent.Warp(tfOrg.position); var trigger = goNew.AddComponentOnlyOne(); trigger.onTriggerEnter = (go) => { RemoveCK_chuzhan(go); }; listChengKeChuZhan.Add(goNew); var targetP = GetSpawnPoint_ChuZhan_target_1(); agent.SetDestination(targetP.position); ++personTotalCount_chuzhan; } Debug.Log($"总出站人数:{personTotalCount_chuzhan} 新增:{count}"); } private void RemoveCK_chuzhan(GameObject go) { if (listChengKeChuZhan.Contains(go)) { listChengKeChuZhan.Remove(go); NetworkServer.Destroy(go); --personTotalCount_chuzhan; } } private float countPerMin = 0; /// /// 每分钟进站人数 /// public float CountPerMin { set { countPerMin = value; } get { return countPerMin; } } /// /// 每分钟出站人数 /// public float CountPerMin_ChuZhan = 0; /// /// 进站人数速率 /// /// 每分钟多少人 public void SetInSpeed(int countPerMin) { CountPerMin = countPerMin; } } }