【虚幻C++笔记】打印输出的方式

UE_LOG

UE_LOG 宏是UnrealEngine 中用于日志记录的标准方式。它可以输出日志信息到控制台和日志文件,支持多种日志级别(如Log,Warning,Error")
UE_LOG(LogCategory, LogVerbosity, Format, ...)
void AMyActor::BeginPlay()
{
    Super::BeginPlay();

    // LogTemp : 临时日志,不会保存到文件中
    // Warning : 警告日志,黄色 记录级别
    // TEXT : 打印内容
    // 日志级别常用三种:Display、Warning、Error
    UE_LOG(LogTemp, Display, TEXT("Hello World!"));
    UE_LOG(LogTemp, Warning, TEXT("Hello World!"));
    UE_LOG(LogTemp, Error, TEXT("Hello World!"));
    
    //基础数据类型的输出打印
    int32 MyInt=10;
    float MyF1oat=5.0f;
    bool MyBool=true;
    char MyChar=’A';
    FString MyStringl=TEXT("MyStringl");
    FVector MyVector=FVector(0,0,0);
    //打印
    UE_LOG(LogTemp,Warning,TEXT("%d"),MyInt);
    UE_LOG(LogTemp,Warning,TEXT("%f"),MyF1oat);
    UE_LOG(LogTemp,Warning,TEXT("%d"),MyBoo1);
    UE_LOG(LogTemp,Warning, TEXT("%c"),MyChar);
    UE_LOG(LogTemp,Warning,TEXT("%s"),*MyString1);
    UE_LOG(LogTemp,Warning,TEXT("%s"),*MyVector.ToString());

}

GEngine->AddOnScreenDebugMessage

GEngine->AddOnScreenDebugMessage可以在游戏屏幕上显示调试信息,通常用于快速查看和调试。
GEngine->AddOnScreenDebugMessage(Key, TimeToDisplay, Color, Message)
void AMyActor::BeginPlay()
{
  Super::BeginPlay();

  GEngine->AddOnScreenDebugMessage(-1, 5, FColor::MakeRandomColor(), FString(TEXT("Hello C++")));
}
<think>首先,用户的问题是:“我想查找在虚幻引擎的C++中使用TimeLine的方法 请问在虚幻引擎的C++里使用TimeLine的方法”。根据系统指令,我需要使用中文回答,并确保格式正确。 用户提供了引用内容: - 引用[1]: 解释了Timeline是什么,并提到如何创建一个Timeline(但在蓝图上下文)。 - 引用[2]: 标题是“虚幻学习笔记19—C++中使用时间轴”,包含创建时间轴变量的代码段。 - 引用[3]: 讨论了从蓝图转向C++的时机,涉及性能优化等。 - 引用[4]: 更详细地描述了在C++中使用时间轴组件Timeline,包括委托绑定等代码。 - 引用[5]: 是关于UE5开发游戏的入门指南。 用户的问题聚焦于在C++中使用TimeLine的方法,因此我应该主要参考引用[2]和[4],因为它们直接涉及C++。 关键点从引用中提取: - 从引用[2]: 它展示了在C++类中创建时间轴变量。代码片段包括添加头文件和创建FTimerHandle变量。 - 从引用[4]: 它提供了更全面的步骤: - 绑定委托:使用BindUFunction绑定函数到时间轴事件。 - 添加Float曲线:使用AddInterpFloat。 - 设置时间轴的属性,如播放速率和循环。 - 在BeginPlay中进行绑定。 系统指令要求: - 所有行内数学表达式用$...$格式(但这里可能不涉及数学)。 - 独立公式用$$...$$格式(同样,不适用)。 - LaTeX语法正确(但回答是中文,代码块处理)。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 回答结构: - 我应该清晰、逐步地解释方法。 - 引用相关部分时,添加引用标识。 - 最后,生成相关问题。 大纲回答: 1. **介绍TimeLine**: 简要解释TimeLine在UE中的作用,参考引用[1]。 2. **在C++中使用TimeLine的步骤**: - 创建时间轴变量(参考引用[2])。 - 在代码中初始化时间轴(参考引用[4])。 - 绑定委托到事件(如Play、Finished)。 - 添加曲线并设置属性。 - 启动和控制时间轴。 3. **代码示例**: 提供代码块,展示如何在C++中实现。 4. **注意事项**: 如性能优化(参考引用[3])。 5. **结尾**: 总结。 6. **生成相关问题**. 确保代码块格式正确:使用三重反引号指定语言。 从引用[2]和[4]整合代码: - 引用[2]: `#include "TimerManager.h"` and `FTimerHandle Time;` - 引用[4]: Binding delegates, AddInterpFloat, etc. 完整步骤: 1. 在C++类中定义时间轴变量。 2. 在BeginPlay中进行委托绑定。 3. 添加曲线并设置回调函数。 4. 控制时间轴播放。 代码示例: ```cpp #include "TimerManager.h" #include "Curves/CurveFloat.h" // 可能需要用于曲线 // 在头文件中声明 FTimeline MyTimelineComponent; // 或类似,但UE中通常使用UTimelineComponent // 实际上,Unreal Engine中,时间轴通常作为组件或变量处理。引用[4]提到"MyTimelineComponent",可能是UTimelineComponent指针。 // 引用[4]代码:TimelinePlay_Delegate.BindUFunction(this,TEXT("FunHua_TimelinePlay")); ``` 更准确地说,引用[4]显示使用的是委托绑定。 标准方法: - 创建UTimelineComponent或使用FTimeline(但FTimeline可能已弃用?在UE4/5中,推荐使用UTimelineComponent)。 - 参考文档,但基于引用,我应该遵循提供的内容。 从引用[4]: - 添加Float曲线:`MyTimelineComponent->AddInterpFloat(MyCurveFloat, TimelinePlay_Delegate);` - 设置结束事件:`MyTimelineComponent->SetTimelineFinishedFunc(TimelineFinished_Delegate);` - 设置速率和循环。 所以,在C++中: - 定义一个UTimelineComponent指针。 - 在构造函数或BeginPlay中初始化。 - 绑定委托。 回答步骤: 1. 包含必要头文件:例如 `#include "Components/TimelineComponent.h"`(标准UE头文件)。 2. 在类中声明时间轴组件。 3. 在BeginPlay中绑定委托和设置曲线。 4. 定义回调函数。 添加引用标识: - 当提到创建时间轴时,引用[^1]或[^4]。 - 引用[^2] for C++ usage. - 引用[^3] for performance considerations. 最终响应结构: - 引言:TimeLine是什么(参考引用[1])。 - 详细步骤(参考引用[2]和[4])。 - 代码示例。 - 注意事项(参考引用[3])。 - 相关问题。 生成相关问题: - 基于主题,如优化、常见错误等。 </think>以下是针对您查询“在虚幻引擎的C++中使用TimeLine的方法”的详细解答。TimeLine(时间轴)是虚幻引擎(Unreal Engine, UE)中处理时间序列动画的核心工具,它通过关键帧驱动属性变化(如位置、旋转或材质属性),适用于平滑过渡效果[^1]。在C++中使用TimeLine比蓝图更灵活,并能优化性能(尤其在高频Tick逻辑中)[^3]。我将基于引用内容,逐步解释实现方法,确保代码符合UE规范(以UE5为例,但适用于UE4/5)。 ### 步骤1: 创建时间和声明变量C++中使用TimeLine,首先需要在类中定义时间轴组件和相关变量。这通常在头文件(.h)中完成。 - **包含必要头文件**: 使用`#include "Components/TimelineComponent.h"`访问时间轴组件。 - **声明时间轴变量**: 定义一个`UTimelineComponent`指针和委托变量(用于事件绑定)。 - **声明曲线资产**: 时间轴依赖曲线(如`UCurveFloat`)来定义属性变化,这些曲线需在UE编辑器中创建并引用。 示例头文件代码(例如在`MyActor.h`中): ```cpp #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "Components/TimelineComponent.h" // 时间轴组件头文件[^2][^4] #include "MyActor.generated.h" // 自动生成的头文件 UCLASS() class MYPROJECT_API AMyActor : public AActor { GENERATED_BODY() public: AMyActor(); // 构造函数 protected: virtual void BeginPlay() override; // 重写BeginPlay函数 private: UPROPERTY() // 确保垃圾回收 UTimelineComponent* MyTimelineComponent; // 时间轴组件指针[^2][^4] FOnTimelineFloat TimelinePlay_Delegate; // 浮点曲线播放委托 FOnTimelineEvent TimelineFinished_Delegate; // 时间轴结束委托 UPROPERTY(EditAnywhere, Category = "Timeline") UCurveFloat* MyCurveFloat; // 曲线资产引用,可在编辑器中设置[^4] UFUNCTION() void FunHua_TimelinePlay(float Value); // 时间轴播放时的回调函数 UFUNCTION() void FunHua_TimelineFinished(); // 时间轴结束时的回调函数 }; ``` ### 步骤2: 初始化和绑定委托 在源文件(.cpp)的`BeginPlay`中进行时间轴初始化、委托绑定和曲线设置。这是核心步骤,确保时间轴事件正确触发[^4]。 - **创建时间轴组件**: 在构造函数中实例化。 - **绑定委托到函数**: 使用`BindUFunction`将委托链接到回调函数。 - **添加曲线和设置属性**: 通过`AddInterpFloat`添加浮点曲线,并配置播放速率、循环等。 示例源文件代码(例如在`MyActor.cpp`中): ```cpp #include "MyActor.h" #include "TimerManager.h" // 定时器头文件(用于时间相关操作)[^2] AMyActor::AMyActor() { PrimaryActorTick.bCanEverTick = true; // 允许Tick MyTimelineComponent = CreateDefaultSubobject<UTimelineComponent>(TEXT("TimelineComponent")); // 创建时间轴组件[^2] } void AMyActor::BeginPlay() { Super::BeginPlay(); if (MyTimelineComponent && MyCurveFloat) // 安全检查 { // 绑定播放委托 TimelinePlay_Delegate.BindUFunction(this, TEXT("FunHua_TimelinePlay")); // 绑定到回调函数[^4] // 绑定结束委托 TimelineFinished_Delegate.BindUFunction(this, TEXT("FunHua_TimelineFinished")); // 绑定结束事件[^4] // 添加Float曲线并关联委托 MyTimelineComponent->AddInterpFloat(MyCurveFloat, TimelinePlay_Delegate); // 曲线变化时触发FunHua_TimelinePlay[^4] // 设置结束事件 MyTimelineComponent->SetTimelineFinishedFunc(TimelineFinished_Delegate); // 时间轴结束时触发FunHua_TimelineFinished[^4] // 配置时间轴属性 MyTimelineComponent->SetPlayRate(1.0f); // 设置播放速率(例如1.0为正常速度)[^4] MyTimelineComponent->SetLooping(false); // 是否循环播放[^4] // 启动时间轴(可在此处或通过其他事件触发) MyTimelineComponent->PlayFromStart(); // 从头开始播放 } } // 回调函数实现 void AMyActor::FunHua_TimelinePlay(float Value) { // 在这里处理时间轴播放时的逻辑,Value是曲线值(0.0到1.0) // 例如,驱动位置变化: SetActorLocation(FVector(Value * 100, 0, 0)); UE_LOG(LogTemp, Log, TEXT("Timeline Playing: Value=%f"), Value); // 日志输出 } void AMyActor::FunHua_TimelineFinished() { // 时间轴结束时的逻辑 UE_LOG(LogTemp, Log, TEXT("Timeline Finished")); // 日志输出 } ``` ### 步骤3: 控制时间轴 在运行时,可以通过代码控制时间轴的播放、暂停或反转: - **播放控制**: 使用`Play()`, `Stop()`, `Reverse()`等方法。 - **动态修改**: 在Tick事件中更新曲线值或速率(避免高频操作以防性能问题)。 示例控制代码: ```cpp // 在类中添加公共函数 void AMyActor::StartTimeline() { if (MyTimelineComponent) { MyTimelineComponent->Play(); // 播放时间轴 } } void AMyActor::PauseTimeline() { if (MyTimelineComponent) { MyTimelineComponent->Stop(); // 暂停时间轴 } } ``` ### 注意事项和最佳实践 - **性能优化**: 在Tick中频繁执行的复杂逻辑建议用C++实现(而非蓝图),以减少开销[^3]。时间轴本身较高效,但回调函数应避免繁重计算。 - **曲线创建**: 在UE编辑器中创建`CurveFloat`资产(通过Content Browser > Add/Import > Curve),并在C++类中引用。 - **错误处理**: 添加空指针检查(如`if (MyTimelineComponent)`),防止崩溃。 - **调试**: 使用UE的调试工具监视时间轴状态,或在回调中添加日志。 - **适用场景**: TimeLine适合动画序列(如开门效果、UI渐变),但对于实时物理模拟,优先考虑其他组件(如PhysicsHandle)。 通过以上步骤,您可以在C++中高效使用TimeLine。如果您是UE新手,建议从蓝图入门再过渡到C++开发[^3][^5]。 ### 相关问题 1. 如何优化虚幻引擎中TimeLine的性能以避免卡顿? 2. 在C++中使用TimeLine时,如何处理曲线资产的外部加载和动态修改? 3. TimeLine与虚幻引擎的其他动画系统(如Animation Blueprint)有什么区别和适用场景? [^1]: Timeline 是 Unreal Engine 中的一种用于处理时间序列的工具... 如何创建一个 Timeline。 [^2]: 虚幻学习笔记19—C++中使用时间轴... 添加头文件然后创建时间轴变量。 [^3]: 当您发现某个蓝图逻辑... 成为性能瓶颈时,您就可以用C++重写它。 [^4]: BeginPlay中进行时间轴事件的绑定... 添加Float曲线。 [^5]: 在PC机上使用虚幻引擎5(UE5)开发第一款游戏的完整入门指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值