Unity 九宫格AOI视野算法

这篇具有很好参考价值的文章主要介绍了Unity 九宫格AOI视野算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

九宫格AOI视野算法介绍

AOI(Area Of Interest 感兴趣的领域 )
我们通常把玩家周围的可视区域,叫做玩家感兴趣的领域即AOI。它的大小其实就是玩家的视野大小。它的作用就是根据AOI来优化数据的操作,比如不在视野范围的其他活跃对象的行为就不需要让玩家知道(反正玩家也看不到),这样减少了数据的传输。再一个就是通过AOI来判断我们释放一些互动动作的有效范围内都有些什么活跃对象,然后再和这些对象发生交互。
AOI算法不仅仅局限于九宫格,根据游戏需求还可能会有四宫格,十六宫格等等,九宫格只是本篇文章的一个例子而已。
Unity 九宫格AOI视野算法
想这张图片我们把地图分为若干个小格子,当我们站到5号位置的时候我们就只需要加载我们周围的8个格子和自己所在格子范围内的(敌人,玩家,怪物),相对的当我们站到6号位置的时候我们就加载以6号格子为中心周边的格子啦。相对的之前1,4,7号格子里面的(敌人,玩家,怪物),我们就不加载了,因为我们完全看不到。这样就减少了我们的数据交互。
在这里呢我做了一个简单的小栗子,里面仅仅实现了地图显示的功能(对于敌人等,其他对象的显示和互动大同小异,大家可以自行拓展),大家可以参考下。(代码可能没有那么完美,大家多多指教)
先康康效果
Unity 九宫格AOI视野算法

地图管理

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视野算法文章来源地址https://www.toymoban.com/news/detail-413352.html

到了这里,关于Unity 九宫格AOI视野算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity通过脚本实现漫游功能 wasd控制玩家移动,空格跳跃,鼠标控制视野旋转,滑轮控制镜头伸缩

    将场景中的摄像机删除,在玩家的控制面板中添加Camera组件,和rigibody组件   using System.Collections; using System.Collections.Generic; using UnityEngine; public class move : MonoBehaviour {     public float speed;     Rigidbody rigid;     void Start()     {                 rigid = GetComponentRigidbody();     }  

    2024年02月10日
    浏览(46)
  • 【爬虫】AOI

    目前几个大厂,高德百度腾讯,都支持POI爬取,而AOI是需要自己找接口的。 换言之,爬虫需谨慎 参考链接是: 这两个链接是选定范围爬取范围内选定类别的AOI 黑科技 | 百度地图抓取地块功能(上) 黑科技 | 百度地图获取地块功能属性(下) 而这个链接是用名称爬取。我参

    2024年02月13日
    浏览(26)
  • AOI与AVI:在视觉检测中的不同点和相似点

    AOI(关注区域)和AVI(视觉感兴趣区域)是视觉检测中常用的两个概念,主要用于识别和分析图像或视频中的特定区域。虽然这两个概念都涉及到注视行为和注意力分配,但它们在定义和实际应用等方面有一些差异。 AOI通常是指图像或视频中用户或观察者的关注区域,主要用

    2024年01月20日
    浏览(40)
  • 两个镜头、视野、分辨率不同的相机(rgb、红外)的视野校正

    目前在做的项目用到两个摄像头,一个是热成像摄像头、另一个是普通的rgb摄像头。 一开始的目标是让他们像素级重合,使得点击rgb图像时,即可知道其像素对应的温度。但是在尝试的过程中,发现基本不可能。因为由于纵深、遮挡、透视变形、视差等问题,两个摄像头拍摄

    2024年02月14日
    浏览(42)
  • 前端vue 宫格组件提供常见九宫格菜单组件,扩充性好,可切换九宫格 十二宫格 十五宫格

    快速实现vue uni-app宫格组件提供常见九宫格菜单组件,扩充性好,可切换九宫格 十二宫格 十五宫格; 阅读全文下载完整代码请关注微信公众号: 前端组件开发 效果图如下: 使用方法 HTML代码部分 JS代码 (引入组件 填充数据) CSS

    2024年02月08日
    浏览(35)
  • [CSS] 图片九宫格

    2024年02月13日
    浏览(29)
  • Android 九宫格布局

    效果图 实现思路: 1.使用GridView来实现九宫格布局,设置numColumns=3。 2.图标使用的是Font Awesome矢量图标,详情可以参考Android 在APP中使用 Font Awesome 图标_.fa-headphones_清山博客的博客-CSDN博客 实现步骤: 1.布局文件:activity_main.xml 就一个标题和一个GridView两部分组成。 activity_m

    2024年02月09日
    浏览(29)
  • 纯css实现九宫格图片

    本篇文章所分享的内容主要涉及到结构伪类选择器,不熟悉的小伙伴可以了解一下,在常用的css选择器中我也有分享相关内容。 话不多说,接下来我们直接上代码: 效果展示:   今日寄语:没有什么是不可能的,只是需要你去尝试!

    2024年02月14日
    浏览(30)
  • uniapp小程序九宫格抽奖

    定义好奖品下标,计时器开始抽奖,请求接口,出现中奖奖品之后,获取中奖商品对应的奖品下标,再次计时器判断当前移动的小标是否为中奖商品的下标,并且是否转到3圈(防止转1圈就停止),如果时就清除两次计时器。 当前代码封装为九宫格的组件; vue代码:  scss代

    2024年02月05日
    浏览(51)
  • css布局实战:动态详情九宫格

        上篇文件介绍了如何实现九宫格图片展示:css布局入门级实战之九宫格网格布局.不过存在一个问题:图片之间没有间距,用户体验欠佳;基于以上问题,本文进行优化.     较之前实现样式做以下调整:四张图按照两行显示,每行显示三个.不足的显示空白.之前是两行两列显示

    2024年02月01日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包