UE_C++ 笔记 (一)
// 日志消息
UE_LOG
是将日志消息输出到日志文件中的宏。它采用的第一个输入参数是日志记录类别的名称。引擎中已经内置了许多这些类别,在 CoreGlobals.h 中定义。
UE_LOG(LogTemp, Warning, TEXT("Hello"));
含FString参数的消息格式化
UE_LOG(LogTemp, Warning, TEXT("The Actor's name is %s"), *YourActor->GetName());
// 设置Actor的旋转
SetActorRotation有两种方式
bool AActor::SetActorRotation(FRotator NewRotation)
bool AActor::SetActorRotation(const FQuat & NewRotation)
这里用第一种。注意下面的代码,利用了一个vector (0,90,0)进行构造,这里对应的不是X ,Y ,Z轴 ,而是 Pitch ,Roll ,Yaw
AActor* Owner = GetOwner(); FRotator NewRotation = FRotator(0.f, 90.f, 0.f); Owner->SetActorRotation(NewRotation);
Pitch:沿着Y轴旋转;
Roll:沿着X轴旋转;
Yaw:沿着Z轴旋转;
// 获取游戏开始以来经过的时间
float time = UWorld::GetTimeSeconds();
// LineTraceSingleByObjectType
// Get player view point this tick FVector PlayerViewPointLocation; FRotator PlayerViewPointRotation; GetWorld()->GetFirstPlayerController()->GetPlayerViewPoint(OUT PlayerViewPointLocation,OUT PlayerViewPointRotation); // ray-cast out to reach distance FVector LineTraceEnd = PlayerViewPointLocation + PlayerViewPointRotation.Vector()* Reach; FCollisionQueryParams TraceParameters(FName(TEXT("")), false, GetOwner()); // ignore owner //line trace FHitResult Hit; GetWorld()->LineTraceSingleByObjectType( OUT Hit, PlayerViewPointLocation, LineTraceEnd, FCollisionObjectQueryParams(ECollisionChannel::ECC_PhysicsBody), TraceParameters ); // see what we hit AActor* ActorHit = Hit.GetActor(); if (ActorHit) { UE_LOG(LogTemp, Warning, TEXT("Actor Hit:%s"), *ActorHit->GetName()); }
// InputComponent 开关
在学Unreal的课程 虚拟引擎C++游戏开发全面教程的时候,P85,教程中的UE版本在运行的时候能看到 PAWN的InputComponent , 我在使用UE4.27ThirdPersonCharactor场景的时候,看不到这个component,后来把下面图中的Auto Poses 和Auto Receive Input 设置成default pawn BP后,虽然运行的时候还是看不到 PAWN的InputComponent ,但是在BeginPlay里面能看到InputComponent 了
// UE4 代理
DECLARE_DELEGATE //普通代理 DECLARE_DYNAMIC_DELEGATE_TwoParams //动态代理 DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams //动态多广播代理 //多出的两个关键字的作用 In the case of multicast delegates, any number of entities within your code base can respond to the same event and receive the inputs and use them. In the case of dynamic delegates, the delegate can be saved/loaded within a Blueprint graph (they're called Events/Event Dispatcher in BP).
DYNAMIC:可以在蓝图里被序列化后定义和绑定操作。
MULTICAST:可实现一个事件类型多函数广播(事件类型必须声明为蓝图类型)
XXXParams:(使用DYNAMIC时)参数个数,宏定义参数里一个参数类型对应一个参数名字。
案例:使用代理完成c++和蓝图的通信
先在opendoor.h利用宏声明一个代理类 FOnOpenRequest
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnOpenRequest);
然后在类opendoor.h里面,定义一个FOnOpenRequest对象,并声明它的UPROPERTY属性 BlueprintAssignable(在蓝图中可绑定委托,Property should be exposed for assigning in blueprints)
然后在,opendoor.cpp里面,我们可以注释掉对物体旋转的那行代码,而是调用OnOpenRequest对象,进行广播
void Uopendoor::OpenDoor() { //Owner->SetActorRotation(FRotator(0, OpenAngle, 0)); OnOpenRequest.Broadcast(); }
最后,在蓝图中,利用c++中的广播,就可以完成对物体的旋转
选中opendoor,右键,点击Add On Open Request
实现旋转
// 低模怎么去掉默认的Smooth(光滑)显示
UE4中默认会对模型的法线Smooth,比如建了一个低模地形,图一,给一个默认材质,图二
N法线Smooth了,如果就是想要一个低模的显示,需要材质里面计算原本的没有smooth的法线