疏散人群公布修改
This commit is contained in:
parent
92c61ae09c
commit
3d4197bf93
@ -10259,6 +10259,10 @@ PrefabInstance:
|
|||||||
propertyPath: m_AnchoredPosition.y
|
propertyPath: m_AnchoredPosition.y
|
||||||
value: 0
|
value: 0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2102021661112157380, guid: 86668fbe8407a8741bb903177bc93fdb, type: 3}
|
||||||
|
propertyPath: m_Horizontal
|
||||||
|
value: 0
|
||||||
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 2102021661231301985, guid: 86668fbe8407a8741bb903177bc93fdb, type: 3}
|
- target: {fileID: 2102021661231301985, guid: 86668fbe8407a8741bb903177bc93fdb, type: 3}
|
||||||
propertyPath: m_AnchorMax.y
|
propertyPath: m_AnchorMax.y
|
||||||
value: 0
|
value: 0
|
||||||
|
@ -64,20 +64,12 @@ public class EvacuationPanel : MonoBehaviour
|
|||||||
void Start()
|
void Start()
|
||||||
{
|
{
|
||||||
SetNpcType();
|
SetNpcType();
|
||||||
nonZeroAreas= GetNonZeroNpcRatioAreas();
|
//nonZeroAreas= GetNonZeroNpcRatioAreas();
|
||||||
jc = JuesechoicePop.GetComponent<JueseChoicePop>();
|
jc = JuesechoicePop.GetComponent<JueseChoicePop>();
|
||||||
//redistributeBtn.onClick.AddListener(ClearData);
|
|
||||||
//redistributeBtn.onClick.AddListener(() =>
|
|
||||||
//{
|
|
||||||
// if (redistributeBtn.interactable)
|
|
||||||
// {
|
|
||||||
// Debug.Log("Redistribute button clicked!");
|
|
||||||
// RedistributeLogic();
|
|
||||||
// }
|
|
||||||
//});
|
|
||||||
CountsubmitBtn.onClick.AddListener(Submit);
|
CountsubmitBtn.onClick.AddListener(Submit);
|
||||||
submitBtn.onClick.AddListener(totalSubmit);
|
submitBtn.onClick.AddListener(totalSubmit);
|
||||||
StuCountInputField.onEndEdit.AddListener(CheckInput);
|
StuCountInputField.onEndEdit.AddListener(CheckInput);
|
||||||
|
SetScene();
|
||||||
SetClass();
|
SetClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,162 +124,101 @@ public class EvacuationPanel : MonoBehaviour
|
|||||||
//文字框提交按钮
|
//文字框提交按钮
|
||||||
public void Submit()
|
public void Submit()
|
||||||
{
|
{
|
||||||
// 获取输入的总人数
|
// 输入验证
|
||||||
int count = int.Parse(StuCountInputField.text); // 总人数
|
int count;
|
||||||
StuCountInputField.text = "";
|
if (!int.TryParse(StuCountInputField.text, out count) || count <= 0)
|
||||||
// 使用分配方法
|
|
||||||
foreach (var item in personnelItems)
|
|
||||||
{
|
{
|
||||||
personnelItemsDict[item.sceneId] = item; // 使用 sceneId 作为键
|
Debug.LogError("请输入有效的总人数!");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// 将 nonZeroAreas 转换为场景 ID 数组
|
|
||||||
int[] sceneIds = nonZeroAreas.ToArray();
|
StuCountInputField.text = "";
|
||||||
|
|
||||||
// 调用分配方法
|
// 调用分配方法
|
||||||
var result = DistributePeopleWithBalance(sceneIds, personnelItemsDict, count);
|
var result = DistributeNpcByRatio(personnelItems, count);
|
||||||
// 保存并使用分配结果
|
|
||||||
allocatedPeople = result;
|
// 更新 UI 和数据
|
||||||
// 更新 UI 显示
|
|
||||||
foreach (var kvp in result)
|
foreach (var kvp in result)
|
||||||
{
|
{
|
||||||
if (personnelItemsDict.ContainsKey(kvp.Key))
|
PersonnelItem item = personnelItems.Find(p => p.sceneId == kvp.Key);
|
||||||
|
if (item != null)
|
||||||
{
|
{
|
||||||
personnelItemsDict[kvp.Key].SetInfo(kvp.Value.ToString()); // 更新UI
|
item.SetInfo(kvp.Value.ToString()); // 更新UI显示
|
||||||
personnelItemsDict[kvp.Key].NpcNum=kvp.Value;
|
item.NpcNum = kvp.Value; // 更新Npc数量
|
||||||
personnelItemsDict[kvp.Key].personnelImage.gameObject.SetActive(true);
|
item.personnelImage.gameObject.SetActive(true); // 显示图标
|
||||||
Debug.LogError(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++++++++++++++++++Key" + kvp.Key);
|
Debug.Log($"Scene ID: {kvp.Key}, Assigned NPC Count: {kvp.Value}");
|
||||||
Debug.LogError(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+++++++++++++++++++Num" + kvp.Value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//分配Npc
|
|
||||||
public Dictionary<int, int> DistributePeopleWithBalance(int[] scenes, Dictionary<int, PersonnelItem> personnelItemsDict, int totalPeople)
|
//Npc分配
|
||||||
|
public Dictionary<int, int> DistributeNpcByRatio(List<PersonnelItem> personnelItems, int totalNpcCount)
|
||||||
{
|
{
|
||||||
// 1. 计算当前每个区域的总人数(初始人数 + 已分配人数)
|
Dictionary<int, float> sceneRatios = new Dictionary<int, float>(); // 存储场景ID和比例
|
||||||
Dictionary<int, int> totalPeoplePerScene = new Dictionary<int, int>();
|
float totalRatio = 0; // 所有场景的比例之和
|
||||||
foreach (var scene in scenes)
|
|
||||||
|
// 遍历所有可以分配的区域,解析NpcRatio,提取分配比例
|
||||||
|
foreach (var item in personnelItems)
|
||||||
{
|
{
|
||||||
// 如果 personnelItemsDict 中包含该场景,取其初始人数;否则设为 0
|
LocationData locationData = js.GetAreaDateById(item.sceneId);
|
||||||
if (personnelItemsDict.ContainsKey(scene))
|
string[] allLimits = locationData.NpcRatio.Split('|'); // 多个比例段
|
||||||
|
|
||||||
|
foreach (string limit in allLimits)
|
||||||
{
|
{
|
||||||
totalPeoplePerScene[scene] = personnelItemsDict[scene].Num+personnelItemsDict[scene].NpcNum; // 初始人数
|
string[] parts = limit.Split(',');
|
||||||
}
|
if (parts.Length >= 5) // 确保数据有效
|
||||||
else
|
|
||||||
{
|
|
||||||
totalPeoplePerScene[scene] = 0;
|
|
||||||
}
|
|
||||||
Debug.Log($"Scene {scene}: Initial People = {totalPeoplePerScene[scene]}");
|
|
||||||
}
|
|
||||||
// 保存初始人数以便后续计算
|
|
||||||
Dictionary<int, int> initialPeoplePerScene = new Dictionary<int, int>(totalPeoplePerScene);
|
|
||||||
// 2. 分配剩余人数
|
|
||||||
int remainingPeople = totalPeople;
|
|
||||||
while (remainingPeople > 0)
|
|
||||||
{
|
|
||||||
// 找出当前人数最少的区域
|
|
||||||
int minScene = -1; // 用于记录人数最少的场景 ID
|
|
||||||
int minPeople = int.MaxValue;
|
|
||||||
foreach (var scene in totalPeoplePerScene)
|
|
||||||
{
|
|
||||||
if (scene.Value < minPeople)
|
|
||||||
{
|
{
|
||||||
minPeople = scene.Value;
|
int sceneId = item.sceneId; // 使用 PersonnelItem 的 sceneId
|
||||||
minScene = scene.Key;
|
float ratio = float.Parse(parts[4]); // 第五项是分配比例
|
||||||
}
|
|
||||||
}
|
|
||||||
// 分配一个 NPC 到人数最少的区域
|
|
||||||
if (minScene != -1) // 确保找到有效的场景
|
|
||||||
{
|
|
||||||
totalPeoplePerScene[minScene]++;
|
|
||||||
remainingPeople--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
break; // 如果没有找到有效的场景,终止分配
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 3. 计算分配结果,减去初始人数
|
|
||||||
Dictionary<int, int> allocatedPeople = new Dictionary<int, int>();
|
|
||||||
foreach (var scene in totalPeoplePerScene)
|
|
||||||
{
|
|
||||||
int initialPeople = initialPeoplePerScene.GetValueOrDefault(scene.Key, 0);
|
|
||||||
allocatedPeople[scene.Key] = scene.Value - initialPeople; // 分配人数 = 总人数 - 初始人数
|
|
||||||
}
|
|
||||||
// 保存分配结果
|
|
||||||
this.allocatedPeople = allocatedPeople;
|
|
||||||
return allocatedPeople;
|
|
||||||
}
|
|
||||||
|
|
||||||
//判断NPC的比例字段,列出分配比例不为0的所有区域名称。
|
if (!sceneRatios.ContainsKey(sceneId))
|
||||||
public List<int> GetNonZeroNpcRatioAreas()
|
|
||||||
{
|
|
||||||
List<int> nonZeroAreas = new List<int>();
|
|
||||||
|
|
||||||
foreach (var sceneEntry in panel.sceneDataDictionary)
|
|
||||||
{
|
|
||||||
foreach (var sceneInfo in sceneEntry.Value)
|
|
||||||
{
|
|
||||||
foreach (var npcData in js.locationDictionary)
|
|
||||||
{
|
|
||||||
LocationData locationData = npcData.Value;
|
|
||||||
|
|
||||||
// 如果场景的 ID 匹配当前 NPC 的 ID
|
|
||||||
if (locationData.ID == int.Parse(sceneInfo.sceneId))
|
|
||||||
{
|
{
|
||||||
// 获取每个区域的 NpcRatio 字段
|
sceneRatios.Add(sceneId, ratio);
|
||||||
string npcRatio = locationData.NpcRatio;
|
totalRatio += ratio; // 累加所有场景的比例
|
||||||
|
|
||||||
// 将 NpcRatio 字符串按 '|' 分割,获取每一项
|
|
||||||
string[] npcRatioEntries = npcRatio.Split('|');
|
|
||||||
|
|
||||||
// 遍历每一项
|
|
||||||
foreach (var entry in npcRatioEntries)
|
|
||||||
{
|
|
||||||
// 将每一项按 ',' 分割,获取事故位置、NPCID、归属和分配比例
|
|
||||||
string[] entryData = entry.Split(',');
|
|
||||||
|
|
||||||
if (entryData.Length == 4)
|
|
||||||
{
|
|
||||||
string allocationRatio = entryData[3]; // 获取分配比例
|
|
||||||
|
|
||||||
// 检查分配比例是否不为 "0" 和 "-1"
|
|
||||||
if (allocationRatio != "0" && allocationRatio != "-1")
|
|
||||||
{
|
|
||||||
// 如果比例不为0,将该区域 ID 添加到列表
|
|
||||||
nonZeroAreas.Add(locationData.ID);
|
|
||||||
Debug.Log("locationData.ID"+ locationData.ID);
|
|
||||||
break; // 一旦找到有效的分配比例,就不再检查当前区域的其他项
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 输出所有分配比例不为0的区域 ID
|
// 如果没有有效的分配比例,直接返回空结果
|
||||||
foreach (var area in nonZeroAreas)
|
if (sceneRatios.Count == 0 || totalRatio == 0)
|
||||||
{
|
{
|
||||||
Debug.Log("区域 ID:" + area);
|
Debug.LogError("没有找到有效的分配比例!");
|
||||||
|
return new Dictionary<int, int>();
|
||||||
}
|
}
|
||||||
// 返回符合条件的区域 ID 列表
|
|
||||||
return nonZeroAreas;
|
// 根据比例分配人数
|
||||||
|
Dictionary<int, int> finalDistribution = new Dictionary<int, int>();
|
||||||
|
int remainingNpc = totalNpcCount;
|
||||||
|
|
||||||
|
foreach (var entry in sceneRatios)
|
||||||
|
{
|
||||||
|
int allocatedNpc = Mathf.FloorToInt(totalNpcCount * (entry.Value / totalRatio)); // 按比例分配
|
||||||
|
finalDistribution[entry.Key] = allocatedNpc; // 添加到分配结果
|
||||||
|
remainingNpc -= allocatedNpc; // 更新剩余NPC数量
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将剩余人数分配给当前人数最少的场景
|
||||||
|
while (remainingNpc > 0)
|
||||||
|
{
|
||||||
|
int minScene = finalDistribution.OrderBy(kvp => kvp.Value).First().Key; // 找到当前人数最少的场景
|
||||||
|
finalDistribution[minScene]++;
|
||||||
|
remainingNpc--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return finalDistribution;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//设置左侧场景显示2.0
|
//设置左侧场景显示2.0
|
||||||
public void SetScene()
|
public void SetScene()
|
||||||
{
|
{
|
||||||
// 清空现有的UI项
|
|
||||||
foreach (Transform child in personnelContent)
|
|
||||||
{
|
|
||||||
Destroy(child.gameObject);
|
|
||||||
}
|
|
||||||
// 清空人员列表
|
|
||||||
personnelItems.Clear();
|
|
||||||
foreach (var item in js.locationDictionary)
|
foreach (var item in js.locationDictionary)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(item.Value.NpcRatio=="-1")
|
if(item.Value.NpcRatio=="-1")
|
||||||
{
|
{
|
||||||
break;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -295,13 +226,13 @@ public class EvacuationPanel : MonoBehaviour
|
|||||||
foreach(var npcLimit in npcratio)
|
foreach(var npcLimit in npcratio)
|
||||||
{
|
{
|
||||||
string[] limit = npcLimit.Split(',');
|
string[] limit = npcLimit.Split(',');
|
||||||
if (limit[0] == selectScene.scnenId.ToString()&& limit[1] == selectScene.difficultyId.ToString())
|
|
||||||
|
if (limit[0] == selectScene.idcidentId.ToString()&& limit[1] == selectScene.difficultyId.ToString())
|
||||||
{
|
{
|
||||||
GameObject sceneitem = GameObject.Instantiate(personnelPrefabs, personnelContent);
|
GameObject sceneitem = GameObject.Instantiate(personnelPrefabs, personnelContent);
|
||||||
PersonnelItem personnelItem = sceneitem.GetComponent<PersonnelItem>();
|
PersonnelItem personnelItem = sceneitem.GetComponent<PersonnelItem>();
|
||||||
Button button = personnelItem.transform.Find("sceneText").GetComponent<Button>();
|
Button button = personnelItem.transform.Find("sceneText").GetComponent<Button>();
|
||||||
|
personnelItem.sceneText.text = js.SetUIText(item.Value.Name);
|
||||||
personnelItem.sceneText.text = js.SetUIText(item.Key);
|
|
||||||
personnelItem.sceneId = item.Key;
|
personnelItem.sceneId = item.Key;
|
||||||
personnelItem.Num = 1; // 设置初始值为 1
|
personnelItem.Num = 1; // 设置初始值为 1
|
||||||
// 点击事件监听
|
// 点击事件监听
|
||||||
@ -343,109 +274,15 @@ public class EvacuationPanel : MonoBehaviour
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//设置左侧场景显示
|
|
||||||
//public void SetPersonnel()
|
|
||||||
//{
|
|
||||||
// // 清空现有的UI项
|
|
||||||
// foreach (Transform child in personnelContent)
|
|
||||||
// {
|
|
||||||
// Destroy(child.gameObject);
|
|
||||||
// }
|
|
||||||
// // 清空人员列表
|
|
||||||
// personnelItems.Clear();
|
|
||||||
|
|
||||||
// foreach (var sceneEntry in panel.sceneDataDictionary)
|
|
||||||
// {
|
|
||||||
// foreach (var sceneInfo in sceneEntry.Value)
|
|
||||||
// {
|
|
||||||
// LocationData area = js.GetAreaDateById(int.Parse(sceneInfo.sceneId));
|
|
||||||
// // 如果NpcRatio不为"-1"表示该场景有效
|
|
||||||
// if (area.NpcRatio != "-1")
|
|
||||||
// {
|
|
||||||
// // 检查 personnelItems 是否已经包含该 sceneText.text
|
|
||||||
// var existingItem = personnelItems.Find(item => item.sceneText.text == sceneEntry.Key);
|
|
||||||
// if (existingItem != null)
|
|
||||||
// {
|
|
||||||
// // 如果已经存在,增加 Num
|
|
||||||
// existingItem.Num++;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// // 如果没有重复的 personnelItem,创建并添加
|
|
||||||
// GameObject item = GameObject.Instantiate(personnelPrefabs, personnelContent);
|
|
||||||
// PersonnelItem personnelItem = item.GetComponent<PersonnelItem>();
|
|
||||||
// Button button = personnelItem.transform.Find("sceneText").GetComponent<Button>();
|
|
||||||
// personnelItem.sceneText.text = sceneEntry.Key;
|
|
||||||
// personnelItem.sceneId = area.ID;
|
|
||||||
// personnelItem.Num = 1; // 设置初始值为 1
|
|
||||||
// // 点击事件监听
|
|
||||||
// button.onClick.AddListener(() =>
|
|
||||||
// {
|
|
||||||
// // 标记当前选择的区域
|
|
||||||
// OnSceneItemClicked(item, Color.yellow, selectedScene);
|
|
||||||
// // 如果被点击的区域已经有人员
|
|
||||||
// if (personnelItem.NpcNum > 0)
|
|
||||||
// {
|
|
||||||
// redistributeBtn.onClick.AddListener(() => {
|
|
||||||
// // 清除选定区域的人员数据
|
|
||||||
// RedistributeLogic(personnelItem.sceneId, personnelItem.NpcNum);
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// // 清空现有场景下的所有人员UI
|
|
||||||
// foreach (Transform child in sceneCount)
|
|
||||||
// {
|
|
||||||
// Destroy(child.gameObject);
|
|
||||||
// }
|
|
||||||
// // 执行后续的场景级别配置
|
|
||||||
// LocationData locationData = js.GetAreaDateById(personnelItem.sceneId);
|
|
||||||
// if (locationData.Level.ToString() != "0")
|
|
||||||
// {
|
|
||||||
// GameObject levelItem = GameObject.Instantiate(scenePrefab, sceneCount);
|
|
||||||
// Button levelBtn = levelItem.transform.Find("chooseBtn2").GetComponent<Button>();
|
|
||||||
// levelBtn.onClick.AddListener(() =>
|
|
||||||
// {
|
|
||||||
// JueseChoicePop jueseChoicePop = jueseChoicePanel.GetComponent<JueseChoicePop>();
|
|
||||||
// jueseChoicePop.SetClass(personnelItem.sceneId);
|
|
||||||
// jueseChoicePanel.gameObject.SetActive(true);
|
|
||||||
// });
|
|
||||||
// ClassItem classItem = levelItem.GetComponent<ClassItem>();
|
|
||||||
// classItem.classname.text = locationData.Level.ToString();
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// personnelItems.Add(personnelItem);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// break; // 如果遇到无效场景(NpcRatio为-1),跳出当前循环
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
// 判断重新分配按钮是否可以点击
|
// 判断重新分配按钮是否可以点击
|
||||||
public void IsRedistribution()
|
public void IsRedistribution()
|
||||||
{
|
{
|
||||||
// 遍历 personnelItemsDict,检查是否有任何 PersonnelItem 的 gameObject 处于激活状态
|
// 遍历 personnelItems,检查是否有任何 PersonnelItem 的 gameObject 处于激活状态
|
||||||
bool canRedistribute = false;
|
bool canRedistribute = personnelItems.Any(item =>
|
||||||
|
item.personnelImage != null && item.personnelImage.gameObject.activeSelf);
|
||||||
|
|
||||||
foreach (var kvp in personnelItemsDict)
|
|
||||||
{
|
|
||||||
if (kvp.Value.personnelImage!=null&&kvp.Value.personnelImage.gameObject.activeSelf) // 检查 gameObject 是否显示
|
|
||||||
{
|
|
||||||
canRedistribute = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
canRedistribute = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 设置重新分配按钮的交互状态
|
// 设置重新分配按钮的交互状态
|
||||||
redistributeBtn.interactable = canRedistribute;
|
redistributeBtn.interactable = canRedistribute;
|
||||||
}
|
}
|
||||||
@ -498,51 +335,69 @@ public class EvacuationPanel : MonoBehaviour
|
|||||||
//重新分配
|
//重新分配
|
||||||
public void RedistributeLogic(int excludedSceneId, int excludedNum)
|
public void RedistributeLogic(int excludedSceneId, int excludedNum)
|
||||||
{
|
{
|
||||||
// 计算需要重新分配的 NPC 总数
|
// 1. 计算需要重新分配的 NPC 总数
|
||||||
int totalRedistributePeople = excludedNum;
|
int totalRedistributePeople = excludedNum;
|
||||||
|
|
||||||
// 清除当前选中区域的人员数据
|
// 2. 从 personnelItems 中找到并清除指定区域
|
||||||
PersonnelItem excludedItem = personnelItemsDict[excludedSceneId];
|
PersonnelItem excludedItem = personnelItems.FirstOrDefault(item => item.sceneId == excludedSceneId);
|
||||||
excludedItem.NpcNum = 0;
|
if (excludedItem != null)
|
||||||
excludedItem.SetInfo(""); // 更新 UI 显示
|
|
||||||
excludedItem.personnelImage.gameObject.SetActive(false); // 隐藏图标
|
|
||||||
clearRegion.Add(excludedSceneId); // 记录清空的区域 ID
|
|
||||||
Debug.Log($"Cleared NPCs from Scene ID: {excludedSceneId}");
|
|
||||||
|
|
||||||
// 准备有效分配区域列表(排除被清空的区域)
|
|
||||||
List<int> validAreas = new List<int>();
|
|
||||||
foreach (var kvp in personnelItemsDict)
|
|
||||||
{
|
{
|
||||||
if (!clearRegion.Contains(kvp.Key)) // 排除清空的区域
|
excludedItem.NpcNum = 0; // 清空 NPC 数量
|
||||||
{
|
excludedItem.SetInfo(""); // 更新 UI 显示为空
|
||||||
validAreas.Add(kvp.Key);
|
excludedItem.personnelImage.gameObject.SetActive(false); // 隐藏图标
|
||||||
}
|
personnelItems.Remove(excludedItem); // 从列表中移除
|
||||||
|
Debug.Log($"Cleared NPCs from Scene ID: {excludedSceneId}");
|
||||||
}
|
}
|
||||||
// 如果没有有效区域,则提示
|
else
|
||||||
|
{
|
||||||
|
Debug.LogWarning($"Scene ID {excludedSceneId} not found in personnelItems.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 准备有效分配区域列表(剩余的 personnelItems)
|
||||||
|
List<PersonnelItem> validAreas = personnelItems.Where(item => item.NpcNum >= 0).ToList();
|
||||||
|
|
||||||
if (validAreas.Count == 0)
|
if (validAreas.Count == 0)
|
||||||
{
|
{
|
||||||
Debug.LogWarning("No valid areas available for redistribution.");
|
Debug.LogWarning("No valid areas available for redistribution.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 将有效区域转换为数组
|
|
||||||
int[] validSceneIds = validAreas.ToArray();
|
|
||||||
foreach (int sceneId in validSceneIds)
|
|
||||||
{
|
|
||||||
Debug.Log("Valid Scene ID: " + sceneId);
|
|
||||||
}
|
|
||||||
var redistributionResult = DistributePeopleWithBalance(validSceneIds, personnelItemsDict, totalRedistributePeople);
|
|
||||||
|
|
||||||
// 更新分配结果到 UI
|
// 4. 平均分配人数到有效区域
|
||||||
|
int remainingNpc = totalRedistributePeople;
|
||||||
|
Dictionary<int, int> redistributionResult = new Dictionary<int, int>();
|
||||||
|
|
||||||
|
foreach (var item in validAreas)
|
||||||
|
{
|
||||||
|
redistributionResult[item.sceneId] = 0; // 初始化分配数量
|
||||||
|
}
|
||||||
|
|
||||||
|
while (remainingNpc > 0)
|
||||||
|
{
|
||||||
|
foreach (var item in validAreas)
|
||||||
|
{
|
||||||
|
if (remainingNpc > 0)
|
||||||
|
{
|
||||||
|
redistributionResult[item.sceneId]++;
|
||||||
|
remainingNpc--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 5. 更新有效区域的 UI 显示和数据
|
||||||
foreach (var kvp in redistributionResult)
|
foreach (var kvp in redistributionResult)
|
||||||
{
|
{
|
||||||
if (personnelItemsDict.ContainsKey(kvp.Key))
|
PersonnelItem targetItem = validAreas.FirstOrDefault(item => item.sceneId == kvp.Key);
|
||||||
|
if (targetItem != null)
|
||||||
{
|
{
|
||||||
PersonnelItem redistributedItem = personnelItemsDict[kvp.Key];
|
targetItem.NpcNum += kvp.Value; // 更新 NPC 数量
|
||||||
redistributedItem.NpcNum += kvp.Value; // 更新人数
|
targetItem.SetInfo(targetItem.NpcNum.ToString()); // 更新 UI 显示
|
||||||
redistributedItem.SetInfo(redistributedItem.NpcNum.ToString()); // 更新 UI 显示
|
targetItem.personnelImage.gameObject.SetActive(true); // 确保图标可见
|
||||||
redistributedItem.personnelImage.gameObject.SetActive(true); // 确保图标显示
|
|
||||||
redistributedItem.personnelNum.gameObject.SetActive(true); // 确保图标显示
|
Debug.Log($"Redistributed {kvp.Value} NPCs to Scene ID: {kvp.Key}");
|
||||||
Debug.Log($"Assigned {kvp.Value} NPCs to Scene ID: {kvp.Key}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user