虚幻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的数据
} 	

注意需要将组建设置为 “可移动” 此代码才会有效。

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"));