Unreal Engine 基础
文章平均质量分 81
主要讲解Unreal Engine基础性,入门性知识。
虎牙维护世界和平
一只爱好交互设计的小闹斧
展开
-
基于C++代码的UE4学习(十四)—— 判断类是否实现了接口类
沿用(十三)中的类文件。在GAMEMODEBASE文件中新增BeginPlay方法。 1 #include "CoreMinimal.h" 2 #include "GameFramework/GameModeBase.h" 3 #include "MyProject7_INTERFACEGameModeBase.generated.h" 4 5 /** 6 * 7 */ 8 UCLASS() 9 class MYPROJECT7_INTERFACE_API AM...原创 2020-08-27 08:55:22 · 569 阅读 · 0 评论 -
基于C++代码的UE4学习(十九)—— 深入接口
之前说过,UE4没有特定的像JAVA一样的interface接口类。通过虚基类完成继承和方法的重写。但是,UE4定义的接口类有一套固定的用法,这种用法对你的操作行为进行了限定,但对C++的本质并不影响。1.接口中的函数需要用如下宏定义进行限定:UFUNCTION(BlueprintNativeEvent,BlueprintCallabe,Category = "Interface")BlueprintNativeEvent是将该方法进行了限定,在C++和蓝图中都可以重写,且该方法有返...原创 2020-08-26 14:04:39 · 702 阅读 · 0 评论 -
基于C++代码的UE4学习(五十一)——在PlayerController中进行控制
在Pawn和Character里都带有父类的SetupPlayerInputComponent方法进行控制器的操纵。更优化的写法是将这些内容写在PlayerController中去。不同的是,要重写SetupInputComponent方法。且需要用到固定的指针InputComponent,并将其CreateDefaultSubobject。用自定义的指针,且不把InputComponent指针初始化,都会导致程序崩溃。创建一个PlayerController。...原创 2020-08-27 08:56:49 · 2519 阅读 · 2 评论 -
基于C++代码的UE4学习(五十)——坦克类的完整代码
头文件1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "GameFramework/Pawn.h" 7 #include "UObject/ConstructorHelpers.h" 8 #include "Particles/ParticleSys...原创 2020-08-27 08:56:40 · 1355 阅读 · 0 评论 -
基于C++代码的UE4学习(四十九)——坦克炮弹类的完整代码
基于C++代码的UE4学习(四十九)——坦克炮弹类的完整代码头文件:1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "GameFramework/Actor.h" 7 #include "UObject/ConstructorHelpers.h".原创 2020-08-27 08:56:26 · 398 阅读 · 0 评论 -
基于C++代码的UE4学习(四十八)——为炮弹添加UProjectileMovementComponent组件
要想要炮弹可以发射出去,需要用到UProjectileMovementComponent组件。在头文件中添加如下代码:声明一个UProjectileMovementComponent组件对象指针。1 UPROPERTY(EditAnywhere, BlueprintReadWrite)2 class UProjectileMovementComponent* moves;在构造函数中1 AMissle::AMissle()2 {3 4 ...原创 2020-08-27 08:56:11 · 1527 阅读 · 0 评论 -
基于C++代码的UE4学习(四十七)——为坦克开火的炮弹添加碰撞代理事件
本节主要是解决当炮弹打中物体后所发生的事情。1 FScriptDelegate delegates;2 3 UFUNCTION()4 void OnHits(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);自定义一个OnHits函数,用来处理...原创 2020-08-26 14:22:57 · 517 阅读 · 0 评论 -
基于C++代码的UE4学习(四十六)——为坦克开火添加声音系统
声音播放涉及两种方式,一种是直接播放Wave,一种是通过cue进行播放。先讲解第一种,直接播放音频文件(必须为Wave)。USoundWave* fireSound; 添加在头文件中。在源文件中加载声音资源。1 auto fireSoundAsset = ConstructorHelpers::FObjectFinder<USoundWave>(TEXT("SoundWave'/Game/BP/fireSound.fireSound'"));2 i...原创 2020-08-26 14:02:15 · 925 阅读 · 0 评论 -
基于C++代码的UE4学习(四十五)——为坦克开火添加粒子系统
需要用到UParticleSystemComponent。先在头文件中添加如下代码:1 UPROPERTY(EditAnywhere, BlueprintReadWrite)2 class UParticleSystemComponent* fire;在源文件中添加如下代码: 1 fire = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("fire")); 2 ...原创 2020-08-26 14:02:35 · 617 阅读 · 0 评论 -
基于C++代码的UE4学习(四十四)——将鼠标坐标变为三维坐标
需要用到DeprojectScreenPositionToWorld()方法,这个方法与GetViewportSize一样,只能在PlayerController里使用。新建一个PlayerController 1 void AMyPlayerController::setAll() { 2 3 int32 viewx; 4 int32 viewy; 5 GetViewportSize(viewx,viewy); 6 7 ...原创 2020-08-26 14:03:20 · 1275 阅读 · 0 评论 -
基于C++代码的UE4学习(四十三)——获取画布的信息
这里牵扯到两个东西,一个是HUD,一个是PlayerController。新建一个PlayerController的C++文件,并设置在GameModeBas中。1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "GameFramework/Pl...原创 2020-08-26 14:03:55 · 380 阅读 · 0 评论 -
基于C++代码的UE4学习(四十二)——TSharedPtr结合按键事件
先准备好一个GameModeBase。1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "GameFramework/GameModeBase.h" 7 #include "SlateBasics.h" 8 #include "ClickGame...原创 2020-08-26 14:04:03 · 1155 阅读 · 0 评论 -
基于C++代码的UE4学习(四十一)——TSharedPtr结合Timer与Lambda函数创建隐藏/显示UI
同样,需要在Build.cs文件中解除slate\slateCore那行注释。新建一个GAME MODE BASE,头文件如下: 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "GameFramework/GameModeBase.h" 7...原创 2020-08-26 14:04:15 · 670 阅读 · 0 评论 -
基于C++代码的UE4学习(四十)——为玩家角色添加噪音
之前在AI中添加了听觉功能,还需要在主角中添加噪音,本例中完成当玩家角色跳跃的时候,产生噪音,从而可以被AI听见。在Character头文件上加入以下代码。1 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Emitter)2 class UPawnNoiseEmitterComponent* Emitter;在源文件中增加Jump_S方法,并将其替换。调用MakeN...原创 2020-08-26 14:04:22 · 347 阅读 · 0 评论 -
基于C++代码的UE4学习(三十九)——为AI增加感官(视觉与听觉)
为AI增加感官(视觉与听觉)需要用到UPawnSensingComponent,需要引入头文件#include "Perception/PawnSensingComponent.h"在Enemy类中增加感官组件,并增加两个FSciptDelegate,用于后面代理视觉与听觉的方法。1 FScriptDelegate SightDelegate;2 FScriptDelegate HearDelegate;3 4 UPROPERTY(VisibleAnywhere...原创 2020-08-25 11:30:52 · 999 阅读 · 0 评论 -
基于C++代码的UE4学习(三十八)——加载SkeletalMesh与静态加载动画蓝图
加载SkeletalMesh需要在Enemy类中定义一个SkeletalMeshComponent由于Enemy类是继承自ACharacter类的,所以SkeletalMesh找到的办法是通过FindComponentByClass<T>();并没有重新声明一个新的。 1 skeletal = this->FindComponentByClass<USkeletalMeshComponent>(); 2 if (skeletal) {...原创 2020-08-25 11:30:30 · 4054 阅读 · 0 评论 -
基于C++代码的UE4学习(三十七)——用Slate Widget创建HUD
先定义一个Game Mode Base,并在构造函数中初始化PlayerController类的实例。PlayerController是介于游戏角色与玩家之间的控制器,桥梁作用。创建一个自定义的PlayerController类。 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 ...原创 2020-08-25 11:30:20 · 641 阅读 · 0 评论 -
基于C++代码的UE4学习(三十六)——用Canvas创建HUD
首先自定义一个GameMode。(在此之前不要忘了进入xx.Build.cs文件中,把带有Slate,SlateCore模块的语句进行启用) 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "GameFramework/GameModeBase.h" ...原创 2020-08-25 11:30:06 · 778 阅读 · 0 评论 -
基于C++代码的UE4学习(三十五)——创建BTTask任务
在(三十四)的基础上,我们再增添一个功能,让AI来跟随控制器控制的PAWN。创建一个TaskBlackBoardBase类,是基于黑板数据的任务类。 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "BehaviorTre...原创 2020-08-25 11:29:48 · 987 阅读 · 2 评论 -
基于C++代码的UE4学习(三十四)——创建BTService任务
BTService用于行为树中黑板数据的设置及刷新。在创新建BTService任务之前,需要对项目工程中的Build.cs文件进行设置,添加两个模块。添加后,编译项目,重启Editor。此时BTService类才可以正常创建。此节仅展示BTService代码,其他代码查看(三十三)。创建BTService,起一个名字即可。这里起名BTService_FindPlayer 1 // Fill out your cop...原创 2020-08-25 11:29:39 · 936 阅读 · 0 评论 -
基于C++代码的UE4学习(三十三)——创建Blackboard和BehaviorTree
对于创建AI,需要两个东西,一个是BehaviorTree,一个是Blackboard。BehaviorTree是管理AI行为的,例如寻找、攻击、行走等,Blackboard是管理数据的,例如AI的目标,行走范围,速度等。首先创建这两个对象。起两个好记的名字即可。打开行为树(BehaviorTree),加载Blackboard。再选择到Blackboard上,创建一个变量,取名为Target,变量类型为Object,base设置为Acto...原创 2020-08-25 11:29:28 · 1047 阅读 · 0 评论 -
基于C++代码的UE4学习(三十二)——创建追向PAWN的物体
首先构造物体 1 #include "FollowActor.h" 2 3 // Sets default values 4 AFollowActor::AFollowActor() 5 { 6 // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. 7 PrimaryActorTic...原创 2020-08-25 11:29:06 · 398 阅读 · 0 评论 -
基于C++代码的UE4学习(三十一)——创建的自己的资源文件
首先创建一个继承自UObject类的类,起名为UserAsset。 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h"10 #include "UObject/NoExportTypes.h"11 #include "UserAsset.generated.h"12 ...原创 2020-08-25 11:28:56 · 434 阅读 · 0 评论 -
基于C++代码的UE4学习(三十)——蓝图的Construction Script与TIMER结合的控制Cube显现
这一节需要从三部分来讲,先讲解第一部分。Construction与构造函数之间的关系。构造函数是C++中的,Construction是蓝图中的,暂且理解为蓝图中的构造函数。***但是,它们还是有区别的,Construction在C++中调用可以更改在构造函数中赋值好的属性值。先定义一个ACTOR类,头文件内容如下,加粗的内容之前都学习过,这里不再赘述: 1 #include "CoreMinimal.h" 2 #include "GameFramework/Actor.h"...原创 2020-08-24 11:24:59 · 1595 阅读 · 0 评论 -
基于C++代码的UE4学习(二十九)——因属性改变而引发的事件
如题,当一个类中的属性发生了改变,从而引发的事件。这里我们定义一个属性show,当这个属性发生改变的时候,引发了模型的visibility事件。virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;由父类继承而来,专门处理属性改变的事件。 1 // Fill out your copyright notice in the Description pa...原创 2020-08-24 11:25:50 · 1331 阅读 · 0 评论 -
基于C++代码的UE4学习(二十八)——枚举类与结构体
先说枚举类,概念不进行解释。1 UENUM(BlueprintType)2 enum Tree {3 Tree_1,4 Tree_2,5 Tree_3,6 Tree_4,7 Tree_58 };1 AMyActor::AMyActor() {2 mode = Tree_3; //将Tree_3设置为默认值3 4 FString s = FString::Printf(TEXT("the enum tre...原创 2020-08-24 11:26:06 · 477 阅读 · 0 评论 -
基于C++代码的UE4学习(二十七)——带参数的多播动态代理II
在(二十六)中的动态多播代理我并不是很喜欢,想改成就在C++中完成的方式。所以这节我们活学活用,将(二十六)中的动态多播代理改成带一个参数的多播代理。要知道的是,带参数的多播代理是可以带参数的,哪怕只代理一个。只要是用到多播,就是AddUObject和Broadcast。KING文件没变,只是修改了宏定义。1 // Fill out your copyright notice in the Description page of Project Settings. 2 ...原创 2020-08-24 11:26:18 · 1369 阅读 · 0 评论 -
基于C++代码的UE4学习(二十六)——带参数的多播动态代理I
多播代理之前讲到过FParamMulticastDelegateSignature,实际这些名字可以自己命名,主要在宏声明上。以前声明一个多播代理是通过DECLARE_MULTICAST_DELEGATE_OneParam(FTestDelegateSignature)完成的。然后再声明一个FDelegateHandle对象进行中介处理。这一次是来完成动态的多播代理。需要改变一下宏定义:DECLARE_DYNAMIC_MULTICAST_DELEGATE(FtestdelegateSi...原创 2020-08-24 11:26:33 · 1012 阅读 · 0 评论 -
基于C++代码的UE4学习(二十五)——将自定义类的函数在世界蓝图中调用
这里使用的是ACTOR类,做成一扇门,在世界里打开。新建一个ACTOR类,改名为Door,头文件如下:1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "Engine/StaticMeshActor.h" 7 #include "UObject...原创 2020-08-24 11:26:48 · 718 阅读 · 0 评论 -
基于C++代码的UE4学习(二十四)——将C++类的对象设定为可参数化
顾名思义,就是让你的C++类的对象可以被当做参数向别的类中进行传递。首先我们创建一个Object类,该类不可以被实例化。 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "UObject/NoExportTypes.h" 7 #include "...原创 2020-08-24 11:27:00 · 258 阅读 · 0 评论 -
基于C++代码的UE4学习(二十三)——利用接口来完成应答Cube
目的是PAWN触碰到一个ACTOR时候,触发的接口重写的函数。实现由两种方法。第一种方法:以应答机触碰为主先定义一个接口类: 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "UObject/Interface.h" 7 #include "M...原创 2020-08-24 11:28:16 · 430 阅读 · 0 评论 -
基于C++代码的UE4学习(二十二)——在关卡蓝图中实现C++接口的重写
上一节,我们将C++的接口在蓝图中进行了实现。这一节我们将C++的接口在蓝图中进行重写。准备一下接口文件:1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "UObject/Interface.h" 7 #include "MyInterf...原创 2020-08-24 11:28:30 · 581 阅读 · 0 评论 -
基于C++代码的UE4学习(二十一)——在关卡蓝图中实现C++的接口
这一节来说,相对容易,在蓝图中把C++类的接口进行实现。首先在C++中创建接口,并定义一个方法showinfo,返回值类型为bool,意思是函数,不是事件。UFUNCTION的宏定义改变成BlueprintImplementableEvent,意思为蓝图可实现的事件。 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 ...原创 2020-08-23 09:41:48 · 825 阅读 · 0 评论 -
基于C++代码的UE4学习(二十)——在关卡蓝图中调用对象的接口方法
沿用(十九)的代码,在世界中创建一个Door的对象点击它,进入世界蓝图(关卡蓝图),创建其引用。搜索之前接口中的方法。这里我对方法名字进行了改变,功能是没有改的。这样就完成了对象实现接口方法后在关卡蓝图中的调用。...原创 2020-08-23 09:42:00 · 395 阅读 · 0 评论 -
基于C++代码的UE4学习(十八)—— 接口的继承II
为了说明UE4中的接口是父类的继承关系。在(十七)的基础上,我们稍作修改。1.在ACTOR中增加一个自定义函数getAll();2.删除从接口类获得并重写的方法。3.直接调用IReborn类和IKill类中的方法,这些方法其实就是继承自父类的方法。也就是说ACTOR类实现的是多次单继承。1 void AMyActor::getAll() {2 IReborn::reborn();3 IReborn::Kill(); 4 IKill::Kill(); ...原创 2020-08-23 09:43:03 · 417 阅读 · 0 评论 -
基于C++代码的UE4学习(十七)—— 接口的继承
因为C++并没有所谓的接口概念,在UE4中的接口其实是虚基类的单继承或多继承的概念。先创建一个接口(虚基类),只写一个KILL方法。1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "UObject/Interface.h" 7 #include "...原创 2020-08-23 09:42:52 · 1021 阅读 · 0 评论 -
基于C++代码的UE4学习(十六)—— 接口的应用
这次试用接口来进行实操。我们这次完成对一个实现了接口的ACTOR类的对象进行物理属性的开启与关闭。先定义一个接口类。定义两个纯虚函数,用作开灯与关灯。 1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "UObject/Interface.h" ...原创 2020-08-23 09:43:21 · 430 阅读 · 0 评论 -
基于C++代码的UE4学习(十五)—— 将实现了接口类的ACTOR类进行类型转换
将实现了接口类的ACTOR类进行类型转换,将其转换为接口类。沿用之前的(十三、十四)工程。在GAMEBASE的头文件里新增如下代码:1 TArray<IMyInterface*>actorlist;在GAMEBASE源文件里的代码: 1 // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved. 2 3 4 #include "MyProject7_INTERFACEGameMod...原创 2020-08-23 09:43:32 · 786 阅读 · 0 评论 -
基于C++代码的UE4学习(十三)—— 接口类
在C++中并没有所谓JAVA的interface接口。只是通常使用虚基类,纯虚函数达到类似功能。UE4中提供了一个接口类来达到该功能。以下是新建的接口类的头文件代码,源文件代码是空的,并没有什么内容。 1 UINTERFACE(MinimalAPI) 2 class UMyInterface : public UInterface 3 { 4 GENERATED_BODY() 5 }; 6 7 /** 8 * 9 */10 ...原创 2020-08-23 09:43:57 · 483 阅读 · 2 评论 -
基于C++代码的UE4学习(十二)—— 创建UserWidget(2)
在上一例子中,创建一个Widget还需要通过一个Actor类对象,在运行程序之前还得把它拖入世界关卡中,实在是太麻烦了。能不能让这个UI的出现是通过按键绑定弹出?就如同我们玩游戏的效果一样?这一例子中进行尝试。还是利用《创建UserWidget(1)》中的UI蓝图,创建一个新的Character类。第一步,先进行按键绑定,我想用shit+q来呼出UI界面。第二步,进行代码上的绑定。Character类的头文件代码: 1 // Fill out ...原创 2020-08-22 09:15:39 · 2214 阅读 · 0 评论