学习虚幻4的笔记(第一部分)
目录
- 蓝图
- 蓝图的概念
- 蓝图的工作方式
- 常用的蓝图类型
- 关卡蓝图
- 关卡的概念
- 默认关卡蓝图
- 蓝图类
- 概念
- 蓝图通信
- 直接蓝图通信
- 概念
- 使用情景
- 事件分配器
- 概念
- 使用情景
- 蓝图接口
- 概念
- 使用情景
- 蓝图投射
- 使用情景
蓝图
蓝图的概念
虚幻引擎中的蓝图-可视化脚本系统是一个完整的游戏脚本系统,此系统的基础概念是使用基于节点的界面在虚幻编辑器中创建游戏元素(gameplay elements)。与诸多常用脚本语言相同,它用于在引擎中定义面向对象类(OO)或对象。当您在使用UE4时,您经常会发现使用蓝图定义的对象通俗地称为“蓝图”。
蓝图的工作方式
在其基本形式中,蓝图是游戏的可视化脚本附加。使用引线连接节点、事件、函数和变量后即可创建复杂的游戏性元素。
蓝图使用节点图表来达到蓝图每个实例特有的诸多目的(如目标构建、个体函数,以及通用gameplay事件),以便实现行为和其他功能。
常用的蓝图类型
最常使用的蓝图类型是关卡蓝图和蓝图类。他们是诸多蓝图类型中的两类,其他还有蓝图宏及蓝图接口。
关卡蓝图
关卡蓝图(Level Blueprint)是一种专业类型的 蓝图(Blueprint),用作关卡范围的全局事件图。 在默认情况下,项目中的每个关卡都创建了自己的关卡蓝图,您可以在虚幻编辑器中编辑这些关卡蓝图, 但是不能通过编辑器接口创建新的关卡蓝图。
关卡的概念
“Level” 就是创建的场景,可以理解为容器(比喻来说可以理解成包装袋、包装盒等) 。
默认关卡蓝图
每个游戏都可以在DefaultGame.ini配置文件中指定默认的关卡蓝图类。所有新地图的关卡蓝图都将使用此类创建,以允许特定于游戏的附加内容和功能。
蓝图类
概念
蓝图类又叫蓝图系统是包裹一个游戏对象数据逻辑和各种内容及可编辑属性为一体的容器,通常命名以BP_ 开头,图标下带有蓝色条纹。可以展开独立编辑页面,通常由视口和事件图表等组成。
蓝图通信
使用蓝图时,如需在蓝图之间传递或共享信息,需要使用某一种形式的蓝图通信。可根据需求使用数种不同类型的通信。
直接蓝图通信
概念
通过公开的对象变量(Variable)获得对目标蓝图的参考,然后指定要访问该蓝图的哪个实例。
使用情景
- 关卡中存在两个 Actors,需要进行相互之间的通信。
事件分配器
概念
事件分配器适用于告知其他"正在倾听的"蓝图已发生事件。事件发生时,正在倾听的蓝图便会作出反应,并相互独立地执行预期的操作。(观察者模式)
例如,游戏中有一个 Boss,它被消灭时将会调用"OnDied"事件分配器。可将"OnDied"事件 绑定 在任意数量的其他蓝图中,如角色(作出庆祝动作)、关卡中的门(会打开)或 HUD(显示 UI 信息)。所有这些蓝图均在收到 Boss 被消灭的"OnDied"通知后执行。
使用情景
- 需要从角色蓝图到关卡蓝图进行通信时。
- 生成的 Actor 执行某种操作时触发事件时。
蓝图接口
概念
通过蓝图接口(简称 接口)可实现与多种类型对象(均共享特定功能)形成互动的一般方法。 例如汽车和树是完全不同的两种对象,但拥有一个共同点 - 它们均可被武器开火击中并遭到破坏。接口实际上就是制定的统一规范的协议。而蓝图接口就是对蓝图制定的一系列规则的协议。
多个蓝图可应用一个接口,但并非所有蓝图均会形成反应(部分蓝图将无视调用)。回到之前武器开火的例子中,墙壁不需要对破坏作出反应,因此它们不会应用带 OnTakeWeaponFire 函数的接口,并无视调用。
使用情景
- 数个蓝图中存在一些相似功能,但在调用后执行不同的效果。
- 玩家拥有一个火焰喷射器,使用时将触发一个名为 ElementalDamage 的事件。树木蓝图接受 ElementalDamage 调用并将树木烧毁,而雪人蓝图将把雪人融化。
- 玩家拥有一个"use"按钮,按下按钮可执行开门、关灯、拾起道具等操作。
- 敌人拥有特殊能力,可基于玩家的体力值完成变化,执行不同操作。
蓝图投射
蓝图通信的另一种常见形式是使用 Cast 节点。使用 Cast 节点时,便是在询问对象"你是否为该对象的特殊版本"。如果是,则进行访问;如否,则忽略请求。
例如,您创建了一个名为"Flying Character 蓝图"的特殊角色蓝图,此蓝图可使玩家角色在游戏中飞行。您可使用 Get Player Character 节点访问玩家角色的移动组件并在通过常规方法对玩家产生影响,如设置其位置、旋转等。您无法获得飞行能力,因为 Character 蓝图并不了解飞行。只有"Flying Character 蓝图"了解飞行。在此例中,您需要获取玩家角色和 Cast To Flying 蓝图,之后才可访问 flying 函数。
如玩家角色未使用 Flying Character 蓝图而完全使用不同类型的 Character 蓝图,则执行 Cast To Flying 蓝图时会失败,因为并未使用 Flying 蓝图,所以无法访问并执行飞行命令。
使用情景
-
需要访问另一个蓝图的特殊版本。
- 角色走进火焰中,导致体力值耗尽。
- 投射到特殊的角色蓝图,以便访问并变更体力值。
- 角色死亡,需要重新生成。
- 投射到特殊的游戏模式蓝图,执行重新生成脚本。
- 角色走进火焰中,导致体力值耗尽。
-
需要访问相同类的多个蓝图,并以相同方法进行修改。
- 场景中拥有数盏灯,事件发生时需将它们开启或关闭。
- 投射到灯蓝图并执行函数将灯关闭。
- 场景中拥有数盏灯,事件发生时需将它们开启或关闭。
-
需要访问一个特殊的子蓝图。
- 存在基于一个动物蓝图(猫、狗、鸟)的数个蓝图,需要访问其中一个动物。
- 投射到猫、狗和鸟,访问其相应的蓝图和特有功能。
- 存在基于一个动物蓝图(猫、狗、鸟)的数个蓝图,需要访问其中一个动物。
推荐阅读
-
正负偏差变量 即 d2+、d2- 分别表示决策值中超出和未达到目标值的部分。而 di+、di- 均大于 0 刚性约束和目标约束(柔性目标约束有偏差) 在多目标规划中,>=/<= 在刚性约束中保持不变。当需要将约束条件转换为柔性约束条件时,需要将 >=/<= 更改为 =(因为已经有 d2+、d2- 用来表示正负偏差),并附加上 (+dii-di+) 注意这里是 +di、-di+!之所以是 +di,-di+,是因为需要将目标还原为最接近的原始刚性约束条件 优先级因素和权重因素 对多个目标进行优先排序和优先排序 目标规划的目标函数 是所有偏差变量的加权和。值得注意的是,这个加权和都取最小值。而 di+ 和 dii- 并不一定要出现在每个不同的需求层次中。具体分析需要具体问题具体分析 下面是一个例子: 题目中说设备 B 既要求充分利用,又要求尽可能不加班,那么列出的时间计量表达式即为:min z = P3 (d3- + d3 +) 使用 + 而不是 -d3 + 的原因是:正负偏差不可能同时存在,必须有 di+di=0 (因为判定值不可能同时大于目标值和小于目标值),而前面是 min,所以只要取 + 并让 di+ 和 dii- 都为正值即可。因此,得出以下规则: 最后,给出示例和相应的解法: 问题:某企业生产 A 和 B 两种产品,需要使用 A、B、C 三种设备。下表显示了与工时和设备使用限制有关的产品利润率。问该企业应如何组织生产以实现下列目标? (1) 力争利润目标不低于 1 500 美元; (2) 考虑到市场需求,A、B 两种产品的生产比例应尽量保持在 1:2; (3)设备 A 是贵重设备,严禁超时使用; (4)设备 C 可以适当加班,但要控制;设备 B 要求充分利用,但尽量不加班。 从重要性来看,设备 B 的重要性是设备 C 的三倍。 建立相应的目标规划模型并求解。 解:设企业生产 A、B 两种产品的件数分别为 x1、x2,并建立相应的目标计划模型: 以下为顺序求解法,利用 LINGO 求解: 1 级目标: 模型。 设置。 variable/1..2/:x;! s_con_num/1...4/:g,dplus,dminus;!所需软约束数量(g=dplus=dminus 数量)及相关参数; s_con(s_con_num);! s_con(s_con_num,variable):c;!软约束系数; 结束集 数据。 g=1500 0 16 15. c=200 300 2 -1 4 0 0 5; 结束数据 min=dminus(1);!第一个目标函数;!对应于 min=z 的第一小部分;! 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); !使用设置完成的数据构建软约束表达式; ! !软约束表达式 @for(variable:@gin(x)); !将变量约束为整数; ! 结束 此时,第一级目标的最优值为 0,第一级偏差为 0: 第二级目标: !求 dminus(1)=0,然后求解第二级目标。 模型。 设置。 变量/1..2/:x;!设置:变量/1..2/:x; ! s_con_num/1...4/:g,dplus,dminus;!软约束数量及相关参数; s_con(s_con_num(s_con_num));! s_con(s_con_num,variable):c;! 软约束系数; s_con(s_con_num,variable):c;! 结束集 数据。 g=1500 0 16 15; c=200 300 2 -1 4 0 0 5; 结束数据 min=dminus(2)+dplus(2);!第二个目标函数 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); ! 软约束表达式;! dminus(1)=0; !第一个目标结果 @for(variable:@gin(x)); ! 结束 此时,第二个目标的最优值为 0,偏差为 0: 第三目标 !求 dminus(2)=0,然后求解第三个目标。 模型。 设置。 变量/1..2/:x;!设置:变量/1..2/:x; ! s_con_num/1...4/:g,dplus,dminus;!软约束数量及相关参数; s_con(s_con_num(s_con_num));! s_con(s_con_num,variable):c;! 软约束系数; s_con(s_con_num,variable):c;! 结束集 数据。 g=1500 0 16 15; c=200 300 2 -1 4 0 0 5; 结束数据 min=3*dminus(3)+3*dplus(3)+dminus(4);!第三个目标函数。 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); ! 软约束表达式;! dminus(1)=0; !第一个目标约束条件; ! dminus(2)+dplus(2)=0; !第二个目标约束条件 @for(variable:@gin(x));! 结束 最终结果为 x1=2,x2=4,dplus(1)=100,最优利润为
-
0421-0423 张宇学习笔记 基础30讲 - 第4讲 单位函数的微分研究与计算
-
面向对象的java学习笔记--对象类的初体验 2024年最新华为面试题4l
-
NeurIPS 2022 | 最强斗地主AI!网易互娱AI Lab提出基于完美信息蒸馏的方法-完美信息蒸馏(PTIE) 在斗地主游戏中,非完美信息的引入主要是由于三位玩家均不能看到别人的手牌,对于任意一位玩家而言,仅可知道其余两位玩家当前手牌的并集,而难于精准判断每位玩家当前手牌。完美信息蒸馏的思路是针对这种非完美问题,构建一个第三方角色,该角色可以看到三位玩家的手牌,该角色在不告知每位玩家完美信息的情况下通过信息蒸馏的方式引导玩家打出当前情况下合理的出牌。 以强化学习常用的 Actor-Critic 算法为例,PTIE 在 Actor-Critic 算法的应用中可以利用 Critic 的 Value 输出作为蒸馏手段来提升 Actor 的表现。具体而言即在训练中 Critic 的输入为完美信息(包含所有玩家的手牌信息),Actor 的输入为非完美信息(仅包含自己手牌信息),此种情况下 Critic 给予的 Value 值包含了完美信息,可以更好地帮助 Actor 学习到更好的策略。 从更新公式上来看,正常的 Actor-Critic 算法 Actor 更新的方式如下: 在 PTIE 模式下,对于每个非完美信息状态 h,我们可以在 Critic 中构建对应的完美信息状态 D(h),并用 Critic 的输出来更新 Actor 的策略梯度,从而达到完美信息蒸馏的效果。 PTIE 框架的整体结构如下图所示: 无论是训练还是执行过程中智能体都不会直接使用完美信息,在训练中通过蒸馏将完美信息用于提升策略,从而帮助智能体达到一个更高的强度。 PTIE 的另一种蒸馏方式是将完美信息奖励引入到奖励值函数的训练中,PerfectDou 提出了基于阵营设计的完美信息奖励 node reward,以引导智能体学习到斗地主游戏中的合作策略,其定义如下: 如上所示,完美信息部分 代表 t 时刻地主手牌最少几步可以出完,在斗地主游戏中可以近似理解为是距游戏获胜的距离, 代表 t 时刻地主阵营和农民阵营距游戏获胜的距离之差, 为调节系数。通过此种奖励设计,在训练时既可以一定程度地引入各玩家的手牌信息(出完的步数需要知道具体手牌才能计算),同时也鼓励农民以阵营的角度做出决策,提升农民的合作性。 特征构建: PerfectDou 针对牌类游戏的特点主要构建了两部分特征:牌局状态特征和动作特征。其中牌局状态特征主要包括当前玩家手牌牌型特征、当前玩家打出的卡牌牌型特征、玩家角色、玩家手牌数目等常用特征,动作特征主要用于刻画当前状态下玩家的所有可能出牌,包括了每种出牌动作的牌型特征、动作的卡牌数目、是否为最大动作等特征。 牌型特征为 12 * 15 的矩阵,如下图所示: 该矩阵前 4 行代表对应每种卡牌的张数,5-12 行代表该种卡牌的种类和对应位置。 网络结构和动作空间设计 针对斗地主游戏出牌组合数较多的问题,PerfectDou 基于 RLCard 的工作上对动作空间进行了简化,对占比最大的两个出牌牌型:飞机带翅膀和四带二进行了动作压缩,将整体动作空间由 27472 种缩减到 621 种。 PerfectDou 策略网络结构如下图所示: 策略网络结构同样分为两部分:状态特征部分和动作特征部分。 在状态特征部分,LSTM 网络用于提取玩家的历史行为特征,当前牌局状态特征和提取后的行为特征会再通过多层的 MLP 网络输出当前的状态信息 embedding。 在动作特征部分,每个可行动作同样会经过多层 MLP 网络进行编码,编码后的动作特征会与其对应的状态信息 embedding 经过一层 MLP 网络计算两者间的相似度,并经由 softmax 函数输出对应的动作概率。 实验结果
-
osgEarth 学习笔记 4 - 第一个 OsgEarth QT 程序
-
【论文笔记】MetaPruning:用于自动神经网络通道剪枝的元学习-4 实验结果
-
iCloud 切换区域,中国区保留 appStore(更新)--自 2018 年 2 月 28 日起,中国区 iCloud 由云上贵州管理 苹果公司发布的公告 https://support.apple.com/zh-cn/HT208352 关键词 关键部分 受影响的 iCloud 账户:国家或地区设置为 "中国 "的 Apple ID。 iCloud 包含的服务照片、邮件、通讯录、日历、提醒事项、备忘、书签、钱包、钥匙串、云备份、云驱动器、应用程序数据 新条款和条件: 同意仅出于本协议允许的目的并在中国法律允许的范围内使用服务。 云桂洲在提供服务时应使用合理的技能并尽职尽责,但在适用法律允许的最大范围内,我们不保证或担保您通过本服务存储或访问的任何内容不会意外损坏、崩溃、丢失或根据本协议的条款被删除,如果发生此类损坏、崩溃、丢失或删除,我们不承担任何责任。您应自行负责维护您的信息和数据的适当备份。 Apple 和云上贵州有权访问您存储在服务中的所有数据,包括有权根据适用法律相互之间共享、交换和披露所有用户数据(包括内容)。 本协议的解释、效力和履行应适用*法律。对于因本协议引起的或与本协议有关的任何争议,云桂洲和您同意提交中国国际经济贸易仲裁委员会(CIETAC)根据提交仲裁时有效的法律在北京进行具有约束力的仲裁。 由云桂洲管理,用户选择: 停用; ID 到地区; 受 iCloud(由云桂洲运营)条款和条件约束 首先,我想说说我对数据安全的看法。 当我在朋友圈发布通知时,有些朋友回复说国外的操作并没有多安全,或者国外的安全只是相对于国外而言的等等。首先,我非常感谢这些朋友,这让我反思什么是数据安全。以下观点均属个人观点: 国外的月亮一定比国内圆? 这是一个根深蒂固的问题,只要有人说国外的东西比国内好,就会有人嘲笑崇洋媚外。我觉得我们在某些方面应该向国外学习,比如搜索引擎和版权问题。打开百度搜索 "数据安全",第一行肯定是广告。打开谷歌搜索 "数据安全",第一条就是 "数据安全_百度百科" .....各种版权问题大家都明白,支持正版,但不仅客户一心想找免费破解,就连作者也往往没有保护自己劳动成果或产品的想法。但从另一个层面来说,国内的发展和安全,甩国外几条街。没有说哪里好,哪里不好,辩证地去学习更好。 国外也有别有用心的数据泄露,谈何安全? 从加密解密的角度看,自古以来就没有绝对安全的加密,只有相对安全的做法。苹果的棱镜门、微软的 cpu 漏洞,各种参差不齐的被破解案例 ....是的,这的确是一个很好的论据,但凡事都不能只看一面,当年苹果面对FBI破解手机的要求,几经论证,苹果还是拒绝破解。这点拿到国内,只要上面的文件传达下去,还有企业敢说不吗?还敢说不吗? 关于这次iCloud数据迁移个人看法? 把数据迁移到贵州的云端,相当于把手机的所有数据都存储在贵州的云端服务器上。也许访问数据的速度会快很多,但我会把我的iCloud区放到美国,因为我不想数据存在云上贵州后经常接到莫名其妙的电话或短信,更不想因为乱用国外服务器而被请去喝茶。iCloud一个ID,即从中国账号转到美国区,主要用于数据存在美国服务器上。appStore一个ID,除了注册一个中国ID外,专门用来下载应用用,因为国外ID不支持酷狗和网易云等应用。麻烦的是,用了新的 appStore ID 后,当前的应用还得重新下载安装,因为旧的应用 ID 与新的应用 ID 不兼容,安装不了。最后,iCloud迁移后,国内用户使用美国服务器,估计要 "扶墙 "了。 专业步骤: 首先,进行appleID设置,这是前提条件,否则无法选择转移区域! 取消 appleID 的双重认证 取消家庭共享选项 二、窗口下载并安装 icloud 3.0 版
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。
-
还原法学习--示例 1:数组求和 const numbers = [1, 2, 3, 4]; const sum = numbers.reduce((accumulator, currentValue) => { return accumulator + currentValue; }, 0); const sum = numbers. }, 0); console.log(sum); // // currentValue; } }. console.log(sum); // 输出:10 在本例中,我们没有提供 initialValue,因此累加器的初始值是数组的第一个元素 1,而 currentValue 则从数组的第二个元素 2 开始。 例 2:扁平化二维数组
-
ElasticSearch 学习笔记 (4)--ES 集群的基本概念和构建流程及主要工作原理