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
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; |
|
} |
|
}
|
|
|