UE4 c++学习笔记

1.UE4 C++需要安装的内容

UE4安装:下载Epic Games Launcher后,直接在Launcher中按提示安装

VS:vs installer 中安装下述内容

可以修改安装地址,但是也会在c盘装东西

 2.C++和蓝图的关系

蓝图编译较快,运行效率略有降低,是运行在蓝图虚拟机上,归根揭底还是要转换为c++代码,蓝图和c++可以很好的协作

C++主要用来实现虚幻本身未封装好的功能

或根据项目需求增加自定义的功能

蓝图可以调用c++代码

实际上使用蓝图也是在编程,蓝图也是要编译的面向对象的可视化编程语言,通常用蓝图做东西的时候效率更高(vs启动,编译代码都要花时间的,且c++实现功能本身就比蓝图慢)

3.面向对象

所谓封装:

也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

所谓继承:

是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

所谓多态:

就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

 

UE中的继承结构:

4.反射和垃圾回收

反射:可以使程序在运行过程中查看某个类的信息,如封装了某些内容,可以不通过“.”的方式获取到这个这个类型和名字。

垃圾回收:当一个对象或类的实例没有指针指向的时候,不会被内存释放,会变成垃圾造成内存泄漏,垃圾回收机制会自动释放这块内存。

C++默认是没有实现反射和垃圾回收机制的,但是UE帮我们实现了。

UClass()宏表明这个类要参与反射和垃圾回收,

UProperty和UFunction()表明变量和函数要参与反射与垃圾回收

使用宏要添加头文件,类名.generated.h,这个头文件必须放在所有头文件的最后

填完了以后UHT会在编译时自动添加反射和垃圾回收功能

5.创建第一个c++类型

注意:c++项目一定放在英文目录下

继承者object,宏括号内的内容是没有自动提示的,要多记

在头文件中定义一个float类型,一个函数

每次生成代码都会很慢,主要是反射功能编译较慢,最好在UE中使用编译生成,否则有时会刷新不过来

6.UE输出查看

窗口->开发者工具->消息日志

7.加快编译速度

在不改动任何编译代码重新生成时,速度仍会很慢

UE存在一个BUG,在反射代码没有任何更改下都编译会重新生成反射信息,该操作特别慢,需要调整:

找到UnrealHeaderTool.target,打开后,在第二行末尾加空格就好了……

 

8.生成蓝图调用

写好c++类型后,可在ue中可以被蓝图调用(设置后反射权限)

可以直接在蓝图中调用变量和函数

下图划线部分表示可被反射,参数表示可被蓝图调用

 

 

UE_LOG表示输出消息,第一个参数表示输出类型,第二个是输出级别,最后是输出内容

直接继承自object的类型是不能放在场景中的,只能被调用

所以在关卡蓝图中使用

构建时传递类型参数,输出要转换成的类型

9.删除自定义c++

在资源管理器中是没办法直接删除c++类的

要删除需要以下步骤:

1.删除该类所有引用,派生类等内容

2.关闭UE,在项目目录删除cpp及头文件

3.删除项目目录下Binaries

4.右键uproject文件,产生新的vs工程文件

5.打开uproject,根据提示点确定

10.新建继承自Actor的类

无法在资源管理中直接新建文件夹

但是可以在创建内容时添加路径,会自动生成文件夹

新建后如下,默认有BeginPlay(Actor生成时执行) 和Tick (每帧执行)

DeltaTime 是两帧之间的时间差

在代码的实现中,会有PrimaryActorTick.bCanEverTick,这个变量控制Tick函数是否每帧被调用

Actor 继承自AActor 所有不需要再UCLASS宏中写内容也可以创建蓝图

 

直接把c++类拖拽到世界中是看不到内容的,拖拽其生成的蓝图是可以看到的

因为派生的蓝图类会判断蓝图是不是空的,如果是自动加一个根组件

在蓝图中添加staticmesh,选则mesh后可以在场景中显示,默认的根组件运行时是看不到的(可以用来做定位),自己添加的staticmesh可以拖拽到根组件上替换根组件

用c++实现根组件静态网格功能

TEXT("MyStaticMesh")是一个名称标识,不会在蓝图中显示,会在报错的时候提示哪个标识的内容出错了,标识在一个类中具有唯一性,不能重复

因为只用一个staticmest,会自动把他当成根组件

 

 

11.自己新建内容时命名规则

Bool 变量必须小写b开头

12.控制符类型

指针类型不要设置为 EditAnywhere,所有指针类型的子类都可以被赋值了

13.设置ui可传递数值范围

 

14.物体添加碰撞和物理效果

双击静态网格物体选择collision ,可以选择添加碰撞,当物体添加静态网格后并开启碰撞就有了碰撞功能

启动物理

选择静态网格后,勾选模拟物理,Enable Gravity表示是否启用重力

如果物体悬浮,不启动重力只启动物理不会掉落,但是可以碰撞移动

如果不启动物理,只有碰撞,会被挡住

 

在运行状态下查看碰撞情况

A按下~键 输入 show collision

15.用代码添加力和力矩

力矩可以用来控制旋转

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值