游戏实用技术专栏
文章平均质量分 71
Currybeefer
这个作者很懒,什么都没留下…
展开
-
《游戏编程模式》学习笔记(十四)事件队列 Event Queue
事件队列在队列中按先入先出的顺序存储一系列通知或请求。发送通知时,将请求放入队列并返回。处理请求的系统之后稍晚从队列中获取请求并处理。这解耦了发送者和接收者,既静态又及时。原创 2023-10-11 21:21:31 · 534 阅读 · 0 评论 -
《游戏编程模式》学习笔记(十二)类型对象 Type Object
那么问题来了,每次你要创造一个新的种类的敌人,即使这些敌人仅仅是名字不一样,其属性和行为都差不多,你都得写代码。实例相关的数据被存储在有类型对象的实例中,被同种类分享的数据或者行为存储在类型对象中。这让我们在一组相同的对象间分享行为和数据,就像子类让我们做的那样,但没有固定的硬编码子类集合。Breed类本质上定义了一个怪物的类型,这就是为啥这个模式叫做类型对象。最容易想到的就是,哦,我先写一个Monster抽象基类,里边定义了基本的属性和抽象方法,然后让子类继承这个基类,来制造特定的敌人。原创 2023-10-08 21:32:56 · 836 阅读 · 0 评论 -
《游戏编程模式》学习笔记(十二)子类沙箱 Subclass Sandbox
基类定义抽象的沙箱方法和几个提供的操作。将操作标为protected,表明它们只为子类所使用。每个推导出的沙箱子类用提供的操作实现了沙箱函数。原创 2023-09-10 14:14:28 · 255 阅读 · 0 评论 -
《游戏编程模式》学习笔记(十)更新方法 Sequencing Patterns
游戏世界管理对象集合。每个对象实现一个更新方法模拟对象在一帧内的行为。每一帧,游戏循环更新集合中的每一个对象。这个模式的定义十分直观,简单地说,就是我们的游戏世界有一个大循环Update(),而我们在游戏对象中封装一个update()小方法来存储个体的更新逻辑,同时因为封装在了小方法里,我们可以自由地添加一些类变量来帮助我们存储状态。原创 2023-09-10 11:35:35 · 212 阅读 · 0 评论 -
《游戏编程模式》学习笔记(九)游戏循环 Sequencing Patterns
所以有时候会出现渲染在两次更新之间的情况,而这个时候,渲染的往往是前一次更新的时候的情况,这会造成困扰,例如玩家看见子弹在左边,下一次渲染的时候应该在中间但还是显示在左边。在代码中可以看到,这个循环会计算上一次循环到现在间隔的时间,如果间隔时间过长,就会进入里边的小循环,多次调用update方法以追上现实时间。每一次循环,它都会无阻塞地处理玩家的输入,更新游戏的状态,渲染游戏。用真实的时间做循环,每次循环会计算上一次循环到这一次循环所用的时间间隔,然后在update的时候传入这个时间间隔。原创 2023-08-29 11:16:37 · 511 阅读 · 0 评论 -
《游戏编程模式》学习笔记(八)双缓冲模式 Sequencing Patterns
双缓冲模式定义缓冲类封装了缓冲:一段可改变的状态。这个缓冲被增量地修改,但我们想要外部的代码将修改视为单一的原子操作。为了实现这点,类保存了两个缓冲的实例:下一缓冲和当前缓冲。当信息从缓冲区中读取,它总是读取当前的缓冲区。当信息需要写到缓存,它总是在下一缓冲区上操作。当改变完成后,一个交换操作会立刻将当前缓冲区和下一缓冲区交换, 这样新缓冲区就是公共可见的了。旧的缓冲区成为下一个重用的缓冲区。原创 2023-08-24 18:38:22 · 236 阅读 · 0 评论 -
《游戏编程模式》学习笔记(七)状态模式 State Pattern
允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。原创 2023-08-19 21:15:22 · 580 阅读 · 0 评论 -
《游戏编程模式》学习笔记(六)单例模式 Singleton Pattern
保证一个类只有一个实例,并且提供了访问该实例的全局访问点。定义这种东西一般都是不说人话的,要想要理解这句话的意思,我们得把它揉开了才能搞明白。我们先看前半句 “保证一个类只有一个实例”,单例一般使用类来实现,也就是说,这个单例类,其有且只能有一个实例化的对象instance,一旦出现多个,就不是单例模式。后半句“并且提供了访问该实例的全局访问点”,这句话的意思是,这个实例化的对象是全局可见的,任何系统,任何类都可以访问这个实例化的单例对象。原创 2023-08-16 20:48:25 · 1127 阅读 · 0 评论 -
《游戏编程模式》学习笔记(五)原型模式 Prototype Pattern
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原创 2023-08-15 18:34:50 · 584 阅读 · 0 评论 -
《游戏编程模式》学习笔记(四) 观察者模式 Observer Pattern
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这是定义,看不懂就看不懂吧,我接下来举个例子慢慢说。原创 2023-08-15 18:30:28 · 893 阅读 · 0 评论 -
《游戏编程模式》学习笔记(三)享元模式 Flyweight Pattern
为了减少需要推送到GPU的数据量,我们想把共享的数据——TreeModel——只发送一次。然后,我们分别发送每个树独特的数据——位置,颜色,大小。第一部分是一块需要渲染多次的共同数据——在例子中是树的网格和纹理。我们只需要一个TreeModel实例化的对象就好了,剩下的树只需要保存一个TreeModel的指针,就可以很快的找到这个对象。这就是享元模式,实际上我认为享元模式没有什么好说的东西,所以这里的大部分内容我都是直接照搬原著的。在系统设计中,对象实例进行分类后,发现真正有区别的分类很少的时候。原创 2023-08-04 14:36:33 · 591 阅读 · 0 评论 -
《游戏设计模式》学习笔记(二)命令模式 Command Pattern
采用命令模式后,我们将jump,fire这些方法做成一个抽象类command的子类,这样每个命令就有了面向对象的形式的封装(将命令变为数据对象,让这个对象和其他对象一样可以被存储和传递)2.对于不同的游戏角色,我们因为会往里边传入不同actor的引用,最后调用的是actor中内置的方法(如jump方法),这就实现了不同的角色拥有不同的按键行为。1.对于不同的按键,由于其类型都是command*,我们只需要让这个指针指向不同的子类命令对象,就可以实现按键配置功能了。这个时候我们就需要考虑使用命令模式了。原创 2023-08-04 14:34:39 · 1924 阅读 · 0 评论 -
《游戏编程模式》学习笔记(一) 架构,性能和游戏
开新坑,准备把《游戏编程模式》这本书啃完。这是一本讲设计模式的书,针对游戏开发而作,写得很好。以下是读书笔记,文末有原文链接。原创 2023-08-04 14:31:37 · 435 阅读 · 0 评论 -
游戏开发中deltatime(时间增量)的作用
在游戏开发中,若我们要让一个物体移动,通常的做法如下:Update(){ MyObject.transform.y += Speed*Time.deltaTime;}即在Update()中( UE4中为Tick() ) 让物体的移动属性+=需要移动的速度*Time.deltaTime。其中移动速度很好理解,就是想要物体在1秒内移动的距离,那么后边那个神秘的deltaTime是什么呢?为什么在众多游戏开发教程中,都要求我们乘上这个deltaTime呢?先说结论:乘以deltaTime是原创 2021-08-23 09:52:25 · 1902 阅读 · 0 评论 -
【Unity】设计一个基本的第一人称控制器
如图所示,创建一个胶囊体,将其放在一个空物体下,去除胶囊体的Collider。将Camera也放在空物体下。在空物体下加上一个capsule colliderr,同时给空物体加上rigibody,freeze其x和轴的旋转。创建脚本 FPSMouseLook,将其挂在相机上,代码内容如下:using System.Collections;using System.Collections.Generic;using UnityEngine;public class FPSMouseLook : .原创 2021-04-07 22:17:07 · 293 阅读 · 0 评论 -
【转载】寻路建模的三种方式比较
原文链接:https://blog.csdn.net/needmorecode/article/details/82050409概述本文对于游戏寻路中主流的三种建模方式做了比较,分析各自的适用范围和优缺点。这三种建模方式包括:格子(Grid)、路点(Waypoint)、导航网格(Navmesh)。写这篇的原因是项目里需要选择一种合适的寻路实现方案,查阅了大量的文章和算法后,结合着自己的思考和实践,在此做个小结。这里的建模指的是为地图寻找一个空间表征(spatial representation),即转载 2021-02-23 16:07:38 · 552 阅读 · 0 评论 -
那些游戏中的寻路算法
在游戏中,AI人物的移动往往有许多种实现方法,本文主要列出其中的几种常见的2D寻路方法并附上完整源代码,供读者参考,批评以及指正。所有的代码均在Unity下完成,并通过测试可以使用。 Depth-First-Search 深度优先搜索深度优先(DFS)算法,正如他的名字,每次先往深度走,如果此路走到底都没找到,退回到原点,换另一条路找,如果走到底还是没找到,继续换一条路,直到全部路走完。DFS由于每次向深处搜索然后返回,很容易就让人想到用栈实现,而系统本来就有提供栈,即用递归实现。由于深度优先原创 2021-02-22 20:58:37 · 3176 阅读 · 5 评论 -
【迪杰斯特拉】Dijkstra算法介绍
迪杰斯特拉算法介绍迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。基本思想通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是转载 2021-02-18 20:47:45 · 840 阅读 · 0 评论 -
【Unity】基于A*算法的简单寻路代码实现
using System.Collections;using System.Collections.Generic;using UnityEngine;public class AStarAlgorithm{ const int XLength = 10; const int YLength = 10; public AStarPoint[,] pointGrid = new AStarPoint[XLength,YLength]; public Stack..原创 2020-11-28 15:13:09 · 480 阅读 · 0 评论 -
【Unity】【转载】 游戏中的行为树的一系列教程
游戏AI - 行为树Part1:简介游戏AI - 行为树Part2:框架AI 行为树的工作原理转载 2020-11-26 15:08:08 · 305 阅读 · 0 评论 -
【Unity】【转载】Unity客户端开发中常用的技术
尊重原创,转载于:https://blog.csdn.net/qq_34421469/article/details/1037137841.LOD技术层次细节(LOD),它是根据物体在游戏画面中所占视图的百分比来调用不同复杂度的模型的。简单而言,就是当一个物体距离摄像机比较远的时候使用低模,当物体距离摄像机比较近的时候使用高模。这是一种优化游戏渲染效率的常用方法。使用这个技术,一般是在解决运行时流畅度的问题,采用的是空间换时间的方式。2.遮挡剔除技术在场景空间中创建一个遮挡区域,该遮挡区域是有单元格转载 2020-11-26 14:05:42 · 1079 阅读 · 0 评论 -
【Unity】【转载】Unity协程(Coroutine)原理深入剖析
尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield return ,就可以通过StartCoroutine调用了。后来也是一直稀里糊涂地用,上网google些基本都是例子,很少能帮助深入理解Unity协程的原理的。本文只是从Unity的角度去分析理解协程的内部运行原理,而不是从C转载 2020-11-23 17:56:08 · 537 阅读 · 0 评论 -
【Unity】【转载】Awake()和Start()的本质区别
版权声明:本文为燕良原创文章,转载请注明出处:https://neil3d.github.io昨天被问到一个问题MonoBehaviour的Awake()和Start()的区别是啥?当然Awake()会在Start()之前被调用,这个地球人都知道了。如果只是顺序问题,那当然就没太大必要搞两个函数了。仔细研究了一下API文档:Awake():Awake is called when the script instance is being loaded.Start():Start is called转载 2020-11-22 10:45:57 · 265 阅读 · 0 评论 -
【Unity】【转载】游戏中的寻路算法(A*算法)的详解
A* 寻路算法原文地址: http://www.gamedev.net/reference/articles/article2003.asp转载原文地址:https://blog.csdn.net/hitwhylz/article/details/23089415概述虽然掌握了 A* 算法的人认为它容易,但是对于初学者来说, A* 算法还是很复杂的。搜索区域(The Search Area)我们假设某人要从 A 点移动到 B 点,但是这两点之间被一堵墙隔开。如图 1 ,绿色是 A ,红色是 B转载 2020-11-10 14:09:37 · 1126 阅读 · 0 评论 -
【Unity】【转载】对象池的初步理解和运用
在我们使用对象池之前我们需要知道以下两点:1.什么是对象池? 池(Pool),与集合在某种意义上有些相似。 水池,是一定数量的水的集合;内存池,是一定数量的已经分配好的内存的集合;线程池,是一定数量的已经创建好的线程的集合。那么,对象池,顾名思义就是一定数量的已经创建好的对象(Object)的集合[1]。 在面向对象过程中,如果一种对象,你要经常使用,并且需要反复创建、销毁,这样子一方面开销会比较大,另一方面会产生很多内存碎片,程序运行时间一过长,性能就会下降。这个时候,就产生了对象池。我们可以事转载 2020-10-19 17:50:47 · 207 阅读 · 0 评论