UE4C++]学习源码的小总结

UnrealEngin C++ 读取源码

[toc]

常用库

UGameplayStatics

获取

  • GetPlayerController
  • GetPlayerCharacter
  • GetPlayerPawn
  • GetPlayerCameraManager
  • GetGameInstance
  • GetGameMode
  • GetGameState

生成

  • SpawnObject
  • SpawnSound2D
  • SpawnEmitterAttached
  • SpawnDecalAtLocation

打开关卡

  • OpenLevel
  • APlayerController::ClientTravel

说明符

属性UPROPERTY

可见性、编辑性、对蓝图的设定

  • Category="主目录名|次目录名" 蓝图中把些名一样的变量集中在一起
  • VisibleDefaultsOnly
  • BlueprintAssignable 当前属性为动态多播委托

方法UFUNCTION

  • BlueprintCallable c++ 实现,蓝图调用
  • BlueprintImplementableEvent 蓝图实现,c++ 调用
  • BlueprintNativeEvent c++ 与蓝图都实现,c++ 实现要加后缀Implementation

类UCLASS

  • BlueprintType 表示其他类能定义这个类类型的蓝图变量
  • Blueprintable 表示能在编辑器中创建这个类的蓝图子类

Exec 这个函数可以在控制台里调用,一般在GameInstanceGameMode之类的类里使用会有效果,其他自建的类有提示但无效果
除非你重写GIGMProcessConsoleExec

// GameInstance.cpp中
// 重写ProcessConsoleExec
bool XXX::ProcessConsoleExec(const TCHAR* Cmd, FOutputDevice& Ar, UObject* Executor)
{
    bool Res = Super::ProcessConsoleExec(Cmd, Ar, Executor);
    if(!Res)
    {
        for(TActorIterator<ClassType> It(GetWorld()); It; ++It){
            Res = It->ProcessConsoleExec(Cmd, Ar, Executor);
        }
    }
    return Res;
}

元属性 限定对象属性mate

主要是给蓝图中使用的,格式如下:
meta = (xxx , yyy = bbb )

常用内容:

  • MetaClass = "Actor" ,表示这个变量类型为Actor

  • DisplayName = "AllowEdit" ,表示在蓝图中显示的名字

  • ToolTip = "I am a ToolTip" , 表示指针悬停在变量上时的小信息提示内容

  • ClampMin = 10, 表示最小值

  • ClampMax = 100, 表示最大值

  • BindWidget , 在Widget中的控件变量名与,当前c++的变量名一样就能使用。

  • BindWidgetAnim , 同上只是用于动画名称,配合UWidgetAnimation* 变量类型,而且在需要添加Transient属性,具体参见下方实例

  • EditCondition = "" 控制当前变量是否可编辑

    • EditCondition = "bool类型变量",填入一个带有UPROPERTY属性的bool类型变量,只有当这个bool变量为true时,当前变量才可编辑
    • EditCondition = "枚举类型==具体枚举",填入一个带有UENUM属性的enum类型变量,只有当这个enum变量为对应的枚举时,当前变量才可编辑
    • EditCondition = "条件表达式",填入一个条件表达式,比如Health<30
  • AllowedClasses="Texture" 当前变量选择类型时确定为指定的名称的类型

UPROPERTY(Meta = (BindWidget))
UButton* ButtonTwo;
// 动画变量
UPROPERTY(Transient, meta=(BindWidgetAnim))
UWidgetAnimation* HoverEnterAni;

基于UObject类的指针

  • 对象的引用
    蓝图里为Object Reference
    使用蓝色来表示。
    C++中对应UObject* 场景中实际存在的对象实例的指针,硬连接

  • 类型的引用
    蓝图里为Class Reference
    使用紫色来表示。
    C++中对应TSubclassOf<UObject> 对象类的引用,允许使用类型安全传递UClass模板

  • 对象的软引用
    蓝图里为Object Reference
    使用天蓝色来表示。
    C++中对应TSoftObjectPtr<UObojct> 对象的软引用,需要的时候再加载

  • 类型的软引用
    蓝图里为Class Reference
    使用粉红来表示。
    C++中对应TSoftClassPtr<UObject> 对象类的软引用,需要的时候再加载

  • 资源的引用
    C++中对应TAssetPtr<UObject> 资源的引用,是对FStringAssetReference的封装,包含对象路径与对象的弱指针TWakeObjectPtr

  • 资源路径的引用
    C++中对应结构体FStringAssetReference对象路径的引用,不用区分类型。
    这个可以引用所有的类,如果想指定引用,需要加下边的meat修饰符
    4.18开始,使用下边替代原来的结构体
    FSoftObjectPath -> FStringAssetReference
    FSoftClassPath -> FStringClassReference

UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (MetaClass = "Actor"))
FStringAssetReference AssetRef;

// .h
#if WITH_EDITOR
    virtual void XXX::PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override;
#endif

// .cpp
#if WITH_EDITOR
void XXX::PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent)
{
    Super::PostEditChangeProperty(PropertyChangedEvent);
    if(PropertyChangedEvent.Property && PropertyChangedEvent.Property->GetFName() == GET_MEMBER_NAME_CHECKED(类名,变量名))
    {
        // 进行操作比如
        变量 += 10;
    }
}
#endif

评论