赞
踩
这里主要是记录一下Visual Studio和Editor之间的关系和如何使用它们进行UE4协同开发。
(1) 打开项目根目录下的xxx.sln
解决方案,即可启动Visual Studio,这个是和普通的C++项目打开方式相同的;
(2) 在打开的C++项目中,点击本地Windows调试器编译程序即可启动Editor;
但这样一来,修改的代码就不能在Editor中生效了,需要停止调试再重新编译调试启动Editor才能将修改的代码生效;
所以这种方式不太推荐使用的;
(1) 启动Editor的方式有四种:
打开已有UE4项目:
如果是已有UE4项目,则可以打开项目根目录的xxx.uproject
,即可启动项目对应的Editor;
新建UE4项目或者打开已有UE4项目:
如果之前并没有已经创建的UE4项目,或者需要新建一个UE4项目,则可以点击UE4 Unreal Engine快捷方式(一般按官方途径安装之后在桌面就会有)启动Editor,然后按照指引新建一个UE4项目;
[推荐] 当然也可以点击UE4 Epic Games Launcher快捷方式,在库中启动对应版本的引擎,也可以进入Editor新建项目指引,一般是更推荐这种方式,因为可以管理不同版本的引擎;
另外,如果是通过源码编译得到的Unreal Engine,则需要在源码中打开UE4.sln
,先调用Visual Studio打开Unreal Engine,然后右键UE4项目->Debug->Start new instance即可调出Editor界面,这样也可以进入Editor新建项目指引;
当然上面的三种方法除了新建UE4项目之外,也可以打开已有的UE4项目,只要启动了Editor基本上就比较容易操作了;
(2) 在Editor中新建项目或者打开已有项目之后,在工具栏点击文件->打开Visual Studio即可用Visual Studio打开项目对应的UE4项目代码;
注意,项目的Editor和新建项目时启动的Editor是不一样的,后者可以视为一个引导程序,而前者才是xxx.uproject
对应的Editor;
Binaries
:可执行文件和DLL文件;Config
:配置文件,包含了项目设置,键盘输入之类的配置文件;Content
:存放引擎或者游戏的内容文件,包括地图、贴图、模型、材质和蓝图等;Intermediate
:临时构造文件,包含了在编译引擎或者游戏时生成的临时文件;Saved
:保存的内容,包括自动保存的文件、本地配置文件(*.ini
文件)、截图和日志文件;Source
:源代码,包括项目的所有源代码;Content
和Source
,前者用于管理各种内容文件,后者用于管理源代码,是C++项目和Editor沟通的桥梁;一个基本的Editor内容浏览器的文件目录结构如下:
(1) 内容
文件夹和C++项目中的Content
文件夹基本上是完全对应的,里面的资源文件均可以通过文件资源管理器在Content
文件夹中找到,而且目录结构一致;
(2) C++类
文件夹和Source
文件夹基本上是完全对应的,所有出现的C++类均可以在文件资源管理器的Source
文件夹中找到,而且目录结构一致;
一个简单的示例如下:
TestCppGameModeBase
这个类在Source
文件夹中有对应的.cpp
和.h
,在内容浏览器中也有对应的映射;
UObject
类,然后在蓝图中调用它;.h
文件放到Public文件夹下,将.cpp
文件放到Private文件夹下;UObject
为父类创建的类是最基本的类,类内的内容十分简洁;cpp
仅包含一行头文件,内容如下:PrintOnScreenObject
类是无法在Editor中创建蓝图类的,需要给它加上Blueprintable
说明符,如下:Content
文件夹下;PrintOnScreenObject
类的成员变量和函数均能在蓝图中可见,需要为它们增加对应的宏说明符,如下:.cpp
文件中实现打印的功能,参考博客:UE4 C++ 之 打印;// 日志实现的格式如下
UE_LOG(日志变量名, 日志级别, 日志内容);
// 日志的级别有三种:Log, Warning, Error
// 输出文本
UE_LOG(LogTemp, Log, TEXT("This Log is grey text."));
// 输出含普通类型字符串
int32 ID = 5;
UE_LOG(LogTemp, Warning, TEXT("This Log's id = %d"), ID);
// 打印到屏幕的实现格式如下
GEngine->AddOnScreenDebugMessage(-1, 显示持续时间, 显示颜色, 显示内容);
// 打印文本
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("Hello world!"));
// 打印含普通类型的字符串
FString MyName = "Jeremy";
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("My name is: %s."), *MyName));
float Height = 179.0f
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("I am %f cm tall."), Height));
UObject
类型的,所以还要额外创建一个Actor蓝图类,如下:PrintOnScreenObject
类的蓝图,如下:PrintOnScreenObject
类成员变量,在左下方的我的蓝图->变量中新加即可;PrintOnScreenObject
类对象,拥有者是当前Actor类,然后把构造的对象赋给PrintOnScreenObject
变量,然后通过该变量调用PrintOnScreenObject
类的成员函数PrintToScreen
;BP_PrintOnScreenActor
拖入地图中生成实例,否则蓝图无法生效;删除蓝图类:
删除C++类要稍微麻烦一点:
.cpp
和.h
文件;.uproject
文件,选择Generate Visual Studio project files,重新生成vs项目文件;.h
文件被放到了Public文件夹下,在.cpp
中调用类内成员时有大量的红色波浪线报错,Visual Studio无法识别变量类型,也无法给出类的函数提示,虽然编译能够通过,但这样编程就会很难受,既无提示也很难判断是否有拼写错误;.h
文件)的路径;.cpp
文件中才引入,头文件只作声明;class
关键字,当然也可以在头文件的下面直接将所有用到的类都用class
关键字声明一遍,这样就不用每次写类名都声明了;Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。