首先把這一期的資源導(dǎo)入一下
站在用戶的角度思考問題,與客戶深入溝通,找到北辰網(wǎng)站設(shè)計與北辰網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋北辰地區(qū)。創(chuàng)建一個球體類,繼承于pawn類
為其添加靜態(tài)組件
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
class UStaticMeshComponent * MeshComponent;
==================================================================
#include "Components/StaticMeshComponent.h"
MeshComponent = CreateDefaultSubobject(TEXT("MeshComponent"));
RootComponent = MeshComponent;
編譯,為其創(chuàng)建藍(lán)圖類
為其組件設(shè)為一個球體
拖到場景中,發(fā)現(xiàn)太大了
我們?yōu)槠鋭?chuàng)建一個小球網(wǎng)格體模型
首先創(chuàng)建一個文件夾
我們把這個小球網(wǎng)格體復(fù)制到我們這個文件夾下面
重命名一下這個網(wǎng)格體
進(jìn)入這個網(wǎng)格體,修改一下比例
在類中換上這個網(wǎng)格體
shift+end讓其緊貼地面
然后創(chuàng)建材質(zhì)文件
先將材質(zhì)設(shè)為白色
在網(wǎng)格體中賦予材質(zhì)
把導(dǎo)航體拖入場景中
然后我們拉大體積,讓其覆蓋整個地面
然后讓其嵌入到地板底下
按一下p,就可以顯示導(dǎo)航的范圍
我們可以看到,球體本身也會影響導(dǎo)航
小球mesh組件里面,去掉這個勾
我們?yōu)檫@個小球,寫藍(lán)圖
然后為我們的小球隨便添加一個移動組件
編譯,測試,小球開局真的動了?
現(xiàn)在我們將移動邏輯寫的更復(fù)雜一點(diǎn)
將移動速度變小,發(fā)現(xiàn)小球一直在我們屁股后面追
====================================
我們繼續(xù)提高邏輯,讓其自動添加路徑
首先自定義事件
測試,已經(jīng)畫出了路徑點(diǎn)
在c++文件中加上這個
在小球頭文件中,添加三個變量
//移動速度
UPROPERTY(EditDefaultsOnly, Category = "TracerBot")
float MovementForce;
//是否讓移動速度改變
UPROPERTY(EditDefaultsOnly, Category = "TracerBot")
bool bUseVelocityChange;
//移動到目標(biāo)的閾值
UPROPERTY(EditDefaultsOnly, Category = "TracerBot")
float RequiredDistanceToTarget;
在構(gòu)造函數(shù)中初始化這三個變量,并將mesh組件的模擬物理激活
AASTrackerBot::AASTrackerBot()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
MeshComponent = CreateDefaultSubobject(TEXT("MeshComponent"));
MeshComponent->SetSimulatePhysics(true);
RootComponent = MeshComponent;
MovementForce = 1000;
bUseVelocityChange = false;
RequiredDistanceToTarget = 100;
}
在小球的頭文件中,添加尋找路徑點(diǎn)的函數(shù),和路徑點(diǎn)變量
FVector GetNextPathPoint();
//路徑點(diǎn)
FVector NextPathPoint;
#include "Components/StaticMeshComponent.h"
#include "GameFramework/Character.h"
#include"Kismet/GamePlayStatics.h"
#include "NavigationSystem.h"
#include "NavigationPath.h"
#include "DrawDebugHelpers.h"
定義這個函數(shù)
FVector AASTrackerBot::GetNextPathPoint()
{
//得到0號玩家
ACharacter *playerPawn = UGameplayStatics::GetPlayerCharacter(this, 0);
//找到通往玩家的路徑
UNavigationPath *NavPath = UNavigationSystemV1::FindPathToActorSynchronously(this, GetActorLocation(), playerPawn);
if (NavPath->PathPoints.Num() >1)
{
//返回第二個點(diǎn)
return NavPath->PathPoints[1];
}
else
{
return GetActorLocation();
}
}
在游戲開始函數(shù)中,調(diào)用這個函數(shù)
void AASTrackerBot::BeginPlay()
{
Super::BeginPlay();
NextPathPoint = GetNextPathPoint();
}
在每幀函數(shù)里,不斷得去移動
void AASTrackerBot::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
//得到小球自身與下一個點(diǎn)的距離
float DistanceToTarget = (NextPathPoint - GetActorLocation()).Size();
//如果大于閾值,就繼續(xù)滾
if (DistanceToTarget >RequiredDistanceToTarget)
{
//小球的移動方向
FVector ForceDirection = NextPathPoint - GetActorLocation();
ForceDirection.Normalize();
//小球的推力
ForceDirection *= MovementForce;
MeshComponent->ComponentVelocity.Size();
MeshComponent->AddImpulse(ForceDirection, NAME_None, bUseVelocityChange);
DrawDebugDirectionalArrow(GetWorld(), GetActorLocation(), GetActorLocation() + ForceDirection, 32, FColor::Red, false, 0.0f, 0, 1.0f);
}
//如果到達(dá)了路徑點(diǎn),就生成下一個點(diǎn),繼續(xù)移動
else
{
NextPathPoint = GetNextPathPoint();
DrawDebugString(GetWorld(), GetActorLocation(), "Target Reached!");
}
//在下一個目標(biāo)點(diǎn)畫一個球
DrawDebugSphere(GetWorld(), NextPathPoint, 20, 12, FColor::Yellow, false, 0.0f, 0, 1.0f);
}
編譯,然后在小球的mesh組件里面,勾上模擬物理
測試成功
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧