虚幻4学习之路·初探(20190407)
门的旋转
-
C++组件基本解析 (门在游戏开始时被打开)
以下代码完成了在游戏开始时门被打开 既 旋转角度被设置为Rotator(0,90,0).
#include " Game Frame work/Actor.h //引用游戏框架
UOpenDoor::UOpenDoor(){} //设置Actor的初始化状态
void UOpenDoor::BeginPlay(){ // 游戏开始时调用
AActor* actor = GetOwner(); //得到所在的Actor
//设置这个Actor的属性
FRotator newRotator = FRotator(0,90,0);//pitch=y yaw=z roll=x
actor->SetActorRotation(newRotator);//需要传递一个FRotator的数据
}
注意需要将组建设置为 “可移动” 此代码才会有效。
-
Pitch Yaw Roll 的概念 ←原文连接
-
代码优化
1,添加私有成员,并声明OpenDoor CloseDoor 函数
OpenDoor.h 添加私有成员
Private:
AActor* Owner;
public:
void OpenDoor();
void CloseDoor();
#include " Game Frame work/Actor.h //引用游戏框架
2,在初始化的时候获取到Actor
UOpenDoor::UOpenDoor(){ //设置Actor的初始化状态
Owner=GetOwner(); //在初始化的时候获取到Actor
}
3,最后在游戏开始时对Actor进行设置
void UOpenDoor::BeginPlay()
{
Super::BeginPlay();
//设置Actor
OpenDoor();//调用OpenDoor函数
}
4,实现OpenDoor函数
void UOpenDoor::OpenDoor()
{
//设置Actor
FRotator newrotator = FRotator(0, 90, 0);
Owner->SetActorRotation(newrotator);
}
5,实现CloseDoor函数
void UOpenDoor::CloseDoor()
{
//设置Actor
FRotator newrotator = FRotator(0, 0, 0);
Owner->SetActorRotation(newrotator);
}
Trigger Volume 体积触发器
声明TriggerVolume 和 DefaultPawn
UPROPERTY(EditAnywhere) 以及拖拽赋值的用法
private:
UPROPERTY(EditAnywhere) //使TriggerVolume可以拖拽赋值
ATriggerVolume* TriggerVolume; //需要引入TriggerVolume头文件
AActor* DefaultPawn;
- 引入TriggerVolume头文件
#include "Engine/TriggerVolume.h"
对DefaultPawn进行赋值。
DefaultPawn = GetWorld()->GetFirstPlayerController()->GetPawn(); //需要引入World头文件
- 引入World头文件
#include "Engine/World.h"
判断体积触发器里(Trigger Volume)是否存在DefaultPawn
if (TriggerVolume->IsOverlappingActor(DefaultPawn))
{
OpenDoor();
}
给门添加一个离开后延迟一秒关闭
void UOpenDoor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{//这个函数每帧会被调用一次
if (TriggerVolume!=nullptr && TriggerVolume->IsOverlappingActor(DefaultPawn))
{
OpenDoor();
LastOpenDoorTime = GetWorld()->GetTimeSeconds();
}
当前游戏时间 - 门被打开时的时间 > 1
即 离开 体积触发体积后1s调用CloseDoor();关闭门
if(GetWorld()->GetTimeSeconds()- LastOpenDoorTime>1)
{
CloseDoor();
}
}
输出日志
UE_LOG(LogTemp, Warning, TEXT("OpenDoor"));