虛幻4C++學(xué)習(xí)文檔翻譯4_第1頁
虛幻4C++學(xué)習(xí)文檔翻譯4_第2頁
虛幻4C++學(xué)習(xí)文檔翻譯4_第3頁
虛幻4C++學(xué)習(xí)文檔翻譯4_第4頁
虛幻4C++學(xué)習(xí)文檔翻譯4_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Chapter8-3創(chuàng)建一個繼承自GameMode父類,其名稱為GameModeGameModeMyUse在藍(lán)圖中創(chuàng)建繼承自GameModeMyUse的藍(lán)圖類GameModeMyUse同時在默認(rèn)的Pawn中選擇 BP_Avatar這個角色,也就是我們之前所新建的角色最后打開世界設(shè)置,在默認(rèn)的游戲模式GameMode中選取我們自己創(chuàng)建的藍(lán)圖類GameModeMyUse,那么再次運行游戲時效果如下:與此同時,我們也發(fā)現(xiàn)我們無法操控人物行動,那是因為我們沒有綁定人物的控制按鍵打開項目設(shè)置,選擇input選項最終達(dá)到這樣效果,從這些按鍵綁定中可以看到由于有初學(xué)者的案例加入進(jìn)來,所有綁定的按鍵很多。那我

2、們先不用管其他已經(jīng)有的按鍵綁定,我們先添加自己的按鍵MyMoveForward和MyMoveRight用W和D的按鍵來操作人物前和右方向行走。但是僅僅按鍵綁定人物還并不能移動。我們需要添加C+代碼來操控使得人物可以行走打開VS的編譯器,在我們初始創(chuàng)建過的Avatar.h的頭文件中我們修改如下/ 綁定用戶輸入操作virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;/向右移動void MoveRight(float amount);/向前移動void MoveForward(f

3、loat amount);截圖如下頭文件定義好之后,我們需要在源文件中將功能具體實現(xiàn)/ 綁定用戶按鍵輸入操作void AAvatar:SetupPlayerInputComponent(class UInputComponent* InputComponent)Super:SetupPlayerInputComponent(InputComponent);/綁定項目設(shè)置中按鍵與頭文件中函數(shù)功能InputComponent->BindAxis("MyMoveForward", this, &AAvatar:MoveForward);InputComponent-

4、>BindAxis("MyMoveRight", this, &AAvatar:MoveRight);從這一段綁定用戶按鍵輸入操作我們可以看出來,我們將項目設(shè)置中的按鍵名稱與我們的函數(shù)功能名稱進(jìn)行再一次的綁定void AAvatar:MoveRight(float amount)/若控制器和移動的數(shù)值都存在if (Controller && amount)/獲取右轉(zhuǎn)三維向量FVector right = GetActorRightVector();/將移動輸入的大小添加到玩家前進(jìn)向量之中AddMovementInput(right, amoun

5、t);這兩段我們通過調(diào)用虛幻內(nèi)置的API使得玩家可以操控前進(jìn)和右轉(zhuǎn)。那么對于左轉(zhuǎn)和后退來說,我們可以在項目設(shè)置中重新以上面的方式再次綁定兩個按鍵操作,或者添加兩個其他按鍵并將scale設(shè)置為-1當(dāng)然我們不能僅僅只控制前后左右的移動,我們還需要設(shè)置鼠標(biāo)的旋轉(zhuǎn)和傾斜我們在項目設(shè)置中新添加MyYaw 和 MyPitch 兩個輸入按鍵操作綁定用戶操作內(nèi)容更新如下void AAvatar:Yaw(float amount)AddControllerYawInput(200.f*amount*GetWorld()->GetDeltaSeconds();void AAvatar:Pitch(float

6、 amount)AddControllerPitchInput(200.f*amount*GetWorld()->GetDeltaSeconds();這是新添加的對旋轉(zhuǎn)效果的功能添加,本質(zhì)上還是調(diào)用API,比較方便功能的實現(xiàn)以上基本實現(xiàn)了玩家簡單控制人物的效果,當(dāng)然現(xiàn)在測試起來人行動的并不自然這和我們自帶的第三人稱效果還有一定的差距創(chuàng)建非玩家實體 Create None-player character entity NPC這個創(chuàng)建方式和創(chuàng)建我們自身控制的角色類型相同,同樣也是從添加C+代碼到項目中選擇Character 作為父類進(jìn)行繼承我們希望這個NPC可以告訴玩家一些信息,那么我們將

7、會使用到FString,FString 是用來代替C+的STL函數(shù)庫中string的,他有良好的跨平臺的特性,所以在UE4中使用C+進(jìn)行編程我們需要使用字符串類型的話就用FString好了。/作為NPC的實體碰撞器UPROPERTY(VisibleAnywhere,BlueprintReadOnly, Category = "Collision")TSubobjectPtr<class USphereComponent>ProxSphere;/NPC所需要傳遞的話UPROPERTY(EditAnywhere, BlueprintReadWrite, Catego

8、ry = "NPCMessage")FString NPCMessage;添加在NPC的頭文件中在這之后在UE4編輯器中添加繼承自該類的藍(lán)圖類。注:本人在測試此部分時,如果在頭文件中加入實體碰撞器會出現(xiàn)Crash的情況,報錯說需要初始化,有可能是我使用的是4.7版本更新,而教材書籍僅僅是老版本,所以我最后將創(chuàng)建碰撞器這句話去掉,在創(chuàng)建出藍(lán)圖實體后是依然會有碰撞體的,最后我們加上mesh,給NPC的message附上信息,放入場景之中。創(chuàng)建和NPC的對話窗體我們需要創(chuàng)建一個繼承自HUD的類UCLASS()class CPLUSLEARN_API AMyHUDMessage :

9、 public AHUDGENERATED_BODY()public :UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HUDFont)UFont *hudFont;virtual void DrawHUD() override;void AMyHUDMessage:DrawHUD()Super:DrawHUD();DrawLine(200, 300, 400, 500, FLinearColor:Blue);DrawText("歡迎來到虛幻的世界!", FVector2D(0, 0), hudFont, FVe

10、ctor2D(1, 1), FColor:White);我們在自己的HUD的類中定義了一個字體,并且在界面上繪出一個線框和文字重新編譯項目,我們進(jìn)入UE4中,創(chuàng)建一個繼承自MyHUD的藍(lán)圖類,同時設(shè)置我們自己的字體信息。最后在我們的游戲模式中將默認(rèn)的HUD改成我們自己創(chuàng)建的HUD下面我們要用一個一個列表來存放這些對話的信息,我們打開自己創(chuàng)建的C+的HUD類void AMyHUDMessage:DrawHUD()Super:DrawHUD();/DrawLine(200, 300, 400, 500, FLinearColor:Blue);/DrawText("hello",

11、 FVector2D(0, 0), hudFont, FVector2D(1, 1), FColor:White);for (int c = messages.Num() - 1; c >= 0; c-)float outputWidth, outputHeight, pad = 10.f;/定義輸出的寬度高度和間隔/獲取出信息內(nèi)容大小GetTextSize(messagesc.message, outputWidth, outputHeight, hudFont, 1.f);float messageH = outputHeight + 2.f*pad;/信息的高度就是輸出高度+2倍的

12、間隔float x = 0.f, y = c*messageH;/繪制出背景DrawRect(FLinearColor:Black, x, y, Canvas->SizeX, messageH);/使用字體繪制出我們的信息(信息,顏色,寬度+邊距,高度+邊距,字體)DrawText(messagesc.message, messagesc.color, x + pad, y + pad, hudFont);/時間逐步縮減messagesc.time -=GetWorld()->GetDeltaSeconds();/當(dāng)該條消息的時間小于0的時候?qū)⒃摋l信息移除if (messagesc

13、.time < 0)messages.RemoveAt(c);void AMyHUDMessage:addMessage(Message msg)messages.Add(msg);下面我們必須要完成我們的NPC實體UCLASS()class CPLUSLEARN_API ANonePlayerEntity : public ACharacterGENERATED_UCLASS_BODY()public:/ Sets default values for this character's propertiesANonePlayerEntity();/ Called when th

14、e game starts or when spawnedvirtual void BeginPlay() override;/ Called every framevirtual void Tick( float DeltaSeconds ) override;/ Called to bind functionality to inputvirtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;/NPC所需要傳遞的話UPROPERTY(EditAnywhere, Bluepri

15、ntReadWrite, Category = NPCMessage)FString NPCMessage;/碰撞器觸發(fā)器UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Collision)TSubobjectPtr<class USphereComponent> ProxSphere;/碰撞事件UFUNCTION(BlueprintNativeEvent, Category = "Collision")void Prox(AActor* otherActor, UPrimitiveCompone

16、nt* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);這個是我們自己的NPC類的頭文件,我們新添加了碰撞檢測事件,里面的參數(shù)都是固定的API的參數(shù),指定是Collision類別的碰撞器才會觸發(fā)這個碰撞事件ANonePlayerEntity:ANonePlayerEntity(const class FPostConstructInitializeProperties &PCIP) :Super(PCIP) / Set this character to call

17、 Tick() every frame. You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;ProxSphere = PCIP.CreateDefaultSubobject<USphereComponent>(this, TEXT("Proximity Sphere");/放置在根節(jié)點下面ProxSphere->AttachTo(RootComponent);/設(shè)置碰撞半徑ProxSphere-

18、>SetSphereRadius(32.f);/當(dāng)有人進(jìn)去碰撞區(qū)域ProxSphere->OnComponentBeginOverlap.AddDynamic(this, &ANonePlayerEntity:Prox);NPCMessage = "Hi , i am Owner"/設(shè)置默認(rèn)的NOC對話/ Called when the game starts or when spawnedvoid ANonePlayerEntity:BeginPlay()Super:BeginPlay();/ Called every framevoid ANoneP

19、layerEntity:Tick( float DeltaTime )Super:Tick( DeltaTime );/ Called to bind functionality to inputvoid ANonePlayerEntity:SetupPlayerInputComponent(class UInputComponent* InputComponent)Super:SetupPlayerInputComponent(InputComponent);void ANonePlayerEntity:Prox_Implementation(AActor * otherActor, UPr

20、imitiveComponent* othrComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)/碰撞發(fā)生事情,當(dāng)有交互時/將其他玩家進(jìn)入該區(qū)域轉(zhuǎn)化為avatar,如果是空物體的,那么直接返回if (Cast<AAvatar>(otherActor) = nullptr)return;/獲取當(dāng)前控制者APlayerController* PController = GetWorld()->GetFirstPlayerController();/如果控制者存在if (PC

21、ontroller)/將當(dāng)前控制者的HUD轉(zhuǎn)化為我們自己定義的HUD類AMyHUDMessage *hud = Cast<AMyHUDMessage>(PController->GetHUD();/添加NPC信息進(jìn)入當(dāng)前控制者的HUD對象中hud->addMessage(Message(NPCMessage, 5.f, FColor:White);對于源文件中的功能我上面已經(jīng)寫有非常詳細(xì)的注釋了。最后效果是每當(dāng)我們的人物碰撞時都會有默認(rèn)的一個消息顯示在我們的屏幕上方,過我們默認(rèn)的時間后會自動銷毀。那么最后我們來完善一下我們的整個消息/創(chuàng)建一個完整信息的結(jié)構(gòu)體struct

22、 Message FString message;float time;FColor color;UTexture2D *tex;Message()time = 5.f;color = FColor:White;Message(FString iMessage, float iTime, FColor iColor, UTexture2D* iTex)message = iMessage;time = iTime;color = iColor;tex = iTex;修改消息結(jié)構(gòu)體,我們需要給每個對話的人一個頭像。源文件中添加這句/繪制出背景DrawRect(FLinearColor:Black

23、, x, y, Canvas->SizeX, messageH);在NPC的頭文件中添加/NPC的名稱UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = NPCMessage)FString name;/NPC圖片UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = NPCMessage)UTexture2D* Face;NPC的源文件中修改void ANonePlayerEntity:Prox_Implementation(AActor * otherActor, UPri

24、mitiveComponent* othrComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)/碰撞發(fā)生事情,當(dāng)有交互時/將其他玩家進(jìn)入該區(qū)域轉(zhuǎn)化為avatar,如果是空物體的,那么直接返回if (Cast<AAvatar>(otherActor) = nullptr)return;/獲取當(dāng)前控制者APlayerController* PController = GetWorld()->GetFirstPlayerController();/如果控制者存在if (PCo

25、ntroller)/將當(dāng)前控制者的HUD轉(zhuǎn)化為我們自己定義的HUD類AMyHUDMessage *hud = Cast<AMyHUDMessage>(PController->GetHUD();/添加NPC信息進(jìn)入當(dāng)前控制者的HUD對象中hud->addMessage(Message(name+FString(": ")+NPCMessage, 5.f, FColor:White,Face);最后的效果如下圖所示:那么NPC的簡單對話之所就基本完成了最后我們希望添加給用戶一個生命值的效果首先我們需要在avatar中定義生命當(dāng)前數(shù)值和最大數(shù)值UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HPInformation)float HP;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HPInformation)float MA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論