学习ue4的一些笔记记录 之前也有写过点,这里做个汇总,顺便补上漏记得东东,持续更新…… 这里以 MyTest 项目名说明。
视频教程集合官方编码标准包含头文件的一些规则配置默认的GameModeGameInstanceMap等多人游戏的关卡切换暴露给蓝图的规则SceneComponent启动游戏添加参数解析创建 uPRoject的 vs2013解决方案 xxxsln文件C动态加载即替换character的 skeletal mesh 和 anim blueprintC中加载一个蓝图类BlueprintFunctionLibrary中指定默认参数C动态调用蓝图方法CallFunctionByNameWithArguments根据str调用到蓝图中对应得方法没有Ufunction好用继承FTickableGameObject实现每帧Tick国际化任何要显示到屏幕上的文字都要用FText因为它带有国际化功能整形暴露给蓝图只能使用 int32stdstring 和 TCHAR 之间的互转Blueprint中用代码spawn的actor使用自定义的AIControllerC声明方法但不实现蓝图负责实现C调用Blueprint的另一种实现已经形参引用或const传递C 与 蓝图 交互的 参数传递 及 多返回值C 声明方法且实现蓝图重写添加一个时间轴- 利用时间轴做线性插值蓝图接口的使用自定一个继承自ActorCompoment的组件暴露在编辑器中只是用来做展示的Mesh需要取消掉碰撞不然会和其他Actor产生碰撞子弹每帧修改朝向速度需要保持不变方向需要归一化行为树中的几种节点ServiceDecoratorTask的初始化方法行为树中的几种节点ServiceDecoratorTask的每帧tick模型导入控制台执行 关卡事件设置 Windows 打包的分辨率及相关设置
包含引擎类。如果需要扩展或使用引擎类,都在项目模块的预编译头文件 MyTest.h 中包含进来。自己创建的头文件都会包含这个 MyTest.h 头文件。
#ifndef __MYTEST_H__#define __MYTEST_H__#include "EngineMinimal.h"#include "EngineGlobals.h"#include "Engine/Engine.h"#include "GameFramework/GameMode.h"包含自己创建的类。
头文件 MyGameMode.h 中的自动生成的头文件 MyGameMode.generated.h 一定要放在最后包含
#pragma once//#include "MyUtil.h"#include "MyGameMode.generated.h"UCLASS()class MYTEST_API AMyGameMode : public AGameModecpp文件 中一定要先包含预编译头文件 MyTest.h 和对应的头文件 MyGameMode.h,在包含其他头文件
#include "MyTest.h"#include "MyGameMode.h"//#include "MyUtil.h"AMyGameMode::AMyGameMode() : Super()官网教程
class类,在类的头上加上标记 Blueprintable 和 Blueprintable
UCLASS(Blueprintable, BlueprintType)class MYTEST_API UCoolDownComp : public UActorComponentBlueprintable:可在新建一个蓝图类时继承c++类,显示在可继承列表中BlueprintType:这个c++类可作为一个类型选择,显示在类型选择中enum枚举,加上 BlueprintType 即可,一般不用来继承使用
UENUM(BlueprintType)enum class CharState : uint8 //动画状态{xxx.exe -MyFlagPresent 1
,获取到这个 MyFlagPresent 的值为 1参考文章: https://answers.unrealengine.com/questions/123559/can-we-make-command-line-arguments.htmlhttps://docs.unrealengine.com/latest/INT/Programming/Basics/CommandLineArguments/index.html I:/UnrealEngine_4.10/Engine/Binaries/DotNET>UnrealBuildTool.exe -projectfiles -project="F:/workplace_ue4/ShooterGame_4.10/data/ShooterGame.uproject" -game -rocket -progress -2013
两者必须在同一帧同时替换,因为一个模型对应一个动画
bool UMyBpFuncLib::TestChangeCharAnimInstance(AMyChar* _myChar, FString _pathMesh, FString _pathAnim){ FStreamableManager* stream = new FStreamableManager(); FStringAssetReference ref1(*_pathMesh); USkeletalMesh* TmpMesh = Cast<USkeletalMesh>(stream->SynchronousLoad(ref1)); _myChar->GetMesh()->SetSkeletalMesh(TmpMesh); FStringAssetReference ref2(*_pathAnim); UAnimBlueprint* TmpMeshAnim = Cast<UAnimBlueprint>(stream->SynchronousLoad(ref2)); _myChar->GetMesh()->SetAnimInstanceClass((UClass*)TmpMeshAnim->GetAnimBlueprintGeneratedClass()); delete stream; return true;}真相_path = /Game/TopDownCPP/Blueprints/MyChar/MyCharBP
UObject* AMyText::TestLoadBPObject(FString _path){ auto cls = StaticLoadObject(UObject::StaticClass(), nullptr, *_path); if (!cls) { //GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Failed to load UClass ")); return nullptr; } else { //GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("UClass LOADED!!!!")); UBlueprint* bp = Cast<UBlueprint>(cls); if (!bp) { //GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Failed to load UClass 2 ")); } else { //GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("UClass LOADED!!!! 2 " + bp->GetName())); TSubclassOf<class UObject> MyItemBlueprint; MyItemBlueprint = (UClass*)bp->GeneratedClass; UWorld* const World = GWorld->GetWorld(); if (World){ FActorSpawnParameters SpawnParams; //SpawnParams.Instigator = this; UObject* DroppedItem = World->SpawnActor<UObject>(MyItemBlueprint, GetActorLocation(), { 0, 0, 0 }, SpawnParams); } } return cls; }}
- 转换WorldContextObject为Uworld
(只能传递string 和 int 两种类型参数)
CallFunctionByNameWithArguments 是 Uobject 的方法,所以只要是继承自Uobject的类都可以使用
需要重写几个纯虚函数
UCLASS()class UCoolDownMgr : public UObject, public FTickableGameObject, public USingleton<UCoolDownMgr>{ GENERATED_BODY()public: // Sets default values for this character's properties UCoolDownMgr(); virtual ~UCoolDownMgr(); // Begin FTickableGameObject Interface. virtual void Tick(float DeltaTime) override; virtual bool IsTickable() const override; virtual TStatId GetStatId() const override; // End FTickableGameObject Interface.};/// This function is designed to be overridden by a blueprint. Do not provide a body for this function in C++; 不要给BlueprintImplementableEvent声明的方法提供c++方法实现,由蓝图实现
C++定义,并声明 BlueprintImplementableEvent
UFUNCTION(BlueprintImplementableEvent) void CountDownHasFinished();蓝图实现:
如果形参是fstring,就必须是引用类型,一般不需要蓝图修改的都加const,需要修改的就加引用声明
不需要蓝图修改cpp UFUNCTION(BlueprintImplementableEvent, Category = "MyBehavior") void OnDeath(const FString& _str, int32 _num);
需要蓝图修改 cpp UFUNCTION(BlueprintImplementableEvent, Category = "MyBehavior") void OnDeath(UPARAM(ref) FString& _str, int32 _num);
c++ 返回 多个值 给蓝图
如果需要返回多个值,就不需要再c++中 return,使用 形参引用 就行。
UFUNCTION(BlueprintCallable, Category = "UMyGameInstance") void MyMerge(AActor* PlayerPawn, TArray<USkeletalMesh*> SrcMeshList, AActor*& retActor, USkeletalMeshComponent*& retSkeletalComp);/// This function is designed to be overridden by a blueprint, but also has a native implementation. /// Provide a body named [FunctionName]_Implementation instead of [FunctionName]; the autogenerated /// code will include a thunk that calls the implementation method when necessary.
BlueprintNativeEvent,
C++声明、实现
UFUNCTION(BlueprintNativeEvent) void CountDownHasFinished(); virtual void CountDownHasFinished_Implementation(); void AMyText::CountDownHasFinished_Implementation() { ... }蓝图实现重写
右键添加
编辑时间轴,双击MovementTimeline
平滑曲线
判断时间轴是否播放中
新建一接口蓝图
添加接口
使用接口
->
重写父类这两个方法
virtual void OnInstanceCreated(UBehaviorTreeComponent& OwnerComp) override;virtual void OnInstanceDestroyed(UBehaviorTreeComponent& OwnerComp) override;因为有些数据不能再类的构造方法中初始化,涉及到引擎必须用引擎提供的 初始化方法,如:
void UBTDecorateMyBase::OnInstanceCreated(UBehaviorTreeComponent& OwnerComp){ //初始化成员都放在这个方法 if (!mOwnerChar) mOwnerChar = GetMyChar(); if (!mBTComp) mBTComp = &OwnerComp;}需要打开父类UBTAuxiliaryNode的开关,构造里默认设置为false
/** if set, OnTick will be used */uint8 bNotifyTick : 1;需要在子类中的构造中把这个开关打开
UBTDecorateMyBase::UBTDecorateMyBase() : Super(){ //设置tick 开关 bNotifyTick = true;}关卡中新建个自定义时间 moveCube
控制执行这个事件,输入命令:ce moveCube
如果在 ./Config/DefaultGameUserSettings.ini 不存在,这新建一个或者从 ./Saved/Config/Windows/GameUserSettings.ini 拷贝一份命名为 DefaultGameUserSettings.ini,保留自己想要的配置部分
[/Script/Engine.GameUserSettings]bUseVSync=TrueResolutionSizeX=700ResolutionSizeY=400LastUserConfirmedResolutionSizeX=700LastUserConfirmedResolutionSizeY=400WindowPosX=-1WindowPosY=-1bUseDesktopResolutionForFullscreen=FalseFullscreenMode=2LastConfirmedFullscreenMode=2Version=5参考:
具体参数参照文档 https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/GameFramework/UGameUserSettings/index.html或者参照源码 UGameUserSettingshttps://answers.unrealengine.com/questions/112766/how-to-set-the-default-packaged-window-sizeship-mo.html新闻热点
疑难解答