UEC++学习之--Debug函数

本文介绍了在UE4游戏引擎中使用C++进行Debug时的两种方法:一是如何通过Output Log打印黄色警告和红色错误信息;二是如何在游戏屏幕上显示自定义信息,包括设置显示时间和字体颜色。

打印到消息日志

首先点击左上角工具栏中的window下开发者工具Developer Tools下的Output log打开消息日日志

   

然后再C++类的BeginPlaye()里输入    

void ATestClass::BeginPlay()
{
	Super::BeginPlay();

	UE_LOG(LogTemp, Warning, TEXT("Hello World!"));
	
}

其中warning代表黄色警告,可以换成红色的Error,TEXT()里面就是你想打印的字符串

   

在屏幕上显示

同样在C++类里的BeginPlay()里

void ATestClass::BeginPlay()
{
	Super::BeginPlay();

	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, TEXT("Hello World"));

}

其中5.0f代表显示时间,FColor::Blue代表字体颜色,TEXT()里写你想打印的信息

 

### 问题分析 在 Unreal Engine C++UEC++)中,非静态成员函数(non-static member function)隐含地接受一个指向当前对象的指针(即 `this` 指针)。因此,若尝试在没有对象实例的情况下调用非静态成员函数,编译器会报错,提示“Access to non-static member without an object argument”。 这种错误通常出现在以下几种情况: - 尝试从静态函数或全局函数中直接调用非静态成员函数,而未通过对象实例。 - 在类外部调用成员函数时未提供对象。 - 使用函数指针或委托时未正确绑定到对象实例。 ### 解决方案 #### 1. 使用对象实例调用非静态成员函数 确保在调用非静态成员函数时,已经创建了类的实例,并通过该实例调用函数: ```cpp AMyCharacter* MyCharacterInstance = GetWorld()->SpawnActor<AMyCharacter>(); MyCharacterInstance->ApplyDamage(); // 正确调用 ``` #### 2. 使用 `UObject` 派生类的静态方法作为中转 如果必须从静态上下文中调用非静态函数,可以通过传入对象指针来间接调用: ```cpp UCLASS() class MYPROJECT_API AMyCharacter : public ACharacter { GENERATED_BODY() public: UFUNCTION(BlueprintCallable, Category = "Combat") void ApplyDamage(float DamageAmount = 10.0f); UFUNCTION(BlueprintCallable, Category = "Combat") static void StaticApplyDamage(AMyCharacter* Character, float DamageAmount = 10.0f) { if (Character) { Character->ApplyDamage(DamageAmount); } } }; ``` 调用方式如下: ```cpp AMyCharacter* MyCharacterInstance = GetWorld()->SpawnActor<AMyCharacter>(); AMyCharacter::StaticApplyDamage(MyCharacterInstance, 20.0f); ``` #### 3. 使用 `TDelegate` 或 `TFunction` 绑定对象和函数 UE 提供了委托系统,可以将函数与对象绑定,适用于事件驱动或回调机制: ```cpp DECLARE_DYNAMIC_DELEGATE_OneParam(FDamageDelegate, float, DamageAmount); UCLASS() class MYPROJECT_API AMyCharacter : public ACharacter { GENERATED_BODY() public: UPROPERTY(BlueprintAssignable, Category = "Combat") FDamageDelegate OnApplyDamage; UFUNCTION(BlueprintCallable, Category = "Combat") void ApplyDamage(float DamageAmount = 10.0f) { UE_LOG(LogTemp, Warning, TEXT("Applying damage: %f"), DamageAmount); OnApplyDamage.Broadcast(DamageAmount); } }; ``` 在其他类中绑定并调用: ```cpp AMyCharacter* MyCharacterInstance = GetWorld()->SpawnActor<AMyCharacter>(); MyCharacterInstance->OnApplyDamage.AddDynamic(this, &AMyOtherActor::HandleDamage); ``` #### 4. 避免在蓝图中错误调用非静态函数函数标记为 `UFUNCTION(BlueprintCallable)`,确保在蓝图中调用时连接了正确的对象引脚。蓝图系统会自动处理对象绑定,但如果引脚未连接或为 `None`,则会触发运行时错误。 ### 注意事项 - 非静态成员函数必须通过对象调用,否则将导致访问错误[^1]。 - 使用静态函数作为中转时,需确保传入的对象指针有效,避免空指针异常。 - 委托机制适用于事件通知,但需注意生命周期管理,防止悬空引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值