九宫格AOI视野算法介绍
AOI(Area Of Interest 感兴趣的领域 )
我们通常把玩家周围的可视区域,叫做玩家感兴趣的领域即AOI。它的大小其实就是玩家的视野大小。它的作用就是根据AOI来优化数据的操作,比如不在视野范围的其他活跃对象的行为就不需要让玩家知道(反正玩家也看不到),这样减少了数据的传输。再一个就是通过AOI来判断我们释放一些互动动作的有效范围内都有些什么活跃对象,然后再和这些对象发生交互。
AOI算法不仅仅局限于九宫格,根据游戏需求还可能会有四宫格,十六宫格等等,九宫格只是本篇文章的一个例子而已。
想这张图片我们把地图分为若干个小格子,当我们站到5号位置的时候我们就只需要加载我们周围的8个格子和自己所在格子范围内的(敌人,玩家,怪物),相对的当我们站到6号位置的时候我们就加载以6号格子为中心周边的格子啦。相对的之前1,4,7号格子里面的(敌人,玩家,怪物),我们就不加载了,因为我们完全看不到。这样就减少了我们的数据交互。
在这里呢我做了一个简单的小栗子,里面仅仅实现了地图显示的功能(对于敌人等,其他对象的显示和互动大同小异,大家可以自行拓展),大家可以参考下。(代码可能没有那么完美,大家多多指教)
先康康效果
地图管理
using System.Collections.Generic;
using UnityEngine;
public class MapManager : MonoBehaviour
{
[Range(1, 10)]
public int oneMapScale;
Dictionary<int, Dictionary<int, GameObject>> allMaps = new Dictionary<int, Dictionary<int, GameObject>>();
List<GameObject> mapPools = new List<GameObject>();
public GameObject map;
public void CreatMap(int x, int y)
{
List<GameObject> viewMap = new List<GameObject>();
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
viewMap.Add(CreatOMap(x + i, y + j));
}
}
for(int i=0;i<mapPools.Count; i++)
{
if (!viewMap.Contains(mapPools[i]))
{
mapPools[i].SetActive(false);
}
}
mapPools.Clear();
mapPools=viewMap;
for(int i=0;i<mapPools.Count;i++)
{
mapPools[i].SetActive(true);
}
}
private GameObject CreatOMap(int v1, int v2)
{
if (allMaps.ContainsKey(v1))
{
if (!allMaps[v1].ContainsKey(v2))
{
GameObject go = Instantiate(map, transform);
go.transform.position = new Vector3(v1 * 10 * oneMapScale, 0, v2 * 10 * oneMapScale);
go.transform.GetChild(0).GetComponent<TextMesh>().text="("+v1+","+v2+")";
go.GetComponent<Renderer>().material.color= UnityEngine.Random.ColorHSV();
allMaps[v1].Add(v2, go);
}
}
else
{
GameObject go = Instantiate(map, transform);
go.transform.position = new Vector3(v1 * 10 * oneMapScale, 0, v2 * 10 * oneMapScale);
go.transform.GetChild(0).GetComponent<TextMesh>().text = "(" + v1 + "," + v2 + ")";
go.GetComponent<Renderer>().material.color = UnityEngine.Random.ColorHSV();
Dictionary<int, GameObject> v2map = new Dictionary<int, GameObject>();
v2map.Add(v2, go);
allMaps.Add(v1,v2map);
}
return allMaps[v1][v2];
}
}
玩家控制器文章来源:https://www.toymoban.com/news/detail-413352.html
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
public MapManager mapManager;
Camera cam;
int mapScale;
int pyl;
int x = 0;
int y = 0;
float v;
float h;
float speed = 10;
Vector3 gs = new Vector3(0, 2, -2);
private void Awake()
{
cam = Camera.main;
mapScale = mapManager.oneMapScale * 10;
pyl = mapScale/2;
mapManager.CreatMap(x, y);
cam.transform.position = transform.position + gs;
cam.transform.LookAt(transform);
}
void Update()
{
v = Input.GetAxis("Vertical");
h = Input.GetAxis("Horizontal");
if(v!=0||h!=0)
{
transform.position += Vector3.forward * v * Time.deltaTime*speed;
transform.position += Vector3.right * h * Time.deltaTime*speed;
cam.transform.position=transform.position+gs;
cam.transform.LookAt(transform);
if(Mathf.Floor((transform.position.x+pyl)/mapScale)!=x|| Mathf.Floor((transform.position.z+pyl) / mapScale)!=y)
{
x = (int)Mathf.Floor((transform.position.x + pyl) / mapScale);
y = (int)Mathf.Floor((transform.position.z + pyl) / mapScale);
mapManager.CreatMap(x, y);
}
}
}
}
以上就是我写的小栗子。没有注释因为方法名已经写的很明显了。
看不懂的小伙伴可以私信也可以评论区留言,我一定会积极回答的哦。
另外附上项目源码仅供参考!!!谢谢大家😘😘😘文章来源地址https://www.toymoban.com/news/detail-413352.html
到了这里,关于Unity 九宫格AOI视野算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!