
Unreal Engine
蓬 蒿 人
这个作者很懒,什么都没留下…
展开
-
UE4如何将UMG逻辑代码在C++中实现
UE4游戏中的界面一般用UMG来编辑,逻辑使用蓝图代码,但如果逻辑复杂,使用蓝图实现就会比较乱,也不好维护,所以在C++工程中我们通常可以将大部分代码在C++中实现,只留出几个供蓝图调用的接口。如果不想写蓝图代码,而是完全在C++中实现,通过下面的方法是可以实现的,这样界面与逻辑就分离了,便于后期维护和修改。1、首先创建一个继承自UUserWidget的C++类UCLASS(...原创 2020-03-10 15:06:05 · 2646 阅读 · 2 评论 -
UE4打包运行后出现Could not find SuperStruct XXXX错误的解决办法
先看下报错的现象,新建工程MyProject,然后在Plugins窗口点击NewPlugin新建一个Blank插件MyPlugin 在MyPlugin插件中创建一个AActor类AMyActor,然后在编辑器中新建基于AMyActor的蓝图类BP_MyActor,将BP_MyActor拖入关卡,打包后运行会出现下列错误弹窗 按错误所说的意思应该时插件没有打...原创 2020-01-10 15:25:44 · 2995 阅读 · 0 评论 -
在UE4中实现撤销(Undo)和重做(Redo)功能
一般编辑功能都有撤销和重做,如下图是VS的编辑菜单下的撤销/重做功能,UE4编辑器的Edit菜单下也有Undo和Redo功能 如果要在游戏中实现撤销/重做就要自己写代码实现了,比如撤销/重做Actor的移动或隐藏,下面来实现这样一个简化版的功能。 每种需要撤销和重做的功能类型都使用一个类来保存所有需要的信息,如物体的位置移动需要保存Actor的指针、...原创 2020-01-04 15:08:57 · 7875 阅读 · 0 评论 -
UE4中的简单碰撞与复杂碰撞
物体碰撞形状分为简单碰撞和复杂碰撞,简单碰撞的形状比较简单,方便计算,可以由用户自己添加和编辑,复杂碰撞紧贴物体表面,形状精确但是计算量大。 将引擎下的球体模型复制到工程的Content目录下,双击在模型编辑器中观察简单碰撞(不太明显)和复杂碰撞,使用工具栏Collision下拉菜单切换碰撞的显示与隐藏,如下图所示 为了在碰撞检测测试中更明显看到简单碰...原创 2019-12-04 10:43:00 · 13959 阅读 · 3 评论 -
UE4在C++中调用蓝图类中的函数
在Content下新建一个蓝图类BP_CallTest,并添加一个函数TestCppCall该函数名TestCppCall包含在UClass类成员变量FuncMap中,通过FindFunctionByName获取,返回类型为UFunction*,然后通过Actor实例调用ProcessEvent函数FSoftClassPath softClassPath(TEXT("/Game/BP...原创 2019-11-17 14:24:18 · 4092 阅读 · 0 评论 -
UE4在C++中加载Content目录下的资源文件
UE4中Content的资源都是继承于UObject类,可以使用LoadObject加载资源UObject* object = LoadObject<UObject>(nullptr,path);例如加载StarterContent/Props中的模型资源SM_Chair可以这样写UStaticMesh* mesh = LoadObject<UStaticMesh...原创 2019-11-16 23:37:04 · 6152 阅读 · 2 评论 -
UE4绘制自定义模型
UE4中的UProceduralMeshComponent组件可以用于绘制自定义形状的模型,该组件位于ProceduralMeshComponent插件中,如果要引用该插件中的功能就要在XXXX.build.cs文件中加入对ProceduralMeshComponent模块的引用,如下所示PublicDependencyModuleNames.AddRange(new strin...原创 2019-11-12 21:58:10 · 8743 阅读 · 7 评论 -
Windows环境下编译Airsim
AirSim是微软基于UE4(后来也添加了Unity工程)开发的一款开源模拟器,可以模拟无人机、无人车。源码地址:https://github.com/Microsoft/AirSim下面简单说下编译过程(假设已经安装了VS、UE4等环境),编译该项目分为两部分,第一部分是编译依赖库工程,第二部分是编译UE4工程,这里主要介绍依赖库工程的编译。下载源码解压后可以看到AirSim目录下...原创 2019-11-05 22:52:46 · 1437 阅读 · 0 评论 -
UE4在VR模式下使用3D控件
UE4中UWidgetComponent可以将UMG转为3D界面放到场景中,操作与2D界面操作一样,但是在VR模式下通过手柄操作不能像鼠标一样点击,这时就要用到UWidgetInteractionComponent与3D界面交互。1、新建一个UMG,命名为Widget3D,拖入一个Button和Image控件,如图2、添加蓝图代码,在按钮的点击事件中切换Image的背景色3、新...原创 2019-09-27 22:35:04 · 7391 阅读 · 7 评论 -
UE4之替换多维子材质
多维子材质是指一个模型的不同部分分别用了不同的材质,在UE4中打开模型编辑器界面,就能看到模型的材质组成,如下图,在LOD0的Sections栏看到该模型(StarterContent中的SM_Door)由两个材质部分组成。MaterialSlot表示该部分使用的某个材质槽的材质,材质槽可以由我们自己编辑,如下图,在默认材质槽后面又新建了一个材质槽,并命名为MySlot,只要将上面的Mat...原创 2019-09-09 22:22:33 · 5199 阅读 · 1 评论 -
UE4学习笔记:动态链接库和静态链接库的使用
在UE4中使用静态链接库和动态链接库与普通程序中使用差不多,只是要在编译文件中设置库文件路径。下面创建一个第三人称模板的C++工程ThirdPerson,使用https://blog.youkuaiyun.com/yb0022/article/details/78470166这篇文章中的静态链接库和动态链接库。一、静态链接库在工程目录新建一个文件夹ThirdParty(与Content目录同一级)...原创 2019-08-06 21:56:32 · 1886 阅读 · 0 评论 -
UE4定制表达式材质节点Custom的使用
Custom节点的Code属性可由用户自己编写代码,代码与HLSL语法一致 节点的输出是Code中return返回的值,返回值类型可在[Output Type]属性修改,比如选择[CMOT Float3],Code写入return float3(0,0,0);(这样简单的表达式也可以不使用return,直接写成float3(0,0,0)),将该节点连接到材质的BaseCol...原创 2019-08-01 09:10:46 · 10234 阅读 · 1 评论 -
UE4中为图片添加水印
添加水印就是将水印图片与目标图片以一定透明度混合,UE4中获取水印图片和目标图片的原始颜色数据,再将相应的颜色值混合就可以向图片添加水印。比如截图后,对所截取的图片加添水印,或者对本地图片文件添加水印。1、添加水印代码/*InColors:需要添加水印的图像原始颜色数据InSize:需要添加水印图像的宽(X)和高(Y)InWaterMarkFile:水印图像文件In...原创 2019-07-21 15:33:23 · 1772 阅读 · 0 评论 -
UE4之简单的多人游戏
UE4多人游戏主要用到CreateSession,FindSession和JoinSession,功能分别是创建会话,查找会话以及加入会话。以下第三人称模板为例实现一个两人游戏。 1、创建第三人称模板工程,删除ThirdPersonExampleMap关卡中原有的ThirdPersonCharacter角色,拖入两个PlayerStart,调整好位置,如果想更好的控制角...原创 2019-07-18 22:25:22 · 7182 阅读 · 2 评论 -
UE4之HTTP请求
UE4中的HTTP模块封装了libcurl的HTTP功能,很容易实现HTTP下载和上传功能,代码如下class FHttpRequestTest{ void Download(const FString& URL) { TSharedRef HttpReuest = FHttpModule::Get().CreateRequest(); HttpReuest->S...原创 2017-07-30 15:19:16 · 27505 阅读 · 8 评论 -
UE4中实现截图功能并保存到指定路径
为方便起见,都是用全局函数和变量,而不是在类中实现代码如下:FDelegateHandle GCaptureHandle;static void OnCaptureScreenshotComplete(int32 InWidth, int32 InHeight, const TArray<FColor>& InColors){ FString ScreenSho...原创 2017-07-24 18:21:39 · 14078 阅读 · 5 评论 -
UE4中窗口模式切换
1、设置游戏启动的默认窗口模式 设置默认模式可通过修改配置文件的方式,配置文件名DefaultGameUserSettings.ini,位于Config目录下,如果没有该文件可新建一个,配置项如下[/Script/Engine.GameUserSettings] bUseVSync=False ResolutionSizeX=1280 ResolutionSizeY=7...原创 2017-07-25 13:55:31 · 23800 阅读 · 2 评论 -
UE4将图片数据读到贴图中
以jpg图片为例UTexture2D* CreateTextureFromFile(const FString& InFileName){ TArray<uint8> ImgData; if (!FFileHelper::LoadFileToArray(ImgData, *InFileName)) return nullptr; IImageWrapperM...原创 2017-07-27 20:28:18 · 4712 阅读 · 0 评论 -
UE4之材质参数的使用
在UE4中想要在代码中动态改变材质的某些参数,可通过创建动态材质实例来获取指定材质参数的材质,然后将该材质实例赋给模型,以改变贴图和粗糙度为例1、在编辑器中新建材质,这里的材质为NewMaterial,创建在Content目录,加入需要修改的参数的材质节点2、在材质节点上点击鼠标右键,选择菜单项“Convert to parameter”,将材质节点转为参数节点,并命名参数,如图...原创 2017-07-29 12:47:32 · 19273 阅读 · 0 评论 -
UE4之自定义引擎类
可参考:https://wiki.unrealengine.com/Create_Custom_engine_classes_for_your_game_module新建UMyEngine类继承自UGameEngineclass UMyEngine : public UGameEngine在配置文件DefaultEngine.ini中将引擎类修改为新的类[/Script/E翻译 2017-10-12 14:48:08 · 1607 阅读 · 0 评论 -
UE4在VR模式下如何使手柄震动
UE4中有两个函数可以实现VR手柄震动功能PlayHapticEffect(百度翻译:触觉效果)和ClientPlayForceFeedback(力反馈),都是APlayerController的成员函数。1、PlayHapticEffect的使用PlayHapticEffect在UE4官方的VR模板工程中有用到:Hand为EControllerHand枚举类型,表示左手柄原创 2017-11-02 17:37:48 · 4044 阅读 · 0 评论 -
UE4如何上传文件
上传文件示例代码/*InUrl为上传URLInFiles为本地文件路径的数组Boundary为分隔符,用来分隔文件,其他地方不能出现该字符串,每个文件都以"\r\n--"+Boundary+"\r\n"开始(即BeginBoundry)分隔符之后是文件头(FileHeader),文件头中name为文件域,这里用"file[]",[]表示上传多个文件,如果是一个文件可去掉[];filenam原创 2017-12-20 17:04:01 · 5566 阅读 · 4 评论 -
UE4的资源烘焙
1、烘焙所有关卡和资源编辑器菜单[Cook Content for Windows]可以烘焙所有关卡和资源2、烘焙指定关卡烘焙指定关卡可以用命令行实现,其中要加入-map参数,如-map=/Game/NewMap就会只烘焙NewMap关卡官方文档提供的命令行格式如下:UE4Editor.exe <GameName or uproject> -run=cook -targetplatfo...原创 2018-05-10 16:20:37 · 12292 阅读 · 5 评论 -
UE4之自定义粒子系统模块
粒子模块用于设置粒子的各种属性,如颜色和速度等。 粒子模块基类为UParticleModule,所有的粒子模块都是继承自这个基类,它有两个虚函数Spawn和Update,我们一般重载这两个函数即可。virtual void Spawn(FParticleEmitterInstance* Owner, int32 Offset, float SpawnTi...原创 2019-07-14 21:24:47 · 3416 阅读 · 0 评论 -
UE4之UDP通信
UE4的Sockets模块封装了socket通信,以UDP通信为例说明如何在UE4中实现socket通信class FUDPTest{private: FSocket* UdpSocket;public: void InitSocket() { FIPv4Address UdpAddr; FIPv4Address::Parse("127.0.0.1", UdpAdd...原创 2017-07-29 14:31:48 · 9312 阅读 · 0 评论