Unity 面试个人笔记

对象池就存放需要被反复调用资源的一个空间,当一个对象回大量生成的时候如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合),当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池中没有可用的对象,才需要重新创建,利用空间换时间来达到游戏的高速运行效果,在FPS游戏中要常被大量复制的对象包括子弹,敌人,粒子等。其次因为请求者和实现着分开,我们可以对请求的指令做很多操作,比如增加新的指令,修改指令等。
摘要由CSDN通过智能技术生成

ScriptableObject:

ScriptableObject 是 Unity 提供的一个数据配置存储基类,它是一个可以用来保存大量数据的数据容器,我们可以将它保存为自定义的数据资源文件。

ScriptableObject 是一个类似 MonoBehaviour 的基类,继承自 UnityEngine.Object 。要想使用它,需要我们写个脚本去继承 ScriptableObject 。需要注意的是,继承自 SctiptableObject 的脚本无法挂载到游戏物体上,毕竟它不是继承自 MonoBehaviour。

ScriptableObject 类的实例会被保存成资源文件(.asset文件),和预制体,材质球,音频文件等类似,都是一种资源文件,存放在 Assets 文件夹下,创建出来的实例也是唯一存在的。

ScriptableObject 的主要作用

大体上可以分成三点:
1) 编辑模式下的数据持久化
2) 配置文件 (配置游戏中的数据)
3) 数据复用 (多个对象共用一套数据)

如何生成非持久化数据?
利用 ScriptableObject 类中的静态方法 CreateInstance<>() 。该方法可以在运行时创建出指定继承自 ScriptableObject 的对象,该对象只存在于内存中,可以被GC垃圾回收,调用一次就创建一次。

Ⅳ. 让 ScriptableObject 真正意义上持久化

既然 ScriptableObject 本身无法在游戏打包发布后实现数据持久化,那么我们可以配合 Json,PlayerPrefs, xml ,二进制等方式来实现 ScriptableObject 真正意义上的数据持久化。

📕 Ⅱ. 生命周期函数

ScriptableObject 和 MonoBehaviour 类似,也存在生命周期函数,但是数量会少很多。

Awake 数据文件创建时调用

OnDestroy 对象将被销毁时调用

OnEnable 创建或加载对象时调用

OnDisable 对象销毁时,即将加载脚本程序集时调用

OnValidate 编辑器才会调用的函数,Unity在加载脚本或者Inspector面板中更改值时调用

除此之外继承自 ScriptableObject 的类中也可以自定义函数,并不是只能声明和数据有关的变量。

寻路算法

对于一些动态场景,比如运行时会动态生成障碍物或者障碍物可以移动的场景可以使用D-Star(D*)算法。对于静态场景,也就是场景固定的情况可以使用Dijkstra算法,A-Star(A*)算法。

对于上述这些算法如今都有一些比较完善的插件,我们只需要左点右点就可以实现寻路的功能,此外Unity也提供了NavMeshComponents用于寻路。本篇主要就是简单的介绍下A*算法的概念以及代码逻辑,只有了解了最基础的寻路算法,才能更好的理解更牛逼的寻路算法嘛,例如Jump Point Search

* 初始化open_set和close_set;
* 将起点加入open_set中,并设置优先级为0(优先级最高);
* 如果open_set不为空,则从open_set中选取优先级最高的节点n:
    * 如果节点n为终点,则:
        * 从终点开始逐步追踪parent节点,一直达到起点;
        * 返回找到的结果路径,算法结束;
    * 如果节点n不是终点,则:
        * 将节点n从open_set中删除,并加入close_set中;
        * 遍历节点n所有的邻近节点:
            * 如果邻近节点m在close_set中,则:
                * 跳过,选取下一个邻近节点
            * 如果邻近节点m在open_set中,则:
                * 判断节点n到节点m的 F(n) + cost[n,m] 值是否 < 节点m的 F(m) 。来尝试更新该点,重新设置f值和父节点等数据
            * 如果邻近节点m也不在open_set中,则:
                * 设置节点m的parent为节点n
                * 计算节点m的优先级
                * 将节点m加入open_set中

Unity 常用设计模式

工厂模式:

工厂模式(Factory Pattern)是 游戏开发中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对用户暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

某个品牌的汽车制造工厂,对外提供生产这个品牌的不同型号汽车的服务。外界只要下一个”汽车型号”, 工厂可以根据型号构建出来不同型号的汽车。这样外界不用关心工厂内部是怎么运作的,当用户需要某个型号的汽车的时候调用接口就可以了,同时内部工厂的机制,可以任意的修改,比如增加了一个新的汽车型号的服务等。

单例模式:

在我们的整个游戏生命周期当中,有很多对象从始至终有且只有一个。这个唯一的实例只需要生成一次,并且直到游戏结束才需要销毁。
单例模式一般应用于管理器类,或者是一些需要持久化存在的对象。

优点:写起来很方便,调用方便。
缺点:容易形成依赖,忽略与其他设计模式的协作。

某个类只能有一个实例&#x

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值