Unity 九宫格AOI视野算法

编程入门 行业动态 更新时间:2024-10-28 06:36:06

Unity 九宫格AOI视野<a href=https://www.elefans.com/category/jswz/34/1770096.html style=算法"/>

Unity 九宫格AOI视野算法

九宫格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];}
}

玩家控制器

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

以上就是我写的小栗子。没有注释因为方法名已经写的很明显了。
看不懂的小伙伴可以私信也可以评论区留言,我一定会积极回答的哦。
另外附上项目源码仅供参考!!!谢谢大家😘😘😘

更多推荐

Unity 九宫格AOI视野算法

本文发布于:2024-02-25 07:34:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1698243.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:算法   视野   九宫格   Unity   AOI

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!