/images/avatar.png

Papalqi

UE4 一些实践建议

Interfaces优先于Cast。通常,我们将Actor或组件强制转换为能够访问其方法所需的Class类型,但是强制转换不仅在性能方面比Interfaces昂贵,而且实现起来也很烦人。尝试一下Interfaces。 使用组件共享行为。很多时候我们过多地依赖继承,以便在参与者之间共享行为。继承不一定全是错误的,但是比如游戏有两种类型的施加伤害的Actor:炮塔和角色。在这种情况下,您可以创建一个名为Damager的组件,并将其添加到两个Actor中。两个Actor都能够施加伤害,而不必担心他们是谁继承的。 隐藏对象的不可自定义属性。当Actor或Components具有变量时,您可以将它们从“详细信息窗格”中隐藏。只需单击要隐藏的变量,然后查找它们公开的“Advanced Display”属性并进行检查。之后,调整该Actor或Component或任何其他对象时,您将不再在“详细信息”窗格中看到此变量。 自动对齐连线。您创建了一个很棒的蓝图,里面到处都是节点。但是由于连线,它看起来像一团糟。快速改善这种情况的一件事是选择两个连接的节点并按“ Q”。 按Q前: 按Q后: 避免将持久状态存储在组件(Component)中。这更多地与有存档的游戏有关。无论使用哪种插件,还是想出自己的保存方法/解决方案,持久存储组件的变量都可能成为负担,因为大多数时候您必须在加载游戏之前重新创建组件并重新添加保存的组件。相反,应该将持久化变量(如HP、Money等)存储在Actors中。 尽可能使用球体而不是“胶囊和Box”。您有99%的时间希望在Actor中使用碰撞,而不必将它们设为Capsule或者Box。请改用Sphere,因为球的物理计算最简单。 使用数学表达式来描述您的数学公式。你可以像在论文中描述的那样描述它们!只需右键单击“蓝图”的网格,然后键入“添加数学表达式” 然后单击显示的选项。然后,像在纸上一样写下公式,并连接点! 使用标签(Tags)!UE4为游戏中几乎每个对象都提供了一个被低估的内置功能,称为“Tags”。只需转到“对象详细信息/默认值”并搜索“标签”,就会显示一个数组。单击“加号”按钮并开始对其进行标记。这将很清楚的区分所有物体属性。当然,大型项目手动输入这些几乎是噩梦,小范围使用吧。 不要滥用Event Tick。我知道这是陈词滥调,但这是严肃的事情。Event Tick是大多数问题的懒惰解决方案。假设您想在角色跳跃时做点什么。与其在事件Tick中放置“ if”以检查变量“ Is Jumping”是否为真,不如在按下按钮进行跳跃时创建一个名为“ OnCharacterJumpStart”(或任何您喜欢的事件)的事件分派器。然后,在对象处对跳转做一些事情。 你可能需要SetTimerByEvent而不是Event Tick。Event Tick在CPU的每一帧上运行。如果你需要以大于0.01s的时间间隔运行某项内容,则最好使用SetTimerByEvent。 在Replicated 事件(或RPC)中传递Actor是可行的。因为没办法传递一个Actor指针到服务器,Actor通过NetUID在RPC中传输,只有4个字节。然后,使用NetPackageMap将NetUID转换为指针,然后将其传递给对象。整个Actor仅发送一次。Actor的各个属性通过该Actor的ActorChannel更新。但是其他的指针,你最好想清楚。 使用SetGlobalTimeDilation。你是否知道在玩游戏时死亡或杀死某物时一切都会慢动作如何做到的?好吧,这是您执行此操作的方法之一。 经常打包游戏。“我希望我早点知道”这件事。你在打包时可能会面临噩梦,这是构建时在开发时看不到的一大堆错误。您等待的打包时间越长,发生错误的机会就越大。因此,请经常打包,经常解决问题,并保持整洁和安全。 在蓝图里使用Ctrl + Shift + F查找所需内容。

UE4 主渲染函数

从今天起,我将从主渲染函数入手,来整理整个UE4的渲染内容和框架,这将是一个非常漫长和艰巨的任务,因为其内容实在是太多,虚幻的更新速度也是超乎寻常的快,但是以后的版本应该不会有大的调整,毕竟新的框架直接用在UE5就可以了。 这里我们只是笼统的将Render函数那一个层级所出现的内容进行概况和整理,每一个概念的内部原理将会在之后的该系列文章中进行讲解。 虚化中目前的渲染基类为FSceneRenderer,其一共有两个派生类,一个是FDeferredShadingSceneRenderer,另一个是FMobileSceneRenderer。当然我们就算是在编辑器里选择为前向渲染,其本身还是会走FDeferredShadingSceneRenderer,FMobileSceneRenderer确实是移动平台才会创建的类型。我们讲讨论feature更完备的FDeferredShadingSceneRenderer。 关于延迟渲染和前向渲染这种问题到底还需不需要讨论,如果有讨论的必要请在评论区留言,否则就默认大家都会的。因为实在是没办法照顾到所有人的学习阶段,是统一天坑还是我讲我的,前期很多概念没有达成共识的话,基本上很难理解剩下的内容。 在这里我将去掉与头发、光线追踪,虚拟纹理相关内容,因为他们比较凌乱,后面如果有可能会出专题。 看代码之前我们可以使用RenderDoc来抓帧unreal,只要安装了RenderDoc并且你启用了对应的插件。之后你就会看到对应的渲染列表。 这可以帮助你快速的对应代码,图形化的帮助你理解每一步的用处。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 //更新需要添加到scene和需要删除的物体。 Scene->UpdateAllPrimitiveSceneInfos(RHICmdList, true); //抗锯齿策略,分辨率大小比例,窗口大小,屏幕百分比策略 PrepareViewRectsForRendering(); //场景中是否存在天空大气的渲染需求,进行准备工作 PrepareSunLightProxy(*Scene->GetSkyAtmosphereSceneInfo(),LightIndex, *Scene->AtmosphereLights[LightIndex]); //如果存在多GPU,计算GPUMask ComputeViewGPUMasks(RenderTargetGPUMask); //将RT池中的rt设置为可写入 GRenderTargetPool.

100TipForUnreal

1.Paste Here(复制到这个位置) 我们打开编辑器的设置,然后可以设置这个快捷键,例如我们可以设置为左括号 之后我们在场景中复制的时候,就可以直接使用这个快捷键,将之前你Ctrl C的东西复制到你鼠标的位置。 2. 快速对齐——按住V键拖动物体顶点对齐 我们在拖动一个物体的时候,按住V键,可以显示它周围的物体的顶点并且在移动的时候吸附上去。场景摆放的时候利器!。 3. 鼠标中键移动物体中心 我们知道所有的物体中心是制作模型的时候决定的,但是我们在编辑器摆放物体的时候,希望能够边缘点对齐,我们就可以临时移动中心点。当然这个移动后中心点是临时的,不会保存。 4. 自定义项目类别 我们可以通过修改.uproject file的category来实现 5. 使用高级的文件检索方式 例如我们所有定点数小于1000的模型 6. 输入计算 7.选择log类型 8. 修改文件夹颜色 可以自定义颜色,明显的标记出自己常用的文件夹 9.修改缩略图 我们可以转动编辑器里面的缩略图,进行更改 10.Ctrl +鼠标中间+ 拖动 =快速切换视图 我们使用Ctrl +鼠标中间+ 拖动可以快速切换视图,拖动的方向决定你的视图模式。 11.测量距离 在平行投影的视图中使用鼠标中键可以测试距离,单位是厘米。 12.你可以打开4个Content 这样你就不用每次翻阅资源都跳转了,你需要提前锁住。 13.你可以打开4个Detail面板 14.你可以复制任意属性 15.你在编辑器复制的所有东西,其实都文本 所以我们是可以直接使用文本传递的。 推荐的网站https://blueprintue.com/,可以共享蓝图。 16. 你能够在color picker保存颜色 17.你能够任意拖动数组改变里面的位置 18.蓝图全搜索 使用CTRL + SHIFT + F 在蓝图编辑器中 19. 使用Ctrl 移动节点 20. 修改网络样式 1 2 3 r.Editor.NewLevelGrid 0 r.Editor.NewLevelGrid 1 r.Editor.NewLevelGrid 2 21.

UE4网络教程1-网络架构总揽

一.网络总览 Unreal Engine4使用标准的Server-Client体系结构。 这意味着服务器是权威的,所有数据必须首先从客户端发送到服务器。 然后服务器依赖你写的代码验证数据并且给予反馈。 1.1一个简单的例子 在多人匹配中,作为一个客户端,当你移动你的角色时,你并不是自己移动你的角色,而是告诉服务器你想移动它。 然后服务器为其他人(包括你)更新你的位置,。 注意:为了防止对本地客户端产生“滞后”的感觉,程序员经常让这个玩家直接在本地控制他们的角色,虽然服务器仍然可能在客户端开始作弊的时候覆盖角色的位置!这意味着,客户端将(几乎)永远不会直接与其他客户端“交谈”。 1.2其他的例子 当向另一个客户端发送聊天消息时,您实际上是将其发送到服务器,然后服务器将其传递给您想要到达的客户端。 也许你消息的结构方并不是一个人,也就是不只是一次私聊,对方有可能是是一个team,guild,group等。 永远不要相信客户! 信任客户端意味着在执行客户端操作之前不测试客户端操作。 这将允许作弊!不过有些情况下我们可能会允许一些纯粹表现的效果只在客户端进行而不在客户端验证。一个简单的例子是射击:在服务器上应当确保对某个客户端的测试,如果在服务器的记录中显示该客户端实际上有弹药,才应当允许该客户端射击,而不是直接在客户端处理射击! 二.UE4 的网络框架 我们如果拥有一个对象,使用前面关于UE4的Server-Client体系结构的信息,我们可以将框架分成4个部分: Server Only – 只在服务器上 Server & Clients – 同时存在客户端和服务器 Server & Owning Client – 只在服务器和拥有他的客户端上 Owning Client Only – 这些对象只存在于客户端上 “Owning Client”是一个所有权的问题,也就是这个对象的所有权是否是在你这一台客户端上,例如你控制的角色,这个对象对于你来说,归属权就是Owning Client。 所有权在以后的“RPC”中变得很重要。下图展示了一些常见的类以及它们存在的部分。这就是一些最重要的类是如何在网络框架中布局的。 下图显示了另一个例子(具有两个客户端的专用服务器),说明这些类的对象如何通过网络框架分发: 之后将展示一些最常见的类。 还将提供如何使用这些类的小示例。 如果不理解,请忽略,直到您阅读系列后面有关复制等章节的内容。 一些游戏类型可能会使用不同方式使用这些类。 下面的例子和解释不是唯一的方法 2.1 GameMode 4.14开始GameMode类被分成 GameModeBase和GameMode。 GameModeBase的功能较少,因为有些游戏可能不需要GameModeBase类的完整功能。 GameMode用于定义游戏的规则。 这包括如Apawn、Player Controller、APlayer State等。 它只在服务器上可用。 客户端没有这个对象,并且在试图检索它时只会得到一个nullptr。 GameMode例如死亡匹配,团队死亡匹配或捕获旗帜等模式。这意味着游戏模式可以定义如下内容:

UE4 大世界 场景工作流

一.使用工具 1.1使用 HLOD https://www.youtube.com/watch?v=WhcxGbKWdbI 由于HLOD是减少DrawCall的方案,所以其实他会对渲染性能的提高能够起到一定的帮助作用。因为它是将场景中互相独立的静态Mesh通过顶点和材质合并的方式聚合在一起,本来由于材质和顶点Buffer的不同而没有办法形成一个统一的Drawcall,现在可以迎刃而解。很显然那些被合并的顶点和索引buffer再也不能被复用了,而且pack到一起的纹理也是一样,它们都变成了场景中独一无二的资源,所以理论上讲HLOD是一种用空间来换取时间的方法。 所以HLOD是会增加内存使用的,如果是巨量的HLOD,不仅适得其反,会影响渲染性能的使用,cook的时候一个HLOD的文件大小是及其夸张的。压缩这些HLOD文件可能花费了数个小时的时间,它大大降低了研发迭代的效率。 将世界场景设置 中的 Enable Hierarchical LODSystem打开。 我们首先在windows 界面打开HLOD管理器 我们点击 Generate Cluster, 他会把所有level里面的空间位置临近的Mesh分组为一个Cluster。如果觉得分的不好的话是可以自己手动修改的。 然后我们点击加号增加HLOD的个数,例如我们增加两个一共三个LOD 确定好之后,点击Generate Proxy Meshs 将会分组的HLOD 数据。等待一段时间。 1.1.1HLOD调试 我们选择HLOD 的视图模式 我们由近到远就可以看到HLOD的变化。 1.1.2参数设置 距离每个cluster越近,使用的LOD的越数值越小,Mesh的数据越精确。每个LOD上面都有特定的参数。 参考: https://docs.unrealengine.com/zh-CN/BuildingWorlds/HLOD/Reference/index.html 1.2使用LOD和Merge Actor 1.2.1使用LOD 所以其实我们并不需要所有的物理都变为HLOD的,当然这个部分没有踩过坑是没有办法预知的,因此我们对于某些Mesh(待定)使用LOD应该就ok。我们的每个Mesh ,都需要设置LODs。 这里我们有了标准是可以使用脚本刷的。 相关调试 1 2 r.StaticMeshLODDistanceScale r.forceLOD 由于我们的LOD是可以使用简化材质的。 1.2.2使用Merge Actor 由于HLOD的内存问题,所以另一种方案是合并actor,因为他是生成一个新的Mesh和material,所以他并不会产生额外开销。 1.3使用 Virtual Texture 首先开启 virtual texture 然后,我们将所使用的贴图进行转换 也可以在纹理编辑器里进行转换 若未使用上述转换菜单选项,将立即导致引用转换纹理的所有现有材质失效。应打开引用违规纹理的所有材质,并将纹理取样节点设为使用正确 虚拟(Virtual) 采样器类型。例如,虚拟纹理应使用 虚拟颜色(Virtual Color) 而非 颜色(Color) 采样器类别 1.3.1调试 1 r.

UE4资源积累

PPT资源 https://www.slideshare.net/GerkeMaxPreussner?utm_campaign=profiletracking&utm_medium=sssite&utm_source=ssslideview https://www.slideshare.net/EpicGamesJapan https://www.slideshare.net/LearnUnreal https://www.slideshare.net/EpicGamesChina https://www.slideshare.net/unity3d 官方资源 https://ue4resources.com/ https://udn.unrealengine.com https://ue4community.wiki https://trello.com/b/TTAVI7Ny/ue4-roadmap https://unrealengine.jp 三方资源 UE4U.xyz https://www.unrealengine.com/zh-CN/resources https://romeroblueprints.blogspot.com/ https://www.tomlooman.com/ https://unreal-engine-4.zeef.com/tom.looman https://epicgames.ent.box.com/s/29ziwm7c64qqgyxbwsvgdvunow21zfkb

UE4物理动画参数

首先我们打开物理资产: 影响物理动画的是两个,一个是Profile里面物理动画的配置,还有一个是本身Body 上面的配置 一. Body的设置 Mass ,默认是根据你Body上的体积自动计算的,我们可以更改。最终影响的是惯性 LinearDamping:线性阻尼。控制Body的线性速度减缓强度。值越大,速度减小越快。 AngularDamping:角速度阻尼。控制Body的角速度减缓强度。值越大,速度减小越快。 (以上两个数值,若启用PhysicalAnimationProfile,一般不再设置这两个数值,Profile的值也影响该效果) Enable Gravity:是否启用重力。关闭后不受重力影响,只受Body的惯性影响。 CollisionReponse:是否和外部物体碰撞。需要和外部物体碰撞时打开,如在人群中穿行和碰墙壁 二. Limit的设置 原则上是根据人体骨骼活动范围设置limit,并且所有动作都应在limit中运动。为了方便,可把所有limit设为free,通过Physical Animation Profile来约束,Profile无法满足的,再去设置个别骨骼的limit,如Spine。 三. Physical Animation Profile 打开Profile 选择一个已经有的prfile,这个名字对应的配置是可以在蓝图里指定的。 选择完成后,就可以看不同的刚体对应的物理参数 Is Local Simulation:是在世界空间还是在局部空间,判断移动Kinematic时是全局还是相对父Body的。目前从代码来看我们用世界空间的比较好。 Orientation Strength:用于更正方向误差的力。值越大,越靠近动画的角度 Angular Velocity Strength:用于更正角速度误差的力。值越大,速度稳定(向动画靠近)的越快。 Position Strength:用于更正线性位置误差的力。仅可用于非局部模拟。值越大,越靠近动画的位置。 Velocaty Strength:用于更正线性速度的力。仅可用于非局部模拟。值越大,速度稳定(向动画靠近)的越快。 Max Linear Force:用于更正线性误差的最大力。(设为0) Max Angular Force:用于更正角度误差的最大力。(设为0) 四.Constraint Profile 功能:局部控制。关节驱动身体靠近动画,靠近动画的姿势,而不影响Body的属性。如果靠PhysicalAnimationProfile驱动,会导致Body过于僵硬无法移动,ConstraintProfile解决了这一个问题,但运动时需要PhysicalAnimationProfile去稳定Body的位置(全局的)。 原理:设置Constraint的Motor,setDrive驱动关联的两个Body到达动画的相对Rotation。 SkeletalMeshComponent需要设置Update Joints From Animation为true. Angular Drive Mode需要设置为Twist and Swing,Motor才会生效。 Target Orientation: 不必设置,Update Joints From Animation会取动画来设置该Orientation。