| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- 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<string, List<GameObject>> dicCkInTrain = new Dictionary<string, List<GameObject>>();
- public void SetCKInTrain(string trainNo, GameObject goCk)
- {
- if (!dicCkInTrain.ContainsKey(trainNo))
- {
- dicCkInTrain.Add(trainNo, new List<GameObject>());
- }
- 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();
- }
- /// <summary>
- /// 设置进站未上车的乘客出站
- /// </summary>
- public void SetCKChuZhan(int exitPort)
- {
- foreach (var item in listChengKeJinZhan)
- {
- var targetP = exitPort == 1 ? GetSpawnPoint_ChuZhan_target_1() : GetSpawnPoint_ChuZhan_target_2();
- item.GetComponent<NavMeshAgent>().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<NavMeshAgent>();
- 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();
- }
- /// <summary>
- /// 上车
- /// </summary>
- /// <param name="xingbie">1上行 2下行</param>
- [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<NavMeshAgent>().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<NavMeshAgent>().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<NavMeshAgent>().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<Transform>();
- listPoints_zhantai.AddRange(points.Skip(1).ToArray());
- for (int i = 0; i < listPoints_zhantai.Count; i++)
- {
- listQueue.Add(new List<GameObject>());
- }
- }
- List<List<GameObject>> listQueue = new List<List<GameObject>>();
- 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<NavMeshAgent>().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<NavMeshAgent>().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<Transform> listPoints_zhantai = new List<Transform>();
- 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<GameObject> listChengKeChuZhan = new List<GameObject>();
- private readonly List<GameObject> listChengKeJinZhan = new List<GameObject>();
- 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<NavMeshAgent>();
- 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<NavMeshAgent>();
- 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<NavMeshAgent>();
- agent.Warp(tfOrg.position);
- var trigger = goNew.AddComponentOnlyOne<ChuZhanTrigger>();
- 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;
- /// <summary>
- /// 每分钟进站人数
- /// </summary>
- public float CountPerMin
- {
- set
- {
- countPerMin = value;
- }
- get
- {
- return countPerMin;
- }
- }
- /// <summary>
- /// 每分钟出站人数
- /// </summary>
- public float CountPerMin_ChuZhan = 0;
- /// <summary>
- /// 进站人数速率
- /// </summary>
- /// <param name="countPerMin">每分钟多少人</param>
- public void SetInSpeed(int countPerMin)
- {
- CountPerMin = countPerMin;
- }
- }
- }
|