势力图或影响图被认为是AI进行决策时获取外界信息的一种良好方法。这些外界的信息可能包括,友方信息,敌方信息,地形及道具信息,这些东西我们如果让每个AI都用GameObject.Find....Withtag 那么可想而知,其复杂度就是N个AI*M个信息提供者。
但我们如果换个思路,在每一帧内这些物品信息都是固定(甚至有一些游戏开始时就固定了),我们为什么不设置一张图预处理这些信息呢?就像我们在图形学中经常做的烘焙一样?
所以影响图就是这样的一个算法。
首先我们会将这个地图Grid化,先不妨认为这是2D或2.5D的情况。然后每一个信息源都会计算一个值(把自己量化),然后有一个辐射半径,对周围的格子进行进行影响,格子上的值是不断叠加的。
当然这些信息并不能使得AI就立刻发生什么,准确的说,我们收集了这些信息,再进一步用于寻路和决策的逻辑才有意义。
先上代码:
public Vector2 center;
public float width;
public float height;
public int wtileCount;
public int htileCount;
public float[][][] IMData;
public int allCount = 0;
public Dictionary<string,int> mDictionary = new Dictionary<string, int>();
private static InfluenceMap mInfluenceMapsingleton;
public Dictionary<int,bool> mDicStatic = new Dictionary<int, bool>();
public bool Debugging;
private Vector2[] NineGrid = new Vector2[]{new Vector2(0,1),new Vector2(0,-1),
new Vector2(1,1),new Vector2(1,0),new Vector2(1,-1),
new Vector2(-1,1),new Vector2(-1,0),new Vector2(-1,-1)};
public Vector2 deltaTileSize
{
get
{
return new Vector2 (width/wtileCount,height/htileCount);
}
}
public static InfluenceMap getInstance()
{