UE4学习-添加机关并添加代码控制
文章目錄
- 添加機(jī)關(guān)
- 代碼編寫
- 給密室添加屋頂
- 打印日志
- 控制系統(tǒng)角色
- 創(chuàng)建一個(gè)新游戲模式替換DefaultPawn
- 添加抓取組件
- 獲取起點(diǎn)和終點(diǎn)
- 物體拾取,碰撞屬性設(shè)置
- 今日完整代碼
添加機(jī)關(guān)
首先向場(chǎng)景里面添加一個(gè)聚光源
添加聚光源以后,可以對(duì)其屬性進(jìn)行修改,如圖:
然后需要給聚光源添加一個(gè)觸發(fā)體積(TriggerVolume)。
然后調(diào)整觸發(fā)體積的大小,按空格進(jìn)行切換模式,移動(dòng)旋轉(zhuǎn)縮放
代碼編寫
所有引入的頭文件都需要放在 #include “openDoor.generated.h” 之前。
定義ATriggerVolume的指針,添加UPROPERTY(EditAnywhere),這樣表示可以在任意地方賦值。
所以可以在界面上進(jìn)行賦值。
賦值如圖:
選中門,然后選中自定義的組件openDoor
編譯完成,會(huì)添加Trigger
然后選中TriggerVolume即可。
劃重點(diǎn):
pawn = GetWorld()->GetFirstPlayerController()->GetPawn(); // 得到defaultPawn
這句代碼不能放到構(gòu)造函數(shù)里面,否則編譯會(huì)造成虛幻的崩潰。
給密室添加屋頂
這里使用玻璃作為屋頂。
添加玻璃,然后使用縮放工具進(jìn)行調(diào)整,蓋滿整個(gè)房間即可。
打印日志
UE4里面日志,使用UE_LOG,第一個(gè)參數(shù)默認(rèn)是LogTemp,第二個(gè)參數(shù)是日志類型,警告是Warning,字符串使用TEXT() 括起來(lái)。
UE_LOG(LogTemp, Warning, TEXT("%s begin openDoor()"), *owner->GetName());
控制系統(tǒng)角色
運(yùn)行,然后F8彈出,能看到一個(gè)DefaultPawn,這個(gè)是系統(tǒng)默認(rèn)角色。
創(chuàng)建一個(gè)新游戲模式替換DefaultPawn
創(chuàng)建以后,指定pawn為剛才創(chuàng)建的對(duì)象。
運(yùn)行,F8,pawn就是我們自定義的pawn了。
添加抓取組件
獲取起點(diǎn)和終點(diǎn)
FVector start;FRotator viewRot;GetWorld()->GetFirstPlayerController()->GetPlayerViewPoint(start, viewRot);FVector end = start + viewRot.Vector() * 100; // 100cmDrawDebugLine(GetWorld(), start, end, FColor(255, 0, 0), false, 0.0f, 0, 10.0f);物體拾取,碰撞屬性設(shè)置
在檢查碰撞的時(shí)候,只檢測(cè)ECollisionChannel::ECC_PhysicsBody類別的物體。
設(shè)置物體屬性:
今日完整代碼
openDoor.h
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Components/ActorComponent.h" #include "openDoor.generated.h"class AActor; class ATriggerVolume; UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) class MYPROJECT_API UopenDoor : public UActorComponent {GENERATED_BODY()public: // Sets default values for this component's propertiesUopenDoor();protected:// Called when the game startsvirtual void BeginPlay() override;public: // Called every framevirtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;void openDoor();void closeDoor();private:AActor* owner;AActor* pawn;UPROPERTY(EditAnywhere)ATriggerVolume* trigger;float openTime = 0.4f;float lastTime = 0.0f; };openDoor.cpp
// Fill out your copyright notice in the Description page of Project Settings.#include "openDoor.h" #include <GameFramework/Actor.h> #include <Engine/TriggerVolume.h> #include <Engine/World.h>// Sets default values for this component's properties UopenDoor::UopenDoor() {// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features// off to improve performance if you don't need them.PrimaryComponentTick.bCanEverTick = true; }// Called when the game starts void UopenDoor::BeginPlay() {Super::BeginPlay();/* openDoor();*/owner = GetOwner();pawn = GetWorld()->GetFirstPlayerController()->GetPawn(); // 得到defaultPawnUE_LOG(LogTemp, Warning, TEXT("%s begin openDoor()"), *owner->GetName()); }// Called every frame void UopenDoor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) {Super::TickComponent(DeltaTime, TickType, ThisTickFunction);if (nullptr != trigger && trigger->IsOverlappingActor(pawn)){openDoor();lastTime = GetWorld()->GetTimeSeconds();}if (GetWorld()->GetTimeSeconds() - lastTime > openTime){closeDoor();} }void UopenDoor::openDoor() {// pitch=y yaw=z roll=x /* FRotator newRotator = FRotator(0, 0, 0);*/FRotator newRotator = FRotator(0, 180, 0);owner->SetActorRotation(newRotator); }void UopenDoor::closeDoor() {// pitch=y yaw=z roll=xFRotator newRotator = FRotator(0, 90, 0);owner->SetActorRotation(newRotator); }grabber.h
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Components/ActorComponent.h" #include "grabber.generated.h"UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) class MYPROJECT_API Ugrabber : public UActorComponent {GENERATED_BODY()public: // Sets default values for this component's propertiesUgrabber();protected:// Called when the game startsvirtual void BeginPlay() override;public: // Called every framevirtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;private:FVector getLineStart();FVector getLineEnd();AActor* lineTrace(); };grabber.cpp
// Fill out your copyright notice in the Description page of Project Settings.#include "grabber.h" #include <Engine/World.h> #include <DrawDebugHelpers.h>// Sets default values for this component's properties Ugrabber::Ugrabber() {// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features// off to improve performance if you don't need them.PrimaryComponentTick.bCanEverTick = true;// ... }// Called when the game starts void Ugrabber::BeginPlay() {Super::BeginPlay();// ...}// Called every frame void Ugrabber::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) {Super::TickComponent(DeltaTime, TickType, ThisTickFunction); }FVector Ugrabber::getLineStart() {// 設(shè)置起點(diǎn)和終點(diǎn),畫射線FVector start;FRotator viewRot;GetWorld()->GetFirstPlayerController()->GetPlayerViewPoint(start, viewRot);return start; }FVector Ugrabber::getLineEnd() {FVector start;FRotator viewRot;GetWorld()->GetFirstPlayerController()->GetPlayerViewPoint(start, viewRot);return start + viewRot.Vector() * 100; // 100cm }AActor* Ugrabber::lineTrace() {// 檢查碰撞FHitResult hit;GetWorld()->LineTraceSingleByObjectType(hit, getLineStart(), getLineEnd(), FCollisionObjectQueryParams(ECollisionChannel::ECC_PhysicsBody),FCollisionQueryParams(FName(TEXT(""), false, GetOwner()));AActor * act = hit.GetActor();if (nullptr != act){UE_LOG(LogTemp, Warning, TEXT(line hit : % s), *act->GetName());}return act; }總結(jié)
以上是生活随笔為你收集整理的UE4学习-添加机关并添加代码控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 学生党福音 Redmi小金刚Note 1
- 下一篇: 深得沃尔沃真传 领克08内饰官图发布:典