Unreal Engine04:Visual Studio和Editor的协同开发

写在前面

这里主要是记录一下Visual Studio和Editor之间的关系和如何使用它们进行UE4协同开发。

一、启动

1. 先启动Visual Studio再启动Editor
  • (1) 打开项目根目录下的xxx.sln解决方案,即可启动Visual Studio,这个是和普通的C++项目打开方式相同的;
    打开C++项目

  • (2) 在打开的C++项目中,点击本地Windows调试器编译程序即可启动Editor;
    启动Editor

  • 但这样一来,修改的代码就不能在Editor中生效了,需要停止调试再重新编译调试启动Editor才能将修改的代码生效;

  • 所以这种方式不太推荐使用的;

2. 先启动Editor再启动Visual Studio
  • (1) 启动Editor的方式有四种:

  • 打开已有UE4项目

  • 如果是已有UE4项目,则可以打开项目根目录的xxx.uproject,即可启动项目对应的Editor;
    打开对应的Editor

  • 新建UE4项目或者打开已有UE4项目

  • 如果之前并没有已经创建的UE4项目,或者需要新建一个UE4项目,则可以点击UE4 Unreal Engine快捷方式(一般按官方途径安装之后在桌面就会有)启动Editor,然后按照指引新建一个UE4项目;
    UE4图标

  • [推荐] 当然也可以点击UE4 Epic Games Launcher快捷方式,在中启动对应版本的引擎,也可以进入Editor新建项目指引,一般是更推荐这种方式,因为可以管理不同版本的引擎;
    Launcher图标

  • 另外,如果是通过源码编译得到的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项目代码;
    打开VS

  • 注意,项目的Editor和新建项目时启动的Editor是不一样的,后者可以视为一个引导程序,而前者才是xxx.uproject对应的Editor;

二、目录结构

1. C++项目文件目录结构
  • 一个基本的UE4项目的项目文件结构如下:
    文件结构
  • 各个文件夹对应的含义如下:
    • Binaries可执行文件和DLL文件
    • Config配置文件,包含了项目设置,键盘输入之类的配置文件;
    • Content:存放引擎或者游戏的内容文件,包括地图、贴图、模型、材质和蓝图等;
    • Intermediate临时构造文件,包含了在编译引擎或者游戏时生成的临时文件;
    • Saved保存的内容,包括自动保存的文件、本地配置文件(*.ini文件)、截图和日志文件;
    • Source源代码,包括项目的所有源代码;
  • 其中最重要的文件夹是ContentSource,前者用于管理各种内容文件,后者用于管理源代码,是C++项目和Editor沟通的桥梁;
2. Editor内容浏览器文件目录结构
  • 一个基本的Editor内容浏览器的文件目录结构如下:
    内容浏览器

  • (1) 内容文件夹和C++项目中的Content文件夹基本上是完全对应的,里面的资源文件均可以通过文件资源管理器在Content文件夹中找到,而且目录结构一致;

  • (2) C++类文件夹和Source文件夹基本上是完全对应的,所有出现的C++类均可以在文件资源管理器的Source文件夹中找到,而且目录结构一致;

  • 一个简单的示例如下:

  • TestCppGameModeBase这个类在Source文件夹中有对应的.cpp.h,在内容浏览器中也有对应的映射;

Editor中的类
VS中的类

  • 如果发现内容浏览器中少了某些文件夹,可以点击右下角的视图选项勾选需要的内容,就可以在内容浏览器中看到了;
    视图选项

三、C++类和蓝图的相互协作

  • Visual Studio负责管理C++类源码,Editor则负责蓝图和资源的组织管理,它们之间最重要的沟通桥梁就是C++类和蓝图之间协作;
  • 这里将介绍如何创建一个最基本的UObject类,然后在蓝图中调用它;

1. 创建C++类

  • C++类要在Editor中创建,在内容浏览器C++类->工程文件夹目录下右键,点击新建C++类即可;
  • 勾选显示所有类可显示所有的已有类;

创建C++类

  • 点击下一步,检查当前类是否创建于项目文件夹下
  • 勾选公有按钮,会自动将该类的.h文件放到Public文件夹下,将.cpp文件放到Private文件夹下;
  • 修改类的命名,注意要用大驼峰式,所有首字母均大写,不需要加前缀,因为这个是类文件名,真正的类名UE4会自动帮我们加上的;

创建类

  • 如果新建类后,在内容浏览器中没有显示,可以:
    • 使用Editor的编译按钮编译;
    • 在Visual Studio中生成解决方案编译;
    • 或者尝试重新进入对应的目录中,刷新界面显示内容;

2. 创建C++类对应的蓝图类

  • 使用UObject为父类创建的类是最基本的类,类内的内容十分简洁;
  • 它的头文件包括类的声明、类成员变量和类成员函数声明,如下:

头文件内容

  • 它的cpp仅包含一行头文件,内容如下:

cpp内容

  • 此时的PrintOnScreenObject类是无法在Editor中创建蓝图类的,需要给它加上Blueprintable说明符,如下:

增加说明符

  • 回到Editor中,在C++类上右键创建基于xxx的蓝图类,即可创建对应的蓝图类,如下:

创建蓝图类

  • 蓝图是资源的一种,因此创建的蓝图类会在Content文件夹下;
  • 创建了蓝图类之后还要把它移动到合适的文件夹中,做好分类,如下:

创建的蓝图类

3. 实现C++成员函数

  • 为了能让PrintOnScreenObject类的成员变量和函数均能在蓝图中可见,需要为它们增加对应的宏说明符,如下:

成员变量和成员函数

  • 然后,在.cpp文件中实现打印的功能,参考博客:UE4 C++ 之 打印
  • (1) UE4打印到日志:
// 日志实现的格式如下
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);
  • (2) UE4打印到屏幕:
// 打印到屏幕的实现格式如下
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));
  • 因此,实现的成员函数如下:

成员函数实现

4. 构建调用C++类的蓝图

  • 因为只有Actor才能放进地图里面,而前面创建的类是UObject类型的,所以还要额外创建一个Actor蓝图类,如下:

Actor蓝图类

  • 双击Actor蓝图类,打开蓝图编辑界面,并搭建调用蓝图PrintOnScreenObject类的蓝图,如下:

搭建蓝图

  • 一些注意的点如下:
    • 首先要让当前Actor类有一个PrintOnScreenObject类成员变量,在左下方的我的蓝图->变量中新加即可;
    • 蓝图的逻辑是:构建一个PrintOnScreenObject类对象,拥有者是当前Actor类,然后把构造的对象赋给PrintOnScreenObject变量,然后通过该变量调用PrintOnScreenObject类的成员函数PrintToScreen
    • 白色点的连接表示执行过程的传递,其余点的连接表示变量数据的传递
    • 如果在C++代码中修改了成员函数或者变量的名字,则蓝图中的对应气泡需要重新构建;
    • 右键气泡节点可以进行快速节点注释
    • 编译C++项目不通过的时候,可以先去Editor进行编译,然后再回到Visual Studio中编译;
  • 搭建好蓝图后,点击左上角的编译按钮;
  • 然后回到主面板,将BP_PrintOnScreenActor拖入地图中生成实例,否则蓝图无法生效;

放入Actor类

  • 最后点击编译播放即可;
  • 效果是在屏幕上有5秒的内容打印,在日志中有输出warning级别日志信息;

5. 删除类

  • 删除蓝图类:

    • 在内容浏览器中右键选择要删除的蓝图,选择删除即可;
    • 删除时,如果选择替换引用,则替换所有的该蓝图类实例,如果选择强制删除,则强制删除所有的该蓝图类实例;
  • 删除C++类要稍微麻烦一点:

    • 关闭所有Editor和Visual Studio窗口;
    • 删除类对应的.cpp.h文件;
    • 删除Binaries文件夹;
    • 右键.uproject文件,选择Generate Visual Studio project files,重新生成vs项目文件;

四、遇到的问题及处理

1. 调用类成员变量时有红色波浪线报错,但编译能通过

  • 情景:在创建C++类时勾选了公有按钮,.h文件被放到了Public文件夹下,在.cpp中调用类内成员时有大量的红色波浪线报错,Visual Studio无法识别变量类型,也无法给出类的函数提示,虽然编译能够通过,但这样编程就会很难受,既无提示也很难判断是否有拼写错误;
  • 原因:代码的目录结构过于复杂,Visual Studio没有将当前代码所需的声明文件包含在搜索路径下;
  • 解决方法
    • 右键项目属性
    • NMake包含搜索路径下,新增声明文件所在的路径,更具体一点的,是当前代码中显示了红色波浪线的变量或者函数所在的声明文件(通常是.h文件)的路径;

包含搜索路径

2. 调用系统类函数时有红色波浪线报错,但编译能通过

  • 场景:调用别的一些UE4自带的类时,提示找不到该类声明,或者提示不允许指针指向不完整的类类型,无函数提示,但编译能够通过;
  • 原因:因为没有引入和该类对应的头文件,但UE4有某些修复机制,导致编译能够通过;
  • 解决方法:在代码中右键该类名称,点击转到声明,这时编辑器会给出所有包含该变量声明的头文件位置,选择合适的头文件引入到当前代码中即可;

3. 在Visual Studio中编译不成功但无法定位错误

  • 一种解决方法:可以在Editor中编译,给出的错误信息会比较详细,方便定位错误;
  • 其实在Editor中编译等价于在Visual Studio中生成解决方案

4. 头文件中类提示未定义标识符

  • 场景:如果是需要在头文件中使用一些UE4的类,则有可能提示未定义标识符而报错,因为头文件中确实没有引入这个类对应的头文件,而且也不适合在头文件中引入别的类的头文件,一般只在.cpp文件中才引入,头文件只作声明;
  • 解决方法:在类名前增加class关键字,当然也可以在头文件的下面直接将所有用到的类都用class关键字声明一遍,这样就不用每次写类名都声明了;

声明class

5. 修改C++类后,在对应的蓝图类面板上没有实时更新信息

  • 场景:用C++类派生蓝图类后,如果修改了C++类的内容,则蓝图类可能不能实时同步更新;
  • 解决方法:在类设置->父类中修改为其他类,然后再修改回原来的类,即可刷新C++类中的信息到蓝图类中;

修改父类

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值