- 使用跳跃表+十字链方式实现的一个AOI库。
- 可做简单的碰撞检测、客户端资源、服务器AOI。
- 测试效率插入、移动、查找均到毫秒一下。
// 创建一个AOI区域、如果地图过大可以定义多个区域
var zone = new AoiZone();
// AOI的显示区域、每个客户端都可以单独定义区域、这样可以更好的适用于不同的分辨率。
var area = new Vector2(3, 3);
// 添加50个玩家。
for (var i = 1; i <= 50; i++) zone.Enter(i, i, i);
// 刷新key为3的信息。
zone.Refresh(3, area, out var enters);
Console.WriteLine("---------------加入玩家范围的玩家列表--------------");
foreach (var aoiKey in enters)
{
var findEntity = zone[aoiKey];
Console.WriteLine($"X:{findEntity.X.Value} Y:{findEntity.Y.Value}");
}
// 更新key为3的坐标。
var entity = zone.Refresh(3, 20, 20, new Vector2(3, 3), out enters);
Console.WriteLine("---------------离开玩家范围的玩家列表--------------");
foreach (var aoiKey in entity.Leave)
{
var findEntity = zone[aoiKey];
Console.WriteLine($"X:{findEntity.X.Value} Y:{findEntity.Y.Value}");
}
Console.WriteLine("---------------key为3移动后加入玩家范围的玩家列表--------------");
foreach (var aoiKey in enters)
{
var findEntity = zone[aoiKey];
Console.WriteLine($"X:{findEntity.X.Value} Y:{findEntity.Y.Value}");
}
// 离开当前AOI
zone.Exit(50);
AOI算法实现和原理(一) AOI算法实现和原理(二)