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

news2024/10/1 19:36:19

写在前面

这里主要是记录一下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++类中的信息到蓝图类中;

修改父类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023美国大学生数学建模竞赛C题思路解析(含代码+数据可视化)

以下为2023美国大学生数学建模竞赛C题思路解析(含代码数据可视化)规则:猜词,字母猜对,位置不对为黄色,位置对为绿色,两者皆不对为灰色。困难模式下的要求:对于猜对的字母&#xff08…

RBAC权限模型

什么是RBAC权限模型? RBAC是基于角色的访问控制,在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。 1.0级 用户、角色、权限 2.0 权限分级 公司>部门>小组 2.1 权限继承 ps: 这个人是一个小组长…

Java调用Selenium实现自动化测试

Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。 Selenium简介 Selenium是一个用于Web应用…

Spring MVC 之Tomcat启动流程

从web.xml说起在开始 Spring MVC 的分析之前,先来聊一聊 Java 初学者接触的最多的 Java Web 基础。还记得我的第一个 Web 工程是由 Servlet、Velocity 和 Filter 来完成的,那时几乎所有人都是根据 Servlet、JSP 和 Filter 来编写自己的第一个 Hello Worl…

Java基本语法

目录 一、注释方式 1、单行注释 // 2、多行注释 /*...*/ 3、文档注释 /**....*/ 二、标识符和关键字 三、数据类型 拓展及面试题讲解 1、整数拓展 进制 二进制0b 八进制0 十六进制0x 2、字符拓展 编码Unicode表 2字节 0~65536 3、字符串拓展 4、布尔值拓展 一、注释方式…

可视化已编译Java类文件字节码的神器jclasslib

概述作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?运行着的线上系统突然卡死,系统无法访问,甚至直接OOM想解决线上JVM GC问题,但却无从下手新项目上线,对各种JVM参数设置一脸茫然,直…

基于树莓派的智能家居项目整理

一、功能介绍 二、设计框图 三、实物展示 四、程序 一、功能介绍硬件:树莓派3B、LD3320语音识别模块、pi 摄像头、继电器组、小灯、火焰传感器、蜂鸣器、电 磁锁 项目框架: 采用了简单工厂模式的一个设计方式。稳定,拓展性…

2023美赛ABCDEF题思路+参考文献+代码

选题建议、ABCDEF题参考文献、ABCDEF题思路(后续更新视频和代码)、D题数据、数据集及处理方式已更新,其他日内更新。下文包含:2023年美国大学生数学建模竞赛(以下简称美赛)A - F题思路解析、选题建议、代码…

插件开发版|Authing 结合 APISIX 实现统一可配置 API 权限网关

当开发者在构建网站、移动设备或物联网应用程序时,API 网关作为微服务架构中不可或缺的控制组件,是流量的核心进出口。通过有效的权限管控,可以实现认证授权、监控分析等功能,提高 API 的安全性、可用性、拓展性以及优化 API 性能…

【郭东白架构课 模块一:生存法则】06|法则二:拼多多是如何通过洞察用户人性脱颖而出的?

你好,我是郭东白。上节课我们学习了怎么利用马斯洛理论去指导架构设计,尤其是该如何考虑和顺应研发人员的人性。 我们都知道,软件这个虚拟的存在最终是要服务于用户的,所以在软件设计的过程中也要考虑用户的人性。也就是说&#…

二进制中1的个数-剑指Offer-java位运算

一、题目描述编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为 汉明重量).)。提示:请注意,在某些语言(如 Java&…

chatGPT在软件测试中七大应用方式

chatGPT火得不能再火了🔥过去两周,国内chatGPT概念股很疯狂,不只是百度、讯飞,有些默默无闻且业绩亏损的公司股价大涨,有1-2个公司连续7个涨停板,不可思议!上周,因为微软Bing发布新版…

postman-enterprise-API

Postman 是一个用于构建和使用 API 的 API 平台。Postman 简化了 API 生命周期的每个步骤并简化了协作,因此您可以更快地创建更好的 API。 API存储库 在一个中央平台上围绕您的所有 API 工件轻松存储、编目和协作。Postman 可以存储和管理 API 规范、文档、工作流配…

【Unity资源下载】POLYGON Dungeon Realms - Low Poly 3D Art by Synty

$149.99 Synty Studios 一个史诗般的低多边形资产包,包括人物、道具、武器和环境资产,用于创建一个以奇幻为主题的多边形风格游戏。 模块化的部分很容易在各种组合中拼凑起来。 包包含超过1,118个详细预制件。 主要特点 ◼ ◼ 完全模块化的地下城!包…

“消息驱动、事件驱动、流 ”的消息模型

文章目录背景消息驱动 Message-Driven事件驱动 Event-Driven流 Streaming事件规范标准简介: 本文旨在帮助大家对近期消息领域的高频词“消息驱动(Message-Driven),事件驱动(Event-Driven)和流(S…

基于Java+Swing+Mysql实现通讯录管理系统

基于JavaSwingMysql实现通讯录管理系统一、系统介绍二、功能展示1.用户登陆2.查询信息3.新增信息4.修改信息5.删除信息三、数据库四、其他系统实现五、获取源码一、系统介绍 1.登录系统 2.查询信息 3.新增信息 4.修改信息 5.删除信息 运行环境:idea/eclipse、mysq…

erupt框架Ueditor富文本编辑器图片上传出现405异常

最近在研究erupt框架(v1.11.2),当字段使用Ueditor富文本编辑器,在图片上传的时候出现405异常,接口不支持POST请求方式: 根据错误提示找到对应的源码,发现Handler方法只支持GET请求,而图片上传的时候是以POST方式发起请求的; 此时需要修改源码,用自定义的类覆盖jar包中同名的…

Qt系列:调用Edge浏览器示例

背景 需要解决以下几个问题 政府项目新浏览器兼容老系统ActiveX控件,Qt WebEngineView没有直接的实现方案,需要利用Qt的ActiveX兼容模块与浏览器往返多次交互Qt ActiveX未实现COM事件通知官方Win32示例存在滥用lambda函数的嫌疑,lambda函数…

2023年保健饮品行业分析:市场规模不断攀升,年度销额增长近140%

随着人们健康意识的不断增强,我国保健品市场需求持续增长,同时,保健饮品的市场规模也在不断攀升。 根据鲸参谋电商数据显示,2022年度,京东平台上保健饮品的年度销量超60万件,同比增长了约124%;该…

flutter-第1章-配置环境

flutter-第1章-配置环境 本文针对Windows系统。 一、安装Android Studio 从Android Studio官网下载最新版本,一直默认安装就行。 安装完成要下载SDK,可能会需要科学上网。 打开AS,随便创建一个新项目。 点击右上角的SDK Manager 找到SDK…