《仓鼠球!GO!》
简介游戏名:《仓鼠球!GO!》项目链接: https://github.com/liuke101/HamsterGO
一款卡通风的冒险解谜游戏,玩家需要控制立方体旋转以驱动仓鼠球滚动,帮助困入迷宫中的仓鼠躲避种种障碍、解开谜题,最终获取迷宫中的宝藏。
游戏PV(若没有显示视频,请尝试刷新页面)
(function(){var player = new DPlayer({"container":document.getElementById("dplayer1"),"autoplay":true,"theme":"#FADFA3","loop":true,"lang":"zh-cn//语言","screenshot":true,"hotkey":true,"preload":"auto","volume":0.9,"video":{"url":"/resources/video/hamstergo.mp4","pic":"/resources/images/hamstergo.jpeg"}});window.dplayers||(window.dplayers=[]);window.dp ...
Effective Modern C++
第 1 章类型推导C++98 有一套类型推导的规则:用于函数模板的规则。C++11 修改了其中的一些规则并增加了两套规则,一套用于 auto,一套用于 decltype。C++14 扩展了 auto 和 decltype 可能使用的范围。
类型推导随处可见:在函数模板调用中,在大多数 auto 出现的地方,在 decltype 表达式出现的地方,以及 C++14 中令人费解的应用 decltype(auto) 的地方。
本章解释了模板类型推导是如何工作的,auto 是如何依赖类型推导的,以及 decltype 是如何按照它自己那套独特的规则工作的。它甚至解释了你该如何强制编译器使类型推导的结果可视,这能让你确认编译器的类型推导是否按照你期望的那样进行。
条款一:理解模板类型推导
[!NOTE]
在模板类型推导时,有引用的实参会被视为无引用,他们的引用会被忽略
对于万能引用的推导,左值实参会被特殊对待
对于传值类型推导,const 和 volatile 实参会被认为是 non-const 的和 non-volatile 的
在模板类型推导时,数组名或者函数名实参会退化为指针,除非 ...
Lua精粹
[!NOTE] 约定在本书中,我们使用
双引号表示字符串常量(如 "literal strings")
单引号表示单个字符(如 'a'),用作模式的字符串也会被单引号引起来,例如 '[%w_]*'。
符号<-->表示两者完全等价:
一、特性程序段我们将Lua语言执行的每一段代码(例如,一个文件或交互模式下的一行)称为一个程序段( Chunk ),即一组命令或表达式组成的序列。
注释注释格式:
123456-- 行注释--[[ 块注释 块注释]]
在注释一段代码时,一个常见的技巧是将这些代码放入 --[[ 和 --]] 之间,例如:
123--[[print(10) --被注释--]]
当我们需要重新启用这段代码时,只需在第一行行首添加一个连字符即可(即开头连续三个-):
1234---[[ print(10) -取消注释,可以--]]
解释:在第一个示例中,第一行的 --[[ 表示一段多行注释的开始,直到遇到两个连续的右括号这段多行注释才会结束,因而尽管最后一行有两个连续的连字符,但由于这两 ...
UE AI系统
架构Enemy 告诉 AI Controller 使用行为树组件的哪个行为树,然后行为树组件启动并运行(AI Controller 上调用)该行为树
行为树执行逻辑时,行为树会使用一种名为 黑板 的独立资源来存储它需要知道的信息(名为 黑板键),从而做出有根据的决策。常见工作流程是创建一块黑板,添加一些黑板键,然后创建一个使用黑板资源的行为树。
运行前提:
Pawn 关联 AIController
AIController 中, 当该控制器”Possess”此Pawn时,运行一个行为树:
关卡中寻路需要添加 NavMesh
执行顺序:从左到右,从上到下(中左右)
节点右上角的数字,表示操作的顺序蓝色节点被称为装饰器节点(在其他行为树系统中被称为 条件语句_)。它连接到一个合成节点,用于验证该黑板键是否为 true。这决定了该分支的其余部分是否能够执行。紫色节点是任务(Task)节点,是AI可以完成的动作。
特点:(与传统行为树的比较)
行为树由事件驱动,被动地监听可用于触发树中变化的”事件”,避免每帧进行不必要的共工作。
条件语句并非叶节点,而是装饰器(Decorator)节 ...
GAS精粹
项目地址: https://github.com/liuke101/ProjectGASRPG
GAS 插件
GAS 由多个组件构成:
**Ability System Component**:核心组件,由 C++ 编写,维持所属 Actor 拥有的所有技能的列表,并处理激活。
Gameplay Ability ,表示角色的技能,包括攻击、疾跑、施法、翻滚、使用道具等,但不包括基础移动和 UI
由 Gameplay Ability Tasks 以及其他函数构成。
Attribute Set ,附加到 ASC。
包含 GameplayAttribute ,用于驱动计算或表示资源。
Gameplay Effects ,处理 Actor 因使用技能而发生的属性更改。
Gameplay Effect Calculations ,提供模块化、可复用的方法来计算效果。
GameplayCue ,与 GE 关联,并提供数据驱动的方法来处理特效、音效。
GAS 指在处理所有这些用例,方法是将技能建模为负责自身执行的完全独立的实体。
谁可以释放技能? 持有 ASC 组件的 Actor
...
蓝图精粹
快捷键:虚幻引擎蓝图编辑器速查表
许多蓝图相关的函数带有 Kismet/K2 等字样,这都是遗留的东西,Kismet 是虚幻引擎早期版本中使用的一种脚本系统
1 事件特点:支持“委托”,支持时间轴
委托Delegate事件右上角有一个红色小正方形的事件称为委托。这只是对事件的引用。某些操作接收事件作为参数,并使用委托来实现事件。在下图中,名为”时钟”(Clock)的自定义事件委托连线到”按事件设置定时器”(Set Timer by Event)节点的“事件”(Event)输入引脚,这样每一秒都会调用“时钟”(Clock)事件。
Actor 事件Event Begin Play游戏开始时将在所有 Actor 上触发此事件。游戏开始后生成的所有 Actor 上均会立即调用此事件。
Event End PlayActor 从关卡中删除或移除时执行此事件。Event Destroyed 函数的功能已合并到 EndPlay 函数。
Event Tick游戏进程中每帧调用的简单事件。
Event OnReset此蓝图事件节点仅在关卡蓝图中可用。此蓝图事件节点仅在服务器上执行。在单人游戏中 ...
Renderer Feature
[!NOTE] 简称下文 Renderer Feature 简称为 RFRenderTexture 简称RT
介绍 URP Renderer Feature | Universal RP | 14.0.8 (unity3d.com)
使用 Example: How to create a custom rendering effect using the Render Objects Renderer Feature | Universal RP | 14.0.8 (unity3d.com)
Render Feature 是一种 Asset,用于向 URP 渲染器添加额外的 Render Pass 并配置其行为。
以下 Render Feature在 URP 中可用:
Render Objects 渲染对象
Screen Space Ambient Occlusion 屏幕空间环境光遮蔽
Decal 贴花
Screen Space Shadows 屏幕空间阴影
Full Screen Pass 全屏Pass
Render Objects RFRender Objects ...
UML类图
统一建模语言 (Unified Modeling Language,UML) 是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。UML 从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等 9 种图。
总结
UML 类途中常见的几种关系:
泛化 (Generalization):继承关系
实现 (Realization):实现接口,类与接口的关系,implements
关联 (Association):拥有的关系,单项关联(单项箭头 ),双向关联(无箭头),自身关联
聚合 (Aggregation):整体与部分,比如:人 - 手,脚的关系
组合 (Composition):整体与部分,是关联关系的一种,比聚合关系还要强的关系,如:构造函数中初始化的成员变量
依赖 (Dependency):是一种使用关系,尽量不要双向依赖,如:局部变量,方法的参数
各种关系的强弱程度:泛化(继承) = 实现 > 组合 > 聚合 > 关联 > 依赖
关联、聚合和组合 ...
UE网络精粹
1 虚幻中的网络虚幻引擎使用标准的客户端 - 服务器 (Client-Server)架构。
服务器是权威(Authoritative) 的。所有数据必须首先从客户端发送到服务器。之后,服务器验证数据并根据您的代码做出反应。
服务器是权威的,意味着服务器运行的游戏版本被认为是正确的版本
运行单人游戏时,UE 仍然使用 CS 架构,只不过客户端和服务器是同一台机器。
1.1 一个小例子当您作为客户端在多人游戏中移动角色时,您不会自己移动角色,而是告诉服务器您想要移动它。然后,服务器会为其他人(包括您)更新角色的变换。
[!info]
此外,为了防止本地客户端有 “滞后” 的感觉,程序员通常还让本地客户端直接控制他们的角色——尽管当客户端开始作弊时,服务器仍然可能覆盖角色的位置!这意味着客户端(几乎)永远不会直接与其他客户端“交谈”。
1.2 另一个例子当向另一个客户端(个人、公会、队伍等)发送聊天消息时,您首先将其发送到服务器,然后服务器将其传递给您想要联系的客户端。
[!danger]永远不要相信客户端!信任客户端意味着您在执行客户端的操作之前不会测试它们。这会允许他们 ...
【图形系统02】光栅化
光栅化 rasterization光栅 raster 这个词就是德语中屏幕的意思,光栅化的意思就是将图像绘制在屏幕上进行显示。
[!NOTE]要进行光栅化需要先将空间变换到屏幕空间,以下都是在屏幕空间上的操作
三角形-基本形状单元三角形在图形学中有很多很好的性质:
三角形是最基本的多边形,并且任何其他的多边形都可以拆分为三角形。
三个点可以保证他在一个平面如果是四边形四个点就不能保证。
它可以很好地用叉积判断一个点是不是在三角形内部(三角形的内外定义特别清晰)
采样采样就是给定一个连续的函数,在不同的点求它的值,也可以认为,采样是把一个连续的函数离散化的过程。光栅化的过程其实就是在屏幕空间离散的像素中心点上进行采样来判断像素是否在三角形内。比如下图中,要实现一个判断屏幕上的像素是否在三角形内的函数 inside (tri, x, y),然后将三角形顶点构成的最大长方形区域内所有点作为函数的输入,判断这些点是否在三角形内,如果在三角形内,就将屏幕上的像素点进行点亮。这个过程就是采样。其他采样的例子包括对视频进行时间上的采样,这样就可以得到视频中的某几帧画面。inside(tri, ...