天津23维预案
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

98 lines
3.0 KiB

using UnityEngine;
using System.Collections;
using DevelopEngine;
using System.Collections.Generic;
using AX.TrackRecord;
public class CengIDManager : SingletonMono<CengIDManager>
{
/// <summary>
/// 只维护了室内层的所有CengID。
/// </summary>
public Dictionary<float, List<BuildItem>> CengAttriDict = new Dictionary<float, List<BuildItem>>();
public void AddItemToDict(GameObject obj)
{
BuildItem cengAttri = new BuildItem();
cengAttri.floor = obj.GetComponent<CengID>().cengID;
cengAttri.buildType = obj.GetComponent<CengID>().CengIDBuildType;
/*//key值减小部分进行存储,确保后期查找时找到正确的CengID
//Tips:查找CengID时是根据y值查找,找到第一个比当前y值高的层获取CengID。*/
float y_key = obj.transform.position.y/* - 0.5f*/;
AddItemToDict(y_key, cengAttri);
}
private void AddItemToDict(float y_key, BuildItem cengAttri)
{
if (CengAttriDict.ContainsKey(y_key))
{
CengAttriDict[y_key].Add(cengAttri);
}
else
{
CengAttriDict.Add(y_key, new List<BuildItem>() { cengAttri });
}
CengAttriDict.DictSort();
}
public int GetCengIDByY(float y, BuildType buildType)
{
var keys = CengAttriDict.Keys;
if (keys.Count < 1)
{
return 0;
}
//获取当前寻路点对应的cengid有两种情况:
//1. 找y值最接近的层,这种情况是在平层上寻路
//2. 找第一个比当前y值大的key_y的前一个key_y,即为当前层
var list_y = new List<float>();//第一种情况
foreach (var key_y in keys)
{
var dis = Mathf.Abs(y - key_y);
if (dis < 0.2f)
{
list_y.Add(key_y);
}
}
if (list_y.Count > 0)//满足情况1,处理情况1
{
list_y.Sort();//升序排列
foreach (var key_y in list_y)
{
if (ReturnCengIDByY(key_y, buildType) != 0)
{
return ReturnCengIDByY(key_y, buildType);
}
}
}
else if (buildType != BuildType.None)//不满足情况1,尝试情况2
{
//float ceng_key = 0;
//foreach (var key_y in keys)
//{
// if (key_y - y > 0.2f)
// {
// break;
// }
// ceng_key = key_y;
//}
//if (ReturnCengIDByY(ceng_key, buildType) != 0)
//{
// return ReturnCengIDByY(ceng_key, buildType);
//}
}
return 0;
}
private int ReturnCengIDByY(float key_y, BuildType buildType)
{
var buildItemList = CengAttriDict[key_y];
foreach (var item in buildItemList)
{
if (item.buildType == buildType)
{
return item.floor;
}
}
return 0;
}
}