Python In Unreal
Unreal 锦囊
少见的接口
// 排序
// 假如有一个列表
TArray<FItem> ItemList;
Algo::SortBy(EntryList, &FItem::ID);
Algo::SortBy(EntryList, &FItem::SomeField, TGreater<>());
Python
问题: 如何在 ue 使用 asyncio
解决: 正常地使用 asyncio loop 会卡住 ue 主线程,需要使用ue本身的tick
def update(delta_seconds):
try:
loop = asyncio.get_event_loo...
git/svn 锦囊
git/svn 锦囊
git
查看日志
# 显示 b1 分支上没有合并到 master 的提交
git log master..b1
# 显示从 c869c18cd 到 HEAD 之间的提交
git log c869c18cd..HEAD
# 查看某段时间的日志 + 特定格式
# https://git-scm.com/docs/git-log, format:<format-string>
git log --since='2022-02-15' --pretty=format:'%s'
# 列出某次提交中某个文件的修改
git show commit-id file-path
# blame
git blame <filename> -L <...
用 Unity 实现 3D 文字游戏
用 Unity 实现 3D 文字游戏
关于《文字游戏》
《文字游戏》是一款由台湾游戏团队Team9所开发的角色扮演解谜类文字游戏,已于2022年1月21日推出Microsoft Windows及Mac OS X完整版本。
在游戏设定中,世界是由汉字构成,而“字”除了是故事叙述与界面的载体,同时也是故事内的物件、人物和场景。参考像素、ASCII艺术风格,以方块字作为棋盘式地图上的点阵单位,玩家将操控“我”,从叙述与物件的谜题中找出线索,通过删减、搬移、拆解、组合改变句义、主导剧情。
(图1)
除了2D部分,游戏中还有3D部分:
(图2)
视频如下 https://www.bilibili.com/video/BV1dK411G7aQ/
重点是 18”、29”、1’22” 三处
...
随机选取链表元素
#随机选取链表元素
问题1: 有一个长度未知但有限的链表K={k1, k2, k3…},现在需要从链表中选取一个元素,使得 K 中每一个元素被选中的概率都相等。
解决1: 从前到后遍历链表。设当前元素为 kn,则从[0,n-1] 中随机一个整数 r,如果 r==0 则令 kn 为选中值。等链表遍历过一次之后,将选中值返回。时间复杂度为O(n)。
ret = k.first
crnt_node = k.first
count = 1
while crnt_node.next != None:
# 这里把整数变成了等价的连续区间概率
if rand() < 1 / count:
ret = crnt_node
crnt_node = crn...
生成迷宫
生成迷宫
基本的深度优先搜索算法:方格迷宫
(图1)
假如给定这样一个迷宫,起点是左下角,终点是右上角,容易想到使用深度优先搜索寻找路线。
同样的道理,对于一个未初始化的迷宫,也可以使用深度优先搜索生成路线。整个过程是等用于把图展开成树的过程。
这里假设有一个链表 path,类型是 point,初始状态只包括起点一个元素。
Step 方法负责进行一小步深度搜索。每次从链表的尾部取出一个节点,以随机方向访问它的邻居,如果这个节点有未搜索过的邻居,则把邻居标记为已搜索、压入链表并返回。如果所有邻居都已经搜索过,则把尾节点从链表中弹出。
一直循环 Step 方法直到 path 为空,即生成了一个迷宫。
public bool Step()
{
if (...
DualKeyDictionary
C# 代码规范
大小写
名字空间、类名、属性字段、方法、枚举用Pascal(大驼峰)式
文件夹名字用Pascal式。尽量做到每个文件代表一个类/枚举/接口,或者至少是围绕一个核心组织的一组类/枚举/接口,文件名字和核心一致。
字段名用小驼峰式,私有成员不需要加 _ 或者 m_(不要匈牙利命名法)
常量用全大写加下划线如 const int BOOK_MAX_COUNT = 5,包括 const 和 readonly
少于等于两个字母的缩写词全大写,如 System.IO。多于两个字母的缩写词使用驼峰式,如HtmlReader。
空行和空格
类(接口、枚举)与类(接口、枚举)之间空两行
类内的方法、属性前后空一行
函数内的逻辑段之间(逻辑段过长的...
DualKeyDictionary
DualKeyDictionary
双键字典,我们的目标是
public class DualKeyDictionary<TK1, TK2, TV> dict;
dict.Set(k1, k2, $"{k1}.{k2}");
dict.Get(k1, k2);
foreach (var pair in dict){
// pair.key1, pair.key2, pair.value
}
foreach(var pair in dict.GetCollectionByKey1(k1)){
}
foreach(var pair in dict.GetCollectionByKey2(k2)){
}
单键字典的实现
(图缺)
扩展到双键字...
《游戏引擎架构2》 10 渲染引擎
10.1 光栅化基础
渲染步骤:一个场景、一个摄像机、一个光源,物体表面的视觉特性、求解渲染方程
10.1.1 场景
面片、样条、三角形、镶嵌、三角化
LOD、动态镶嵌、渐进网格
三角形
法线:任意两条棱的叉积,归一化之后的向量
缠绕顺序、背面剔除
三角形表、索引化三角形表、顶点缓冲/顶点数组、索引缓冲/索引数组
三角形带/三角形扇:一种顶点数组
空间
模型空间、世界空间
世界矩阵M = [(i,0), (j, 0), (k,0), (t,1)],其中ijk是以世界空间表示的模型空间基向量,t是模型空间轴在世界空间的平移
或者 M = [(RS, 0), (t, 1)]
变换法线时需要乘以M的逆转矩阵
10.1.2 表面的视觉性质
光和颜色:吸收、反射、传播/折射、衍射、干涉、极化...
共计 45 篇文章,6 页。