construct14游戏里的模拟大卡车运货小游戏游戏怎么拐弯

中国卡车模拟游戏怎么玩吗_百度知道
中国卡车模拟游戏怎么玩吗
我有更好的答案
我回答过跟你类似的问题请你看看:/question/
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&figure&&img src=&https://pic2.zhimg.com/v2-55b71ff91dcadb522fd9aa9_b.jpg& data-rawwidth=&620& data-rawheight=&329& class=&origin_image zh-lightbox-thumb& width=&620& data-original=&https://pic2.zhimg.com/v2-55b71ff91dcadb522fd9aa9_r.jpg&&&/figure&&b&Unreal4&/b& 在国内资料还不是很多。列举一些资料供大家查阅学习。&p&&b&Epic &/b&官方有一个完全中文的文档:&/p&&br&&a href=&http://link.zhihu.com/?target=https%3A//docs.unrealengine.com/latest/CHN/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unreal4 官方中文文档&/a&&br&&br&
基本大多数都是看文档摸索。 &br&&br&&b&Unreal 中国&/b&的官网:&br&&br&&a href=&http://link.zhihu.com/?target=http%3A//unrealchina.com/portal.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&虚幻中国官网&/a&&p&&b&三巫社区:&/b&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.sanwu.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&三巫社区.首页&/a&&/p&&p&&b&泰斗 Unreal4 技术专区&/b&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.taidous.com/forum.php%3Fgid%3D279& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unreal4技术专区-【泰斗社区】&/a&&br&&/p&&p&&br&&b&国内推荐三个视频教学网站,泰课在线,AboutCG,三巫教育。 &/b&&br&&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=http%3A//www.taikr.com/course/explore/unreal4%3Ffilter%255Btype%255D%3Dall%26filter%255Bprice%255D%3Dall%26filter%255BcurrentLevelId%255D%3Dall%26orderBy%3Dlatest& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unreal4 - 泰课在线&/a&&br&&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//www.aboutcg.org/course-cat/bysoftware/unreal-engine-4/%3Fhmsr%3D%25E4%25B8%25BB%25E7%25AB%2599%26hmmd%3D%25E5%259B%25BE%26hmpl%3Dbanner%26hmkw%3DUE4%26hmci%3D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unreal Engine 4教程&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//sanwu.ke.qq.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unreal4 - 三巫教育&/a&&br&&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//edu.manew.com/course/explore/UE4%3Ffilter%255Btype%255D%3Dall%26filter%255Bprice%255D%3Dall%26filter%255BcurrentLevelId%255D%3Dall%26orderBy%3Dlatest& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unreal课程 - 蛮牛教育 - 国内最大的Unity在线学习平台&/a&&br&&/li&&/ul&&br&&b&
推荐一些资源:&/b&&br&&ul&&li&&a href=&http://link.zhihu.com/?target=http%3A//goldlion.blog.51cto.com/3372& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&虚幻4免费视频教学资源汇总&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//yun.baidu.com/share/home%3Fuk%3D%26view%3Dalbum%26errno%3D0%26errmsg%3DAuth%2520Login%2520Sucess%26stoken%3D4ba701e31e4385245ffcbc4d8ebd6ad86a011b4472f68aacc2a545ebf703cebe%26bduss%3D1d7ceec46dd0a1ac3c3d69cab6bab468b25f53a76bef3d79be73cbe0ed97b5204854ffb0cfab136ca5dea3ad650eea7f36da4b9e44a8e304a71fcb8acccea1eda2150eda9dea1c907853bab3c7bcfd741a724bd1cdc50f14be1b6ec0f594fdf4caeafc4f725c90ccdc7aff0ca57ff58aa24201bfd946145fdd921b4615adb36c%26ssnerror%3D0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unreal4 百度云网盘资料&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//github.com/GeekLiB/Lee-VR-Source& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VR开发资源汇总&/a&&/li&&/ul&&br&&b&
推荐一些研究 Unreal4 的工程师技术博客:&/b&&ul&&li&&a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/neil3d& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&燕良@VR&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//www.cnblogs.com/miloyip& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Milo的游戏开发&/a&&br&&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//goldlion.blog.51cto.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&做游戏的老G - 51CTO技术博客&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//www.cnblogs.com/ghl_carmack/p/5677090.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&UE4入门与精通&/a&&br&&/li&&li&&a href=&https://zhuanlan.zhihu.com/insideue4& class=&internal&&深入UE4剖析源码,浅出GameEngine设计理念&/a&&br&&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/pizi0475& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&3D编程&/a&&br&&/li&&/ul&&p&&b&推荐一些文章:&/b&&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=http%3A//goldlion.blog.51cto.com/4395& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&学习虚幻4需要储备的知识(程序入门向)&/a&&br&&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//www.cnblogs.com/ghl_carmack/archive//1955922.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何学好3D游戏引擎编程&/a&&br&&/li&&/ul&&p&&b&国外的视频教程(请自备翻墙工具):&/b&&/p&&ul&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DSgxZNhe8DT4%26index%3D2%26list%3DPLSPw4ASQYyynKPY0I-QFHK0iJTjnvNUys& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++/Game&/a&&br&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DPZiUtNaz9l0%26index%3D1%26list%3DPL6DtIuaTM4jujP__Sx9UocjJGVzO8emsA& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Beginner C++ with Unreal Engine 4&/a&&br&&/li&&/ul&&br&&p&&b&推荐书籍:&/b&&/p&&ul&&li&《C++ Primer》&br&&/li&&li&《3D游戏与计算机图形学》 &/li&&li&《OpenGL 超级宝典》&/li&&li&《游戏引擎架构》&/li&&/ul&&p&&b&更新《Windows游戏编程之从零开始》中推荐的书籍:&/b&&/p&&p&&b&DirectX 入门&/b&&/p&&ul&&li& 红龙书第一版和第二版 《DirectX 9.0 3D游戏开发编程基础》&/li&&li&《DirectX 游戏开发终极指南》&/li&&/ul&&p&&b&地形方面&/b&&/p&&ul&&li&《Focus On 3D Terrain Programing》&br&&/li&&li&《Real Time 3D Terrain Engines Using C++ And DX9》&br&&/li&&li&《Level of Detail for 3D Graphics》&/li&&/ul&&p&&b&物理&/b&&/p&&ul&&li&《Game Physics》&br&&/li&&li&《游戏开发物理学(Physics for Game Developers)》&br&&/li&&li&《Game Physics Engine Development》&br&&/li&&li&《实时碰撞检测算法(Real-time Collision Detection)》&/li&&/ul&&p&&b&数学 &/b&&/p&&ul&&li&《3D游戏与计算机图形学中的数学方法》&/li&&/ul&&p&&b&引擎设计方面&/b&&/p&&ul&&li&《Game Engine Architecture》&br&&/li&&li&《3D Game Engine Programing》&br&&/li&&li&《Pro OGER 3D Programing》&br&&/li&&li&《3D Game Engine Design》&br&&/li&&li&《3D Game Engine Architecture : Engineering Real-Time Applications with WildMagic》&/li&&/ul&&p&&b&实时渲染方面&/b&&/p&&ul&&li&《Real-Time Rendering》&/li&&/ul&&p&&b&图形学方向&/b&&/p&&ul&&li&《3D 计算机图形学》&br&&/li&&li&《3D Graphics for Game Programing》&br&&/li&&li&《计算机图形学几何工具算法详解》&br&&/li&&li&《3D 数学基础:图形与游戏开发(3D Math Primer for Graphics and Game Development)》&br&&/li&&li&《Mathematics for 3D Game Programing & ComputerGraphics》&/li&&/ul&&p&&b&AI 方面&/b&&/p&&ul&&li&《游戏人工智能编程案例精粹》&br&&/li&&li&《游戏开发中的人工智能》&br&&/li&&li&《AI 游戏引擎程序设计》&/li&&/ul&&p&&b&网络方面&/b&&/p&&ul&&li&《网络游戏服务器端编程》&br&&/li&&li&《网络游戏客户端编程》&br&&/li&&li&《网络游戏开发》&br&&/li&&li&《网络游戏编程教程》&/li&&/ul&&p&&b&系列书籍方面&/b&&/p&&ul&&li&《游戏编程精粹》系列&br&&/li&&li&《GPU精粹》系列&br&&/li&&li&《ShaderX》系列&br&&/li&&li&《Game Engine Gems》 系列&br&&/li&&li&《AI Programming Wisdom》 系列&/li&&/ul&&p&&b&策划方面&/b&&/p&&ul&&li&《Creating Emotion in Games : The Craft and Art of Emotioneering》&br&&/li&&li&《Uitimate Game Design : Building Game Worlds》&/li&&/ul&&p&&b&美工方面&/b&&/p&&ul&&li&《The Animator's Survival Kit》&br&&/li&&li&《The Dark Side of Game Texturing》&/li&&/ul&&p&&b&其他&/b&&/p&&ul&&li&《大话设计模式》&br&&/li&&li&《重构:改善既有代码的设计》&br&&/li&&li&《代码大全》&br&&/li&&li&《Effective C++》&br&&/li&&li&《C++沉思录》&br&&/li&&li&《程序员修炼之道》&br&&/li&&li&《编程之美:微软技术面试心得》&br&&/li&&li&《设计模式:可复用面向对象软件的基础》&br&&/li&&/ul&&br&&br&&p&只是在学习过程中发现的资源,持续更新,欢迎在评论区继续补充。&/p&
Unreal4 在国内资料还不是很多。列举一些资料供大家查阅学习。Epic 官方有一个完全中文的文档:
基本大多数都是看文档摸索。 Unreal 中国的官网: 三巫社区:泰斗 Unreal4 技术专区
&figure&&img src=&https://pic4.zhimg.com/v2-849a76a8f0c0b95e5d0a601f7b7bb6b8_b.jpg& data-rawwidth=&392& data-rawheight=&184& class=&content_image& width=&392&&&/figure&&p&Keywords:UE4、UMG、C++、Widget、Demo、Example、示例、实例、例子、UI&/p&&p&两年前写过一篇C++操控UMG蓝图的文章,当时写的有点乱,非核心的东西写了不少,干扰阅读(当时自己刚学UE4,完全懵逼)。另外最新版本中,UMG不需要在Build.cs中添加配置,默认即可。&br&这里用4.18版本重新做一个C++控制UMG的精简实例,完整工程下载见文章底部。&/p&&p&&br&&/p&&p&假设新建的测试工程叫:UMGTest。实现一个简单的功能:点击按钮,动态替换掉按钮上的背景图片。&/p&&p&UMG使用步骤如下:&/p&&h2&&b&1,创建自定义的UMG C++类。&/b&&/h2&&p&在UE4编辑器中点击:File -》 New C++ Class。&/p&&figure&&img src=&http://pic2.zhimg.com/v2-9fd38c9cbabad4f176e765_b.jpg& data-caption=&& data-rawwidth=&218& data-rawheight=&418& class=&content_image& width=&218&&&/figure&&p&弹出的对话框中,勾选Show All Classes,并找到UserWidget,选中后再点击Next。表示选择UserWidget作为我们创建的C++ class的父类。&/p&&figure&&img src=&http://pic3.zhimg.com/v2-e9ed26be07c62c9e95361f6_b.jpg& data-caption=&& data-rawwidth=&943& data-rawheight=&569& class=&origin_image zh-lightbox-thumb& width=&943& data-original=&http://pic3.zhimg.com/v2-e9ed26be07c62c9e95361f6_r.jpg&&&/figure&&p&起好名字(这里命名为:MyUserWidget),点击创建&/p&&figure&&img src=&http://pic1.zhimg.com/v2-19fd6ba23fe873f6829efd1a4f370674_b.jpg& data-caption=&& data-rawwidth=&925& data-rawheight=&563& class=&origin_image zh-lightbox-thumb& width=&925& data-original=&http://pic1.zhimg.com/v2-19fd6ba23fe873f6829efd1a4f370674_r.jpg&&&/figure&&h2&&b&2,创建UMG蓝图&/b&&/h2&&p&在内容浏览器中,右键点击:User Interface -》 Widget Blueprint。&/p&&figure&&img src=&http://pic2.zhimg.com/v2-9a3dfa38fc863c9e8b71fd_b.jpg& data-caption=&& data-rawwidth=&409& data-rawheight=&282& class=&content_image& width=&409&&&/figure&&p&修改蓝图名称并保存。这里命名为:NewWidgetBlueprint。&/p&&figure&&img src=&http://pic3.zhimg.com/v2-18af6bb2f4ef8a995b2be2_b.jpg& data-caption=&& data-rawwidth=&378& data-rawheight=&247& class=&content_image& width=&378&&&/figure&&p&然后双击打开UMG蓝图,拖拽一个Button组件到编辑视图中。假设给这个Button命名为:BtnChangeImg。&/p&&figure&&img src=&http://pic3.zhimg.com/v2-9fa784f14fe2ebcd7f54afde_b.jpg& data-caption=&& data-rawwidth=&491& data-rawheight=&475& class=&origin_image zh-lightbox-thumb& width=&491& data-original=&http://pic3.zhimg.com/v2-9fa784f14fe2ebcd7f54afde_r.jpg&&&/figure&&p&并设置按钮的大小,这里设置为和图片素材一样的大小&/p&&figure&&img src=&http://pic3.zhimg.com/v2-c3cddb590cf8fe79d99acfe_b.jpg& data-caption=&& data-rawwidth=&318& data-rawheight=&289& class=&content_image& width=&318&&&/figure&&p&再拖拽一个Image组件到这个Button内&/p&&figure&&img src=&http://pic3.zhimg.com/v2-b986ced6ca2_b.jpg& data-caption=&& data-rawwidth=&400& data-rawheight=&353& class=&content_image& width=&400&&&/figure&&p&并设置Image组件的大小&/p&&figure&&img src=&http://pic4.zhimg.com/v2-ce71b7a9d3ff_b.jpg& data-caption=&& data-rawwidth=&342& data-rawheight=&267& class=&content_image& width=&342&&&/figure&&figure&&img src=&http://pic2.zhimg.com/v2-7ae866af102e9c895e81fe01bed2f411_b.jpg& data-caption=&& data-rawwidth=&453& data-rawheight=&220& class=&origin_image zh-lightbox-thumb& width=&453& data-original=&http://pic2.zhimg.com/v2-7ae866af102e9c895e81fe01bed2f411_r.jpg&&&/figure&&p&然后切换到Graph视图&/p&&figure&&img src=&http://pic4.zhimg.com/v2-898a42ca2b5d61c3bc9f5f3_b.jpg& data-caption=&& data-rawwidth=&378& data-rawheight=&204& class=&content_image& width=&378&&&/figure&&p&然后再点击Class Settings&/p&&figure&&img src=&http://pic4.zhimg.com/v2-39b16d2ccbd21cb0dcfb_b.jpg& data-caption=&& data-rawwidth=&492& data-rawheight=&217& class=&origin_image zh-lightbox-thumb& width=&492& data-original=&http://pic4.zhimg.com/v2-39b16d2ccbd21cb0dcfb_r.jpg&&&/figure&&p&再找到Parent Class,设置为之前创建的C++类:MyUserWidget。&/p&&figure&&img src=&http://pic2.zhimg.com/v2-c1db87998c7ece5f4abb13dd_b.jpg& data-caption=&& data-rawwidth=&400& data-rawheight=&258& class=&content_image& width=&400&&&/figure&&h2&&b&3,添加图片资源&/b&&/h2&&p&我这里使用两张PNG图片,导入UE4即可。&/p&&figure&&img src=&http://pic1.zhimg.com/v2-fcabbb604ed67e812158_b.jpg& data-caption=&& data-rawwidth=&420& data-rawheight=&224& class=&content_image& width=&420&&&/figure&&h2&&b&4,编写自定义UserWidget的C++代码&/b&&/h2&&p&添加需要的头文件,比如我们在头文件中使用了UImage,那么需要指明这个UImage所在的头文件。例如:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&#include &Components/Image.h&
&/code&&/pre&&/div&&p&具体代码如下:&/p&&p&&b&UMGTestGameModeBase.h&/b&&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&c1&&// Fill out your copyright notice in the Description page of Project Settings.&/span&
&span class=&cp&&#pragma once&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&CoreMinimal.h&&/span&&span class=&cp&&&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&GameFramework/GameModeBase.h&&/span&&span class=&cp&&&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&UMGTestGameModeBase.generated.h&&/span&&span class=&cp&&&/span&
&span class=&cm&&/**&/span&
&span class=&cm&& * &/span&
&span class=&cm&& */&/span&
&span class=&n&&UCLASS&/span&&span class=&p&&()&/span&
&span class=&k&&class&/span& &span class=&nc&&UMGTEST_API&/span& &span class=&nl&&AUMGTestGameModeBase&/span& &span class=&p&&:&/span& &span class=&k&&public&/span& &span class=&n&&AGameModeBase&/span&
&span class=&p&&{&/span&
&span class=&n&&GENERATED_BODY&/span&&span class=&p&&()&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&n&&AUMGTestGameModeBase&/span&&span class=&p&&();&/span&
&span class=&k&&protected&/span&&span class=&o&&:&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&BeginPlay&/span&&span class=&p&&()&/span& &span class=&k&&override&/span&&span class=&p&&;&/span&
&span class=&k&&private&/span&&span class=&o&&:&/span&
&span class=&c1&&//UMG蓝图的实例对象,用于显示在游戏的Viewport中UUserWidget* MyWidgetI&/span&
&span class=&p&&};&/span&
&/code&&/pre&&/div&&p&&b&UMGTestGameModeBase.cpp&/b&&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&c1&&// Fill out your copyright notice in the Description page of Project Settings.&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&UMGTestGameModeBase.h&&/span&&span class=&cp&&&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&Blueprint/UserWidget.h&&/span&&span class=&cp&&&/span&
&span class=&n&&AUMGTestGameModeBase&/span&&span class=&o&&::&/span&&span class=&n&&AUMGTestGameModeBase&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&n&&MyWidgetInstance&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&kt&&void&/span& &span class=&n&&AUMGTestGameModeBase&/span&&span class=&o&&::&/span&&span class=&n&&BeginPlay&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&c1&&//检测Widget对象是否存在,如果存在则移除掉。&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&MyWidgetInstance&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&MyWidgetInstance&/span&&span class=&o&&-&&/span&&span class=&n&&RemoveFromViewport&/span&&span class=&p&&();&/span&
&span class=&n&&MyWidgetInstance&/span& &span class=&o&&=&/span& &span class=&k&&nullptr&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&c1&&//加载自定义UMG的class,通过这个class创建Widget对象,并显示在界面中。&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&UClass&/span&&span class=&o&&*&/span& &span class=&n&&MyWidgetClass&/span& &span class=&o&&=&/span& &span class=&n&&LoadClass&/span&&span class=&o&&&&/span&&span class=&n&&UUserWidget&/span&&span class=&o&&&&/span&&span class=&p&&(&/span&&span class=&nb&&NULL&/span&&span class=&p&&,&/span& &span class=&n&&TEXT&/span&&span class=&p&&(&/span&&span class=&s&&&WidgetBlueprint'/Game/NewWidgetBlueprint.NewWidgetBlueprint_C'&&/span&&span class=&p&&)))&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&APlayerController&/span&&span class=&o&&*&/span& &span class=&n&&PC&/span& &span class=&o&&=&/span& &span class=&n&&GetWorld&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&GetFirstPlayerController&/span&&span class=&p&&())&/span&
&span class=&p&&{&/span&
&span class=&n&&MyWidgetInstance&/span& &span class=&o&&=&/span& &span class=&n&&CreateWidget&/span&&span class=&o&&&&/span&&span class=&n&&UUserWidget&/span&&span class=&o&&&&/span&&span class=&p&&(&/span&&span class=&n&&PC&/span&&span class=&p&&,&/span& &span class=&n&&MyWidgetClass&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&MyWidgetInstance&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&MyWidgetInstance&/span&&span class=&o&&-&&/span&&span class=&n&&AddToViewport&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&&b&MyUserWidget.h&/b&&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&c1&&// Fill out your copyright notice in the Description page of Project Settings.&/span&
&span class=&cp&&#pragma once&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&CoreMinimal.h&&/span&&span class=&cp&&&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&Blueprint/UserWidget.h&&/span&&span class=&cp&&&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&Components/Image.h&&/span&&span class=&cp&&&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&MyUserWidget.generated.h&&/span&&span class=&cp&&&/span&
&span class=&cm&&/**&/span&
&span class=&cm&& * &/span&
&span class=&cm&& */&/span&
&span class=&n&&UCLASS&/span&&span class=&p&&()&/span&
&span class=&k&&class&/span& &span class=&nc&&UMGTEST_API&/span& &span class=&nl&&UMyUserWidget&/span& &span class=&p&&:&/span& &span class=&k&&public&/span& &span class=&n&&UUserWidget&/span&
&span class=&p&&{&/span&
&span class=&n&&GENERATED_BODY&/span&&span class=&p&&()&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&n&&UMyUserWidget&/span&&span class=&p&&(&/span&&span class=&k&&const&/span& &span class=&n&&FObjectInitializer&/span&&span class=&o&&&&/span& &span class=&n&&ObjectInitializer&/span&&span class=&p&&);&/span&
&span class=&k&&protected&/span&&span class=&o&&:&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&NativeConstruct&/span&&span class=&p&&()&/span& &span class=&k&&override&/span&&span class=&p&&;&/span&
&span class=&n&&UFUNCTION&/span&&span class=&p&&()&/span&
&span class=&kt&&void&/span& &span class=&n&&OnBtnChangeImgClick&/span&&span class=&p&&();&/span&
&span class=&k&&private&/span&&span class=&o&&:&/span&
&span class=&c1&&//英雄头像的显示图片&/span&
&span class=&n&&UImage&/span&&span class=&o&&*&/span& &span class=&n&&HeroIcon&/span&&span class=&p&&;&/span&
&span class=&c1&&//两张图片素材&/span&
&span class=&n&&UTexture2D&/span&&span class=&o&&*&/span& &span class=&n&&TexHero1&/span&&span class=&p&&;&/span&
&span class=&n&&UTexture2D&/span&&span class=&o&&*&/span& &span class=&n&&TexHero2&/span&&span class=&p&&;&/span&
&span class=&c1&&//显示状态标识&/span&
&span class=&kt&&int&/span& &span class=&n&&ImgFlag&/span&&span class=&p&&;&/span&
&span class=&p&&};&/span&
&/code&&/pre&&/div&&p&&b&MyUserWidget.cpp&/b&&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&c1&&// Fill out your copyright notice in the Description page of Project Settings.&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&MyUserWidget.h&&/span&&span class=&cp&&&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&Components/Button.h&&/span&&span class=&cp&&&/span&
&span class=&cp&&#include&/span& &span class=&cpf&&&Engine/Texture2D.h&&/span&&span class=&cp&&&/span&
&span class=&n&&UMyUserWidget&/span&&span class=&o&&::&/span&&span class=&n&&UMyUserWidget&/span&&span class=&p&&(&/span&&span class=&k&&const&/span& &span class=&n&&FObjectInitializer&/span&&span class=&o&&&&/span& &span class=&n&&ObjectInitializer&/span&&span class=&p&&)&/span& &span class=&o&&:&/span& &span class=&n&&Super&/span&&span class=&p&&(&/span&&span class=&n&&ObjectInitializer&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&HeroIcon&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&;&/span&
&span class=&n&&TexHero1&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&;&/span&
&span class=&n&&TexHero2&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&;&/span&
&span class=&n&&ImgFlag&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&kt&&void&/span& &span class=&n&&UMyUserWidget&/span&&span class=&o&&::&/span&&span class=&n&&NativeConstruct&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&n&&Super&/span&&span class=&o&&::&/span&&span class=&n&&NativeConstruct&/span&&span class=&p&&();&/span&
&span class=&c1&&//根据组件ID查找Image组件&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&UImage&/span&&span class=&o&&*&/span& &span class=&n&&img&/span& &span class=&o&&=&/span& &span class=&n&&Cast&/span&&span class=&o&&&&/span&&span class=&n&&UImage&/span&&span class=&o&&&&/span&&span class=&p&&(&/span&&span class=&n&&GetWidgetFromName&/span&&span class=&p&&(&/span&&span class=&n&&FName&/span&&span class=&p&&(&/span&&span class=&n&&TEXT&/span&&span class=&p&&(&/span&&span class=&s&&&ImgHero&&/span&&span class=&p&&)))))&/span&
&span class=&p&&{&/span&
&span class=&n&&HeroIcon&/span& &span class=&o&&=&/span& &span class=&n&&img&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&c1&&//根据组件ID查找Button组件,并为其添加Click回调事件&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&UButton&/span&&span class=&o&&*&/span& &span class=&n&&btn&/span& &span class=&o&&=&/span& &span class=&n&&Cast&/span&&span class=&o&&&&/span&&span class=&n&&UButton&/span&&span class=&o&&&&/span&&span class=&p&&(&/span&&span class=&n&&GetWidgetFromName&/span&&span class=&p&&(&/span&&span class=&s&&&BtnChangeImg&&/span&&span class=&p&&)))&/span&
&span class=&p&&{&/span&
&span class=&n&&FScriptDelegate&/span& &span class=&n&&Del&/span&&span class=&p&&;&/span&
&span class=&n&&Del&/span&&span class=&p&&.&/span&&span class=&n&&BindUFunction&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&,&/span& &span class=&s&&&OnBtnChangeImgClick&&/span&&span class=&p&&);&/span&
&span class=&n&&btn&/span&&span class=&o&&-&&/span&&span class=&n&&OnClicked&/span&&span class=&p&&.&/span&&span class=&n&&Add&/span&&span class=&p&&(&/span&&span class=&n&&Del&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&c1&&//加载图片资源&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&TexHero1&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&c1&&//如果已经加载过,则先销毁掉&/span&
&span class=&n&&TexHero1&/span&&span class=&o&&-&&/span&&span class=&n&&ConditionalBeginDestroy&/span&&span class=&p&&();&/span&
&span class=&n&&TexHero1&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&;&/span&
&span class=&n&&GetWorld&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&ForceGarbageCollection&/span&&span class=&p&&(&/span&&span class=&nb&&true&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&n&&TexHero1&/span& &span class=&o&&=&/span& &span class=&n&&LoadObject&/span&&span class=&o&&&&/span&&span class=&n&&UTexture2D&/span&&span class=&o&&&&/span&&span class=&p&&(&/span&&span class=&nb&&NULL&/span&&span class=&p&&,&/span& &span class=&n&&TEXT&/span&&span class=&p&&(&/span&&span class=&s&&&Texture2D'/Game/pic_01.pic_01'&&/span&&span class=&p&&));&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&TexHero2&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&TexHero2&/span&&span class=&o&&-&&/span&&span class=&n&&ConditionalBeginDestroy&/span&&span class=&p&&();&/span&
&span class=&n&&TexHero2&/span& &span class=&o&&=&/span& &span class=&nb&&NULL&/span&&span class=&p&&;&/span&
&span class=&n&&GetWorld&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&ForceGarbageCollection&/span&&span class=&p&&(&/span&&span class=&nb&&true&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&n&&TexHero2&/span& &span class=&o&&=&/span& &span class=&n&&LoadObject&/span&&span class=&o&&&&/span&&span class=&n&&UTexture2D&/span&&span class=&o&&&&/span&&span class=&p&&(&/span&&span class=&nb&&NULL&/span&&span class=&p&&,&/span& &span class=&n&&TEXT&/span&&span class=&p&&(&/span&&span class=&s&&&Texture2D'/Game/pic_02.pic_02'&&/span&&span class=&p&&));&/span&
&span class=&p&&}&/span&
&span class=&kt&&void&/span& &span class=&n&&UMyUserWidget&/span&&span class=&o&&::&/span&&span class=&n&&OnBtnChangeImgClick&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&c1&&//切换显示图片&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&HeroIcon&/span& &span class=&o&&&&&/span& &span class=&n&&TexHero1&/span& &span class=&o&&&&&/span& &span class=&n&&TexHero2&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&HeroIcon&/span&&span class=&o&&-&&/span&&span class=&n&&SetBrushFromTexture&/span&&span class=&p&&(&/span&&span class=&n&&ImgFlag&/span& &span class=&o&&?&/span& &span class=&nl&&TexHero1&/span& &span class=&p&&:&/span& &span class=&n&&TexHero2&/span&&span class=&p&&);&/span&
&span class=&n&&ImgFlag&/span& &span class=&o&&=&/span& &span class=&n&&ImgFlag&/span& &span class=&o&&==&/span& &span class=&mi&&0&/span& &span class=&o&&?&/span& &span class=&mi&&1&/span& &span class=&o&&:&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&&b&最终效果&/b&&/p&&p&按Shift+F1切换到光标显示模式,然后点击按钮,就可以切换图片。&/p&&figure&&img src=&http://pic1.zhimg.com/v2-35cd76085affcedd5a65bbc_b.jpg& data-caption=&& data-rawwidth=&381& data-rawheight=&488& class=&content_image& width=&381&&&/figure&&figure&&img src=&http://pic4.zhimg.com/v2-31d7d461d82ad821dfcb80b_b.jpg& data-caption=&& data-rawwidth=&364& data-rawheight=&492& class=&content_image& width=&364&&&/figure&&p&完整工程下载地址:&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//pan.baidu.com/s/1i5em6TR& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&pan.baidu.com/s/1i5em6T&/span&&span class=&invisible&&R&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&/p&
Keywords:UE4、UMG、C++、Widget、Demo、Example、示例、实例、例子、UI两年前写过一篇C++操控UMG蓝图的文章,当时写的有点乱,非核心的东西写了不少,干扰阅读(当时自己刚学UE4,完全懵逼)。另外最新版本中,UMG不需要在Build.cs中添加配置,默认即可。…
&figure&&img src=&https://pic3.zhimg.com/v2-f857ca85cbfd_b.jpg& data-rawwidth=&704& data-rawheight=&234& class=&origin_image zh-lightbox-thumb& width=&704& data-original=&https://pic3.zhimg.com/v2-f857ca85cbfd_r.jpg&&&/figure&&p&Keyword: UE4、Animation Blueprin、Montage Slot、Character Blueprint&br&&/p&&p&不知从从哪个版本开始,动画蓝图的制作和老版本之间的差距有点大了,这里做下笔记,以备不时之需。。
&/p&&p&UE4版本:4.16
&/p&&p&假设已经将模型和动作导入工程了,这里使用官方模板项目的动作作为例子讲解,只演示待机、跑步的控制逻辑,跳跃的可以看项目模板的动画蓝图。&/p&&p&1,准备好动作和模型&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-fdcf8edd18cde3_b.jpg& data-rawwidth=&651& data-rawheight=&250& class=&origin_image zh-lightbox-thumb& width=&651& data-original=&http://pic4.zhimg.com/v2-fdcf8edd18cde3_r.jpg&&&/figure&&p&2,新建一个一个Blend Space 1D&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-de6d4fb6f9fceea9c0ad4cd2943bf07b_b.jpg& data-rawwidth=&585& data-rawheight=&350& class=&origin_image zh-lightbox-thumb& width=&585& data-original=&http://pic4.zhimg.com/v2-de6d4fb6f9fceea9c0ad4cd2943bf07b_r.jpg&&&/figure&&p&然后在跳出的菜单钟选择骨骼&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-7f7fcfe95b5d52c5782156addce22d48_b.jpg& data-rawwidth=&510& data-rawheight=&175& class=&origin_image zh-lightbox-thumb& width=&510& data-original=&http://pic1.zhimg.com/v2-7f7fcfe95b5d52c5782156addce22d48_r.jpg&&&/figure&&p&3,打开Blend Space 1D钟,分别将待机、行走、跑步三个动作拖拽到下方面板钟&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-19f025e53af3bb511de41c65f1c30bc8_b.jpg& data-rawwidth=&655& data-rawheight=&320& class=&origin_image zh-lightbox-thumb& width=&655& data-original=&http://pic1.zhimg.com/v2-19f025e53af3bb511de41c65f1c30bc8_r.jpg&&&/figure&&p&修改驱动属性名为Speed,默认为None,这个属性名为是后面编辑动画蓝图使用的属性名。&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-c95cfad3_b.jpg& data-rawwidth=&500& data-rawheight=&211& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&http://pic4.zhimg.com/v2-c95cfad3_r.jpg&&&/figure&&p&最终效果:&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-ef16b45aa12bd837e9beaa23ffeaa7b3_b.jpg& data-rawwidth=&525& data-rawheight=&189& class=&origin_image zh-lightbox-thumb& width=&525& data-original=&http://pic4.zhimg.com/v2-ef16b45aa12bd837e9beaa23ffeaa7b3_r.jpg&&&/figure&&p&4,将`TargetWeightInterpolationSpeedPerSec`修改为5.0,修改这个值的原因是为了让角色移动时的静止和移动的过度更加自然&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-c12ddaeb74_b.jpg& data-rawwidth=&497& data-rawheight=&90& class=&origin_image zh-lightbox-thumb& width=&497& data-original=&http://pic1.zhimg.com/v2-c12ddaeb74_r.jpg&&&/figure&&p&5,新建一个动画蓝图(Animation Blueprin):&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-56f8dc94f_b.jpg& data-rawwidth=&501& data-rawheight=&365& class=&origin_image zh-lightbox-thumb& width=&501& data-original=&http://pic2.zhimg.com/v2-56f8dc94f_r.jpg&&&/figure&&p&在弹出的菜单钟选择父类和骨骼,父类为:AnimInstance;骨骼就是当前模型的骨骼&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-c940da7fed755f56f485f0727fbb3407_b.jpg& data-rawwidth=&410& data-rawheight=&734& class=&content_image& width=&410&&&/figure&&p&6,打开动画蓝图的EventGraph面板&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-f404f5dfde5b228a1d7f0df_b.jpg& data-rawwidth=&394& data-rawheight=&154& class=&content_image& width=&394&&&/figure&&p&然后再添加一个float属性,名字为Speed,表示角色的即时速度&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-ac2f584d05a3f5a7fe112f59d516fe42_b.jpg& data-rawwidth=&345& data-rawheight=&308& class=&content_image& width=&345&&&/figure&&figure&&img src=&http://pic2.zhimg.com/v2-35c35d802714bbde379d5fdc5e7bebc1_b.jpg& data-rawwidth=&372& data-rawheight=&395& class=&content_image& width=&372&&&/figure&&p&然后再编辑事件:Event Blueprint Update Animation&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-528d4fd6d4577171cab217c65f39039c_b.jpg& data-rawwidth=&838& data-rawheight=&287& class=&origin_image zh-lightbox-thumb& width=&838& data-original=&http://pic1.zhimg.com/v2-528d4fd6d4577171cab217c65f39039c_r.jpg&&&/figure&&p&7,打开AnimGraph面板&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-82adf310cca714fedaf0f4a4eb2ef2b8_b.jpg& data-rawwidth=&309& data-rawheight=&195& class=&content_image& width=&309&&&/figure&&p&新建一个State Machine&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-f6605639edbf0e762c8f064_b.jpg& data-rawwidth=&410& data-rawheight=&318& class=&content_image& width=&410&&&/figure&&figure&&img src=&http://pic1.zhimg.com/v2-20debf932d3f9d0cbef0d60_b.jpg& data-rawwidth=&268& data-rawheight=&169& class=&content_image& width=&268&&&/figure&&p&双击State Machine,进入里面编辑。从Entry节点钟拖拽并新建一个State:&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-fd2e1aa0be0a1cddac56bff_b.jpg& data-rawwidth=&658& data-rawheight=&330& class=&origin_image zh-lightbox-thumb& width=&658& data-original=&http://pic4.zhimg.com/v2-fd2e1aa0be0a1cddac56bff_r.jpg&&&/figure&&p&将该State命名为Idel/Run&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-d517f76f234c010a31d8a_b.jpg& data-rawwidth=&500& data-rawheight=&207& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&http://pic3.zhimg.com/v2-d517f76f234c010a31d8a_r.jpg&&&/figure&&p&然后双击该State,进入里面编辑:其中Speed,就是之前新建float属性&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-fb98b_b.jpg& data-rawwidth=&510& data-rawheight=&291& class=&origin_image zh-lightbox-thumb& width=&510& data-original=&http://pic2.zhimg.com/v2-fb98b_r.jpg&&&/figure&&figure&&img src=&http://pic4.zhimg.com/v2-44c5c88d6ae47b113768afda16149a97_b.jpg& data-rawwidth=&658& data-rawheight=&259& class=&origin_image zh-lightbox-thumb& width=&658& data-original=&http://pic4.zhimg.com/v2-44c5c88d6ae47b113768afda16149a97_r.jpg&&&/figure&&p&最后再返回到最外层的AnimGraph面板,将StateMachine链接到Final Animation Pose上&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-9a966abafa0c_b.jpg& data-rawwidth=&577& data-rawheight=&328& class=&origin_image zh-lightbox-thumb& width=&577& data-original=&http://pic1.zhimg.com/v2-9a966abafa0c_r.jpg&&&/figure&&p&8,新建角色蓝图Character Blueprint:&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-12bfbea7d1e_b.jpg& data-rawwidth=&526& data-rawheight=&349& class=&origin_image zh-lightbox-thumb& width=&526& data-original=&http://pic3.zhimg.com/v2-12bfbea7d1e_r.jpg&&&/figure&&p&父类选择工程中的C++ Character class:&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-60e3aa44e731a364a384b65a_b.jpg& data-rawwidth=&544& data-rawheight=&743& class=&origin_image zh-lightbox-thumb& width=&544& data-original=&http://pic2.zhimg.com/v2-60e3aa44e731a364a384b65a_r.jpg&&&/figure&&p&然后打开角色蓝图,选中mesh&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-0d44ece37b7ff08932ea_b.jpg& data-rawwidth=&355& data-rawheight=&362& class=&content_image& width=&355&&&/figure&&p&将Anim Class指定为之前创建的动画蓝图:&br&&/p&&figure&&img src=&http://pic2.zhimg.com/v2-fd8b5c33d9b48e627782ffde_b.jpg& data-rawwidth=&575& data-rawheight=&307& class=&origin_image zh-lightbox-thumb& width=&575& data-original=&http://pic2.zhimg.com/v2-fd8b5c33d9b48e627782ffde_r.jpg&&&/figure&&p&将Skeletal Mesh指定为模型的骨骼:&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-6e1367dfd0f56e86e973f33d_b.jpg& data-rawwidth=&504& data-rawheight=&375& class=&origin_image zh-lightbox-thumb& width=&504& data-original=&http://pic4.zhimg.com/v2-6e1367dfd0f56e86e973f33d_r.jpg&&&/figure&&p&如果默认的骨骼基准坐标、转向和刚体大小、MovementComponent的默认方向不匹配,则需要编辑下Mesh的Transform&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-f266b0d3ffc607ba4ed4be_b.jpg& data-rawwidth=&352& data-rawheight=&397& class=&content_image& width=&352&&&/figure&&figure&&img src=&http://pic4.zhimg.com/v2-dfa72d6e390eab46571b_b.jpg& data-rawwidth=&752& data-rawheight=&395& class=&origin_image zh-lightbox-thumb& width=&752& data-original=&http://pic4.zhimg.com/v2-dfa72d6e390eab46571b_r.jpg&&&/figure&&p&9,到此,动画蓝图和角色蓝天编辑完成,可以在C++中使用刚刚新建的角色蓝图。&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ATopDownTestGameMode::ATopDownTestGameMode()
// use our custom PlayerController class
PlayerControllerClass = ATopDownTestPlayerController::StaticClass();
// set default pawn class to our Blueprinted character
static ConstructorHelpers::FClassFinder&APawn& PlayerPawnBPClass(TEXT(&/Game/TopDownCPP/Blueprints/NewBlueprint&));
if (PlayerPawnBPClass.Class != NULL)
DefaultPawnClass = PlayerPawnBPClass.C
&/code&&/pre&&/div&&p&&br&&/p&&h2&&b&补充:播放Montage的Slot问题&/b&&/h2&&p&播放montage动画时,可能遇到播放动画没有反应的问题,例如,用C++的方式播放:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&float ACharacter::PlayAnimMontage(class UAnimMontage* AnimMontage, float InPlayRate, FName StartSectionName)
&/code&&/pre&&/div&&p&&b&原因:
&/b& &/p&&p&可能时没有指定Montage的Slot。&/p&&p&&b&解决办法:
&/b&&/p&&p&1,打开Montage动画,看下默认的Slot名字叫什么&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-8c5bd0fdc09be9e75ec5313_b.jpg& data-rawwidth=&607& data-rawheight=&146& class=&origin_image zh-lightbox-thumb& width=&607& data-original=&http://pic4.zhimg.com/v2-8c5bd0fdc09be9e75ec5313_r.jpg&&&/figure&&p&2,然后在动画蓝图钟的AnimGraph中,拉出一个Slot节点&br&&/p&&figure&&img src=&http://pic4.zhimg.com/v2-9200a15ede5a0fb9f76b_b.jpg& data-rawwidth=&614& data-rawheight=&211& class=&origin_image zh-lightbox-thumb& width=&614& data-original=&http://pic4.zhimg.com/v2-9200a15ede5a0fb9f76b_r.jpg&&&/figure&&p&然后在从该Slot中连接到Final Animation Pose中:&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-488ed9bfccab4_b.jpg& data-rawwidth=&704& data-rawheight=&234& class=&origin_image zh-lightbox-thumb& width=&704& data-original=&http://pic1.zhimg.com/v2-488ed9bfccab4_r.jpg&&&/figure&&p&如果想修改该Slot节点的Slot名字,可以在属性面变钟修改:&br&&/p&&figure&&img src=&http://pic1.zhimg.com/v2-54b595ebf393d6affac746d0b76f4314_b.jpg& data-rawwidth=&573& data-rawheight=&266& class=&origin_image zh-lightbox-thumb& width=&573& data-original=&http://pic1.zhimg.com/v2-54b595ebf393d6affac746d0b76f4314_r.jpg&&&/figure&&p&如何在C++代码中指定Montage的Slot名字,还没研究过。但是可以通过AnimSequence动态创建一个Montage对象,并指定Slot名字:&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&USkeletalMeshComponent *Mesh = MyActor-&FindComponentByClass&USkeletalMeshComponent&();
UAnimInstance *AnimInst = Mesh-&GetAnimInstance();
if (AnimInst)
UAnimMontage* Mtg = AnimInst-&PlaySlotAnimationAsDynamicMontage(MyAnimSequence, TEXT(&MySlotName&), 0.1f, 0.1f, 1.0f, 30.0f);
&/code&&/pre&&/div&
Keyword: UE4、Animation Blueprin、Montage Slot、Character Blueprint 不知从从哪个版本开始,动画蓝图的制作和老版本之间的差距有点大了,这里做下笔记,以备不时之需。。 UE4版本:4.16 假设已经将模型和动作导入工程了,这里使用官方模板项目的动作作…
&figure&&img src=&https://pic2.zhimg.com/v2-f7cebdf7a32f785f5603_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic2.zhimg.com/v2-f7cebdf7a32f785f5603_r.jpg&&&/figure&&p&&b&祝祖国母亲生日快乐。&/b&&/p&&p&&b&也各位读者节日快乐。&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&上一次文章提到了体积数据的渲染方式和Tri-Planar的免UV着色技巧,根据目标,余将在国庆期间分享完全基于蓝图和材质,由NS方程驱动的流体模拟的方式与技巧。本期文章需要用到之前的体数据(其实也可以不用,不过最好是把之前提到的内容都实现了较好,如果实现不了,可以对文章进行降维(即鄙人将介绍三维形式的解算方案,各位可以简单地修改为二维的形式,实际上,难度也会降低一个等级)&/p&&p&为了使每一期的文章都有东西可以实现,我决定每一篇文章都把理论上的内容与可实现的内容结合。实际上,写下这类文章确实很累,如果仅仅只是介绍理论知识,大可把论文翻译为可阅读的中文即可,出于最开始的目的是为了使所有虚幻的用户能体验一下蓝图能达到的极限,能理解蓝图可以怎么样使用到极致,鄙人才打算写下这一系列文章。&/p&&p&鄙人无欲无求,不求因文章而富贵,也不求闻达于各位知乎的大神(毕竟文章确是多有纰漏),只求各位用户与学者,在看过我分享的经验之后能有所得,文章受点赞已是最大的荣幸。&/p&&blockquote&耳有人议鄙人之文非本人之作,鄙人实则痛心疾首。全系列文章没有抄袭外文一个字符,皆本人笔墨(从余蹩脚的语文水平足以看出),为此我也误会了一些读者的好意,实在抱歉。望各位不计前嫌,Haters能洗心革面,不要揪着场景是否熟悉、内容是否抄袭不放(最后重申一次我没有抄袭,没有代笔),共同交流技术,分享经验,共同学习,共同进步。&/blockquote&&p&鄙人亦自知自己废话之多,对于技术之外的事,各位权当看故事,以技术和思想为重就好。&/p&&p&&br&&/p&&p&&b&回顾一下文章目录:&/b&&/p&&p&一.&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&【UnrealEngine4】距离场的使用技巧与应用&/a&&/p&&p&二.材质中的伪体素&/p&&p&
1.&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&【UnrealEngine4】材质系统中的伪三维纹理&/a&&/p&&p&
2.&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&【UnrealEngine4】体渲染和Tri-Planar Mapping&/a&&/p&&p&三.在虚幻四中基於NS方程的流體模擬&/p&&p&
1.蓝图与材质的数据传输与伪ComputePipeline(本文)&/p&&p&
2.NS方程的解析和实际模拟&/p&&p&&br&&/p&&p&四.metaball 的原理与在材质中的实现&/p&&p&五.在虚幻四中 path tracing&/p&&p&
1.相机内参、简单物体变换信息的处理&/p&&p&
2.path tracing的解析,temporal的思路&/p&&p&
3.在材质中进行path tracing&/p&&p&六、透明物体的渲染/造假技巧&/p&&p&以后根据实际情况做稍微的改动。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&为什么本期文章还用之前的场景做封面:我没有其他好看的图了。&/b&&/p&&p&本一期文章将为后面的重头戏作铺垫,介绍一下用蓝图怎么和材质进行数据交换,怎么模拟虚幻没有暴露的Compute的Pipeline.因为现在是假期,因此理论性较强的部分会在后期再提到。鄙人的文章仍然会注重思路,至于严谨性的问题,也欢迎各位提出(是需要详细、通俗解析,还是需要更学术的解析)。思想思路是很重要的,且甚于算法。&/p&&p&&b&下面是正文的正文。&/b&&/p&&p&&br&&/p&&p&&b&一.用RenderTarget进行数据传输&/b&&/p&&p&&b&二.伪Compute Pipeline&/b&&/p&&p&&b&三.Ping Pong&/b&&/p&&p&&br&&/p&&p&&b&一.用RenderTarget进行数据传输&/b&&/p&&p&首先先看看这个metaball。(就是本人上传的了)&/p&&p&&figure&&img data-rawheight=&310& src=&https://pic2.zhimg.com/v2-202af6ffb66cf05eedde395fce13029f_b.jpg& data-rawwidth=&232& class=&content_image& width=&232&&&/figure&&/p&用纯蓝图和材质实现metaball的用户并不多&br&&p&(如果要说有的话,虚幻官方实现了一个类似的。但是他的溶球数目是不可调的,而且是硬编码的,不能任意数目球融合(我研读了一下他的介绍视频,推测得出的结论))&/p&&p&用c++实现的基于体素的Metaball也曾见到过,不过仅用蓝图和材质才是本文的目的。&/p&&p&要实现接下来文章要讲的所有东西,都基于本文的技巧。&/p&&p&&b&关键问题经梳理可以得到:&/b&&/p&&blockquote&1.蓝图里有 &img src=&https://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&& 个溶球的数据(位置、大小、溶度(就是控制溶球软硬程度的,我编的一个名词)&br&2.材质里需要这 &img src=&https://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&& 个球的数据,对他们构成的隐式表面进行RayMarch&br&3.利用光照模型进行渲染&/blockquote&&p&&br&&/p&&p&&b&1.&/b&中是很容易实现的。在蓝图里面事实上只是一个结构体的数组(或者多个数组)&/p&&p&而&b&2.&/b&,对于虚幻一般的材质流程,是无法实现的。虚幻的材质中提供了一个个Parameter来传输数据,这相当于单个变量。但是根据需求&b&1.&/b&,需要把“数组”传输至材质。&/p&&p&如果是在Vulkan里面,我比较喜欢把数据包装成VertexBuffer的数据,读取起来比较方便。事实上,类比一般编程可以得到,所需要的其实是一个可以被材质读取的“数据池”。整理到这里,已经比较清晰了。在材质中能胜任数据池角色的特性,非Texture莫属了。&/p&&p&一张贴图,类似一个数据池,而数据就分布在每个像素里面。暂且不管数据分布如何,再整理一下借助贴图蓝图到材质数据传输的思路:&/p&&blockquote&1.for each
&img src=&https://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&& 个球,得到当前球的数据&br&2.将数据写入一个Texture
&img src=&https://www.zhihu.com/equation?tex=T& alt=&T& eeimg=&1&&&br&3.材质里读取 &img src=&https://www.zhihu.com/equation?tex=T& alt=&T& eeimg=&1&& ,还原 &img src=&https://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&& 个球的数据&/blockquote&&p&&br&&/p&&p&现在只需要把&b&2.&/b&实现,就完成了整个需求。根据上一节讲到的体素数据注入的方法,同样的可以应用到这里来。但是为了灵活,这一次需要用到这个函数&/p&&figure&&img data-rawheight=&660& src=&https://pic1.zhimg.com/v2-f521d5a903e942cd5ad2_b.jpg& data-rawwidth=&1369& class=&origin_image zh-lightbox-thumb& width=&1369& data-original=&https://pic1.zhimg.com/v2-f521d5a903e942cd5ad2_r.jpg&&&/figure&&p&(这是连串操作,具体使用方法比较简单,不作赘述)这个函数会将材质 &img src=&https://www.zhihu.com/equation?tex=M_%7B0%7D& alt=&M_{0}& eeimg=&1&& 根据参数绘制到 &img src=&https://www.zhihu.com/equation?tex=T& alt=&T& eeimg=&1&& 的指定位置上。而 &img src=&https://www.zhihu.com/equation?tex=M_%7B0%7D& alt=&M_{0}& eeimg=&1&& ,通常可以是很简单的一个材质,只需要有一个Parameter控制当前绘制颜色,输出至自发光即可:&/p&&figure&&img data-rawheight=&351& src=&https://pic3.zhimg.com/v2-52c14fbd5ca_b.jpg& data-rawwidth=&723& class=&origin_image zh-lightbox-thumb& width=&723& data-original=&https://pic3.zhimg.com/v2-52c14fbd5ca_r.jpg&&&/figure&&p&(事实上。。自发光只能输出三通道的数据。因此这里要注意的是,只有范围为 &img src=&https://www.zhihu.com/equation?tex=%5B0%2C1%5D%5E%7B3%7D& alt=&[0,1]^{3}& eeimg=&1&& 的数据可以被写入到RT中)&/p&&p&&b&整理一下:&/b&&/p&&blockquote&1.for each
&img src=&https://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&& 个球,得到当前球的数据&br&2.设置 &img src=&https://www.zhihu.com/equation?tex=M_%7B0%7D& alt=&M_{0}& eeimg=&1&&&br&3.绘制数据至 &img src=&https://www.zhihu.com/equation?tex=T& alt=&T& eeimg=&1&&&br&4.材质里读取 &img src=&https://www.zhihu.com/equation?tex=T& alt=&T& eeimg=&1&& ,还原 &img src=&https://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&& 个球的数据&/blockquote&&p&&br&&/p&&p&事实上,和之前讲的类似,数据排布方式完全可以自定义的。需要注意的是,材质中输出到RT的数据只有RGB三通道,A将会被丢弃。且输出类型为unorm,即0-1的数据(精度由RT决定,上面也提到了一下,重要的事情说两遍),因此鄙人在此提供两种数据存储结构的思路:&/p&&p&1.多张贴图方案(类似多个数组,每个数组类型不同)&/p&&p&储存结构是这样的:&/p&&figure&&img data-rawheight=&419& src=&https://pic4.zhimg.com/v2-648d1cb1ef7eaf6ff7c8dc2ec76cd93b_b.jpg& data-rawwidth=&651& class=&origin_image zh-lightbox-thumb& width=&651& data-original=&https://pic4.zhimg.com/v2-648d1cb1ef7eaf6ff7c8dc2ec76cd93b_r.jpg&&&/figure&&p&还是拿溶球举例,相同色调示意同一个球中的不同数据。&/p&&p&2.单贴图,结构硬编码的方案(相当于结构体数组)&/p&&figure&&img data-rawheight=&603& src=&https://pic4.zhimg.com/v2-47c2d69e_b.jpg& data-rawwidth=&583& class=&origin_image zh-lightbox-thumb& width=&583& data-original=&https://pic4.zhimg.com/v2-47c2d69e_r.jpg&&&/figure&&p&相同色调示意同一个球中的不同数据。细线与粗线共同划分像素(例如图中实际分辨率为4*4,但是只能储存2*2个溶球的数据)&/p&&p&两种方法各有利有弊。&/p&&p&&br&&/p&&p&然后就可以把一系列数据从蓝图传输到材质了。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&二.伪Compute Pipeline&/b&&/p&&p&之所以提到这个,是因为后面流体模拟的文章需要用到这个。首先需要知道Compute Shader的用途,这里鄙人不作赘述。光靠蓝图和材质,在虚幻中是无法使用通用计算这一功能的。但是如果您有看鄙人之前的文章,就可以知道是有办法可以模拟的。&/p&&p&首先,为什么需要通用计算。举个例子,如果是绘制一张2D的贴图,在Vulkan里大可用Vertex&Fragment直接输出结果。如果是绘制一张3D的贴图,Compute Shader就可以方便绘制更新,而且涉及复杂运算(比如解线性方程),且有并行策略,Compute Shader是很有优势的。&/p&&p&啊,再举个例子,比如我有一万个粒子,如果我仅用cpu去计算他们的物理,是很愚蠢的,尽管运算速度快,但是却是单线程(通常情况下,不要较真)运算,而且结果还要重新Copy到特定Region 才能供GPU使用。如果一开始分配一个数据空间,直接在Compute Shader里运算,那么完成的数据不仅可以继续在下一阶段使用,而且能占据大量数据吞吐量的优势。&/p&&p&&br&&/p&&p&拿glsl(Spv)举例,Compute Shader通常包括&/p&&blockquote&1.一个 &img src=&https://www.zhihu.com/equation?tex=I%3DIx%2AIy%2AIz& alt=&I=Ix*Iy*Iz& eeimg=&1&& 的线程数。&br&2.ImageLoad,ImageStore两个常用函数&br&3.当前线程序号 &img src=&https://www.zhihu.com/equation?tex=xyz& alt=&xyz& eeimg=&1&&&/blockquote&&p&&br&&/p&&p&&b&类比材质和蓝图可用的功能,给出该管线和着色器的替代方案:&/b&&/p&&p&1.利用一中的函数创建一个分辨率乘积(总像素数)为 &img src=&https://www.zhihu.com/equation?tex=I& alt=&I& eeimg=&1&& 的RT,调用材质。这样就能在材质里有一个 &img src=&https://www.zhihu.com/equation?tex=I& alt=&I& eeimg=&1&& 的循环。&/p&&p&2.ImageLoad~采样贴图。而需要注意的是,Store只能输出到一张贴图,且只有三通道,且没有RW(read write)这种操作。而且采样贴图带硬件加速的插值,可以通过前面文章提到的修改为不插值模式。&/p&&p&3.材质中可获取TextureCoordination,通过简单变换可得到线程序号。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&举个例子。&/b&&/p&&p&Metaball的位置更新。数据量不多,通常几十个小球。如果使用蓝图,帧数会骤减(可以尝试)如果按照上面说的办法,可以得到:&/p&&br&&br&&br&&br&&a class=&video-box& href=&https://link.zhihu.com/?target=https%3A//www.zhihu.com/video/544704& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic4.zhimg.com/80/v2-125a5ed594cb_b.jpg& data-lens-id=&544704&&
&img class=&thumbnail& src=&https://pic4.zhimg.com/80/v2-125a5ed594cb_b.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/544704&/span&
&br&&br&&br&&br&&br&&br&&br&&br&&p&实时在材质中进行位置运算而更新的位置数据。&/p&&p&当然,后面也会经常用到这种办法。包括前一次文章提到的体素数据的注入方式,实际上也与此类似。之所以加上一个“伪”字,是因为这种非标准的做法,的确是一种伪物。不过本系列的文章就是以这种技巧为目的而分享交流经验而存在的。&/p&&p&&br&&/p&&p&&br&&/p&&p&简单运用:&/p&&figure&&img data-rawheight=&802& src=&https://pic2.zhimg.com/v2-e36c6ef03baa_b.jpg& data-rawwidth=&1238& class=&origin_image zh-lightbox-thumb& width=&1238& data-original=&https://pic2.zhimg.com/v2-e36c6ef03baa_r.jpg&&&/figure&&p&既可以用蓝图传输N个点光源的数据,也可以用材质来更新计算点光源的数据,最后在材质中读取,对Unlit的材质进行着色。这是非硬编码的,无论是光源数目还是任意一个光源的参数都是在运行中可以调整的。(溶球同理,不过鉴于鄙人之前没有解析解析怎么渲染隐式表面,本文就先用最简单的形式代替)&/p&&p&本次文章留一个作业:&/p&&p&1.用蓝图随机生成一些位置(光源),用&b&蓝图&/b&传递数据给材质,对unlit的材质进行正确着色,要求光源数目可改动,任意光源参数可调。&/p&&p&2.用蓝图随机生成一些位置(光源),用&b&蓝图&/b&传递数据给材质,用&b&伪ComputePipeline&/b&对光源位置进行更新,对unlit的材质进行正确着色,要求光源数目可改动,任意光源参数可调,且光源位置每帧能够正确更新。&/p&&p&大概花费5分钟即可完成。这也是后面文章一定会用到的方法,如果跳过了,后面的内容可能会无法实现。。。&/p&&p&效果大概如下&/p&&br&&br&&br&&br&&a class=&video-box& href=&https://link.zhihu.com/?target=https%3A//www.zhihu.com/video/371968& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic2.zhimg.com/80/v2-98a382935caf558495befef_b.jpg& data-lens-id=&371968&&
&img class=&thumbnail& src=&https://pic2.zhimg.com/80/v2-98a382935caf558495befef_b.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/371968&/span&
&br&&br&&br&&br&&br&&br&&br&&br&&p&&b&三.Ping Pong&/b&&br&此PingPong不是国球乒乓。。而是一种常用来实现两个buffer的数据交替存取的算法。&/p&&p&在后面解线性方程的时候会常用到这个算法。在这里先讲一下。&/p&&p&基本需求:由贴图A和一系列参数,经过多次迭代运算得到结果&/p&&p&考虑到虚幻中材质不支持RW的Texture,这里需要用PingPong的算法来解决这一类问题。&/p&&p&&br&&/p&&p&&b&设每一次迭代运算函数为F,结果为R&/b&&/p&&blockquote&1.准备A,B两张贴图,一个标记(Bool),初始为A,其中A贴图为原始数据,B贴图为空&br&2.标记为A:B=F(A)&br&
标记为B:A=F(B)&br&3.重复步骤&b&2.&/b& 若干次,&br&标记为A:R=F(A)&br&标记为B:R=F(B)&br&4.输出结果R&/blockquote&&p&&br&&/p&&p&这样交替在AB之间储存当时迭代的结果,省空间的同时,也满足了需求。具体在后期NS方程解算器中解线性方程的时候会用到。&/p&&p&另外需要在材质中建立一个拷贝函数:&/p&&figure&&img data-rawheight=&496& src=&https://pic4.zhimg.com/v2-f1a96f8c51f7face5bfb81c_b.jpg& data-rawwidth=&387& class=&content_image& width=&387&&&/figure&&p&用作贴图之间的拷贝或者覆盖。&/p&&figure&&img data-rawheight=&492& src=&https://pic1.zhimg.com/v2-229f93b5ddb1d4c1dfb78_b.jpg& data-rawwidth=&1545& class=&origin_image zh-lightbox-thumb& width=&1545& data-original=&https://pic1.zhimg.com/v2-229f93b5ddb1d4c1dfb78_r.jpg&&&/figure&&p&&br&&/p&&p&实现PingPong的蓝图比较繁杂,这里就不上图片了。用一个Select(选择)就可以根据标记选择Src(源)和Dst(目标)。下一篇文章有机会会尽量详细介绍。&/p&&p&&br&&/p&&p&下一讲的画风大概如下:&/p&&figure&&img data-rawheight=&456& src=&https://pic1.zhimg.com/v2-335efb655105affd94efc621ae9f6dc5_b.jpg& data-rawwidth=&1309& class=&origin_image zh-lightbox-thumb& width=&1309& data-original=&https://pic1.zhimg.com/v2-335efb655105affd94efc621ae9f6dc5_r.jpg&&&/figure&&p&每个函数拆开大概长这样:&/p&&figure&&img data-rawheight=&804& src=&https://pic4.zhimg.com/v2-0f53ebfcb9f562d464eab22b058a48a8_b.jpg& data-rawwidth=&1229& class=&origin_image zh-lightbox-thumb& width=&1229& data-original=&https://pic4.zhimg.com/v2-0f53ebfcb9f562d464eab22b058a48a8_r.jpg&&&/figure&&p&还没有包括一系列为了Compute的材质。总而言之,技巧上的东西鄙人在这一讲已经完全解析完毕。合理使用,一定可以达到很好的效果。下一讲,将解析流体模拟的内容。作业记得完成哦(大雾)&/p&&p&&br&&/p&&p&照例放一些有趣的图片和视频:&/p&&figure&&img data-rawheight=&534& src=&https://pic1.zhimg.com/v2-1c9e59bd9f185d0857a72_b.jpg& data-rawwidth=&921& class=&origin_image zh-lightbox-thumb& width=&921& data-original=&https://pic1.zhimg.com/v2-1c9e59bd9f185d0857a72_r.jpg&&&/figure&&figure&&img data-rawheight=&528& src=&https://pic3.zhimg.com/v2-45be5d09563a6ebfce44_b.jpg& data-rawwidth=&800& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic3.zhimg.com/v2-45be5d09563a6ebfce44_r.jpg&&&/figure&&figure&&img data-rawheight=&622& src=&https://pic2.zhimg.com/v2-09ece8f8c_b.jpg& data-rawwidth=&1059& class=&origin_image zh-lightbox-thumb& width=&1059& data-original=&https://pic2.zhimg.com/v2-09ece8f8c_r.jpg&&&/figure&&p&一个之前写的纯蓝图&材质的体素化。用来做物理正确的次表面散射十分有效。&/p&&figure&&img data-rawheight=&708& src=&https://pic3.zhimg.com/v2-4428dca89e4dfeccd480d0_b.jpg& data-rawwidth=&795& class=&origin_image zh-lightbox-thumb& width=&795& data-original=&https://pic3.zhimg.com/v2-4428dca89e4dfeccd480d0_r.jpg&&&/figure&&figure&&img data-rawheight=&517& src=&https://pic3.zhimg.com/v2-7c79fd85abcab0b170588c_b.jpg& data-rawwidth=&647& class=&origin_image zh-lightbox-thumb& width=&647& data-original=&https://pic3.zhimg.com/v2-7c79fd85abcab0b170588c_r.jpg&&&/figure&&p&一些Trick拼凑而成的透明的次表面散射材质。。拿来做泳圈感觉不错。&/p&&p&&br&&/p&&p&好,本期的文章到此结束了,感谢阅读。&/p&&p&&br&&/p&&p&鄙人不才,对很多东西理解尚不够透彻,对图形学也仅仅有一点点了解,文章仅仅为了分享经验交流心得,抛砖引玉,见笑大方了。如有纰漏,望斧正。&/p&&p&&br&&/p&&p&参考文献:&/p&&p&无&/p&
祝祖国母亲生日快乐。也各位读者节日快乐。 上一次文章提到了体积数据的渲染方式和Tri-Planar的免UV着色技巧,根据目标,余将在国庆期间分享完全基于蓝图和材质,由NS方程驱动的流体模拟的方式与技巧。本期文章需要用到之前的体数据(其实也可以不用,不过…
&figure&&img src=&https://pic3.zhimg.com/v2-875dfbbab39a85b794ef81_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/v2-875dfbbab39a85b794ef81_r.jpg&&&/figure&&p&原文作者:薛红杰&/p&&p&知乎地址:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&虚幻4制作动画的一点经验之谈&/a&&/p&&p&&br&&/p&&p&使用虚幻4制作动画片这是我在2007年第一次接触虚幻3的时候完全没有想到的,而在现在的2017年已经有使用虚幻4制作完成的商业动画播出已经说明这件事在可行性上没有问题的了。&/p&&p&做一下简单介绍,薛红杰,04年进入游戏行业,至今有12年的游戏制作经验,1年动画制作经验。入行之初是一名角色原画师,从事原画工作3年后对3d发生兴趣,在06年学习资源极度缺乏的时候自学了zbrush,3ds max,softimage。07年的时候因为机缘巧合投简历到了当时在上海的epic games china studio。在epic games china&br&studio工作中第一次接触到了虚幻3,从此之后我的职业生涯基本都和这个引擎有关系。09年我在久游参与了《流星蝴蝶剑ol》的制作,也是虚幻3平台。13年到16年因为属于创业经历所以这段从事的工作和虚幻4没有关系,但是多年养成的学习习惯还是会关注虚幻4的变化。16年到17年这一年我以技术美术的身份在一家使用虚幻4制作动画的公司工作,后来转为美术总监,几乎是全流程的参与了动画制作(虽然这次项目依然没有成功,现在本人已经离开这家动画公司)。我就这次项目经历来说一下我在使用虚幻4制作动画上遇到了哪些问题和看法,以及我对动画制作和游戏制作不同的看法。&/p&&p&传统的3D动画制作流程是以maya为制作平台搭配其他dcc和渲染器辅助的流程,这个流程被大多数动画公司采用(皮克斯是个例外他们有自己的动画制作平台USD和渲染器Renderman)。这个流程简要来说是模型,绑定,动画,材质,灯光,渲染这样一个顺序流程,以Maya为主,其他DCC辅助,是一个线性非破坏流程。这个流程下的好处是工艺成熟,可控性高,人才储备丰富,在现有人才结构下运转良好,团队磨合好战斗力很强。缺点就是技术决定了团队环节多,规模大,渲染后的修改需要之前流程重复运转一次,修改成本大,团队的磨合成本高。&/p&&p&图示&/p&&p&典型的流水线&/p&&figure&&img src=&http://pic3.zhimg.com/v2-14eaabed081d39e74c5ecaa85eee79be_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&318& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&http://pic3.zhimg.com/v2-14eaabed081d39e74c5ecaa85eee79be_r.jpg&&&/figure&&p&传统动画流程&/p&&figure&&img src=&http://pic4.zhimg.com/v2-9bb1edb6c9fe07_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&318& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&http://pic4.zhimg.com/v2-9bb1edb6c9fe07_r.jpg&&&/figure&&p&虚幻4作为一个新的制作平台相应成规范的流程和人才储备还不够完善。虚幻4在整个流程里和Maya流程还是有很大区别,首先在DCC里创建完资产(模型,纹理,绑定,动画,模拟等),导入到虚幻4里,在虚幻4里然后搭建场景,编写材质,灯光,建立sequence,编辑素材然后输出这样一个流程。相比Maya的线性流程,虚幻流程是一个非线性流程,虚幻4这个流程中每个节点都可以在制作途中修改,可编辑性非常高,对其他环节影响小,最显见的就是灯光可以随时修改,随时输出。这样的环节对于创作人员来说可以说是释放了巨大的潜力,传统流程中创作团队几乎要到后期才能看到成品的模样,而虚幻4的流程完全没有这些限制,官方给出的定义是以导演可以纵观全局(原文是:Director-centric&br&during entire process)&/p&&p&不过虚幻的缺点也有,上手难度高,推广到团队里成本会不小,目前来说想要平滑的把虚幻4引入到Maya流水线还是个有难度的事情。人才储备方面,使用虚幻的人大多都在游戏行业,游戏行业里流程的概念并不强,没有动画行业那么严谨和多环节,过渡到动画行业有一定成本,已经非常成熟的动画团队在技术上接受虚幻的问题技术上有一部分,不过主要还是在制作平台的切换要丢弃之前很多积累,对新工具的学习也是一个可见成本。这点上来说,没有Maya流水线积累的新团队直接使用虚幻4会更加灵活,毕竟船小好掉头。可编辑性的提高同时也意味着管理复杂度的提高,这要求团队要有很强的管理水平。&/p&&p&非线性的工作流程&/p&&figure&&img src=&http://pic1.zhimg.com/v2-6ebb587d4f4b5e5dd172a0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&318& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&http://pic1.zhimg.com/v2-6ebb587d4f4b5e5dd172a0_r.jpg&&&/figure&&p&虚幻4制作动画的流程&/p&&figure&&img src=&http://pic3.zhimg.com/v2-ca23c5f15003a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&318& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&http://pic3.zhimg.com/v2-ca23c5f15003a_r.jpg&&&/figure&&p&以上只作为一个基本论调,毕竟虚幻4制作动画的技术爆炸阶段还没有到来,好处和坏处并存是正常状态。&/p&&p&我作为一个从游戏行业使用虚幻4制作动画在很大程度上依赖于之前多年的虚幻引擎使用经验,算是平滑过渡的,但是这对于团队而言是很难的,多数人还是会在原有技术平台下保持一个惯性思维,接受新工具总是会经历阵痛期。&/p&&p&下面我会逐个展开说明虚幻流程做动画的细节问题。&/p&&p&&b&流程之初是在最前面的DCC环节&/b&。这里模型资产的创建选择maya,max,Houdini,blender都没有什么对错,主要看团队更擅长哪个,选择一个作为通用生产工具即可(本人就喜欢softimage这样一款已经停止开发的软件)。&/p&&p&纹理生产的选择使用SD 加SP,Quixel或mari都可以,还是看团队对哪款工具更擅长(本人喜欢mari,因为其强大的映射和遮罩绘制)。&/p&&p&Rigging环节目前我只接触过maya,师从Judd Simantov(神秘海域系列首席角色技术总监)。&/p&&p&Judd Simantov的流派是使用joint绑定加blend shape,这样做也是因为在此之前alembic没有被大多数引擎支持,不过这点随着虚幻4和多数引擎开始支持alembic格式,纯粹的joint绑定被扔进历史垃圾桶已成定论,动画级绑定从此不再受限,alembic可以完美还原动画级绑定的丰富变化。&/p&&p&动画资产的生产在动画片制作里绝对是一个耗费相当大人力和时间的环节。目前来说,采用全身动补来说是可以比较好的加速动画资产创建技术手段。动补有两个方案,一个是不太成熟但是廉价的惯性动补(以诺亦腾为代表),一个是成熟昂贵的光学动补(以vicon为代表),这点上选用哪套设备还是要看财力。我最期望的动补还是能实现全身加表情加手关节动补,这样,即便是初期动补质量不高,也可以非常快速的实现perviz,加速制作进度。这里的选择其实每家公司都不太一样,制作了神秘海域4的顽皮狗就是选择身体动补,面部和手指动画由动画师添加这样的老旧方案,制作出来的效果绝对是世界级的,这点还是看团队的技术储备,老方案只要成熟稳定,一样可以全火力输出。&/p&&p&自然类资产也是多种多样。山体可以选择world machine,blender,houdini,都能做出不错的资产。自然植被有speedtree可选择,功能也十分强大。&/p&&p&近景自然资产我最近接触到了摄影测量技术,这是一个十分强大的技术,可以快速的产出大量的石头,山体,植被。&/p&&p&&b&下一个环节是把资产导入到虚幻引擎里&/b&。最近虚幻开发了一款批量导入的工具可以解决大量物体导入的繁重劳动。导入到虚幻引擎后第一道工序一般是制作材质,而材质上确实是虚幻引擎的一大强项和难点,这点逐渐展开说。材质编辑器在虚幻3时代是个用起来入门门槛很高,通用性很差的环节,易用性上只有material&br&instance这样灵活性不高的功能。但是随着虚幻4引入了material&br&function这项功能,从此把材质使用带入了一个新的时代。material function简单来说就是把之前每个材质球都要做一遍的功能包装城了单独功能的节点,使用的时候直接调用,不要再每个材质都做一遍,这点上确实解放了很大的生产力。伴随material function而生的还有一个东西叫material layer,目前来看material layer还是作为material function的一种存在的,material layer是把一种效果包装成一个material function,再把各种影响这个效果的节点参数暴露出来。了解这个东西的团队把他作为一个内部规范约定,成为一个基础的材质库,使用上高效,调用方便灵活,修改简单。我在unreal roadmap上看到了后面官方会把material layer作为一项功能单独推出来,这点上我是很兴奋的,因为这个功能推出会把材质工艺更加标准化,材质效果这一块会成为一个模块化的存在,大大推动生产力(以后卖material layer应该也是门生意)。估计今后material layer这个概念被大家接受后material layer库的建立也会成为项目中非常重要的一环。&/p&&p&如何使用material layer在最近的Unreal Dev Day Montreal 2017 视频里有提到,感兴趣的可以看看。&/p&&p&&br&&/p&&figure&&img src=&http://pic3.zhimg.com/v2-d5ffeafc564ae36_b.jpg& data-caption=&& data-size=&normal& class=&content_image&&&/figure&&p&&br&&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//www.bilibili.com/video/av/index_3.html%3Ft%3D2866& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Master Class(3)_演讲o公开课_科技_bilibili_哔哩哔哩&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//www.bilibili.com/video/av/index_3.html%3Ft%3D2866& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&视频&/a&&/p&&p&资产再完成了材质后下一步会放到场景里搭建,这一步再游戏开发里是由专门的level artist完成的,在动画制作上的有一定区别,主要体现在动画受镜头限制,镜头之外的没有必要制作,场景只需要保证镜头之内的效果。这里有一点制作细节上的东西,就是场景搭建要使用sublevel来制作,把不同的部分放到独立的sublevel里是一个非常重要的制作规范,这在后面制作上会规避掉很多危险操作。&/p&&p&特效上目前虚幻4的特效还真的是不怎么好,特效编辑器还是很老旧的精灵动画作为原始资产,通过修改属性制作各种效果,这点上非常考验特效师的能力。我比较期待的是目前尚在开发中的Niagara粒子系统,Niagara在roadmap上的介绍是一款基于节点式的特效编辑器,这一点很像houdini,估计这个系统出来之后现行的特效制作理念会被颠覆,特效师们会迎来一个选择和挑战。&/p&&p&模拟上虚幻4本身的布料模拟也形成了自己的工具链,不依赖外部工具,完全在引擎内部实现,制作中可以随时调节。当然,使用alembic导入外部更好效果的模拟也是一种方法,但是这真的不是虚幻4本身的长处,它的长处还是在于编辑一次,省去逐帧解算的成本。&/p&&p&灯光环节需要说明一点的是虚幻4的灯光效果很大程度上依赖烘焙的效果,这在资产制作上要求场景模型必须要有2UV用以生成lightmap,烘焙之后,光线追踪的信息会存储到lightmap上,保证引擎运行时候的效率和效果的平衡。灯光环节也要注意灯光应该存储到独立的sublevel里,这样切换不同光照方案的时候会很方便。灯光上有非常多的细节要注意,例如要塑造体积,前景和后景的对比,冷暖对比,色彩饱和度等等,所以一名出色的灯光师最好是学摄影出身的,这样学校里教的理论知识在工作上都能用得上。灯光的使用上有很多虚幻4区别于maya的技巧,毕竟实时渲染和离线渲染在实现方式是非常不同。一个好的灯光师会把之前的素材升华,提升几个档次,所以一个优秀的灯光师在动画团队里非常重要,。&/p&&p&虚幻4推出的sequence是款野心十足的工具,它基本就是AE和premiere的结合体,在sequence里可以完成非常多的事情,例如镜头、剪辑、音效等,用的好的话抛弃premiere都是有可能的。Sequence就相当整个生产线的枢纽,在sequence环节把之前环节的素材全部装载进来进行编辑,在这个环节可以回看之前所有环节的东西,所有问题也会在这个环节暴露出来,这个环节会反复的修改和调整,相比传统流程sequence提供的自由度简直是太高了。镜头上既可以选择在sequence里创建也可以导入DCC里的cmaera,这点上也是看团队的选择。在官方放出的Sequence工程里,可以看到完整的sequence使用方法,例如master sequence,这点在团队工作上非常重要,这可以让多人编辑变的很安全,这也是非线性的体现,多人同时编辑后同步到perforce或svn,结果即会同步(虽然maya也可以使用钩子文件的方式实现,但是真是觉得master sequence更好用)。&/p&&p&到s

我要回帖

更多关于 大卡车游戏大全 的文章

 

随机推荐