




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Chapter8-3創(chuàng)建一個(gè)繼承自GameMode父類,其名稱為GameModeGameModeMyUse在藍(lán)圖中創(chuàng)建繼承自GameModeMyUse的藍(lán)圖類GameModeMyUse同時(shí)在默認(rèn)的Pawn中選擇 BP_Avatar這個(gè)角色,也就是我們之前所新建的角色最后打開世界設(shè)置,在默認(rèn)的游戲模式GameMode中選取我們自己創(chuàng)建的藍(lán)圖類GameModeMyUse,那么再次運(yùn)行游戲時(shí)效果如下:與此同時(shí),我們也發(fā)現(xiàn)我們無法操控人物行動(dòng),那是因?yàn)槲覀儧]有綁定人物的控制按鍵打開項(xiàng)目設(shè)置,選擇input選項(xiàng)最終達(dá)到這樣效果,從這些按鍵綁定中可以看到由于有初學(xué)者的案例加入進(jìn)來,所有綁定的按鍵很多。那我
2、們先不用管其他已經(jīng)有的按鍵綁定,我們先添加自己的按鍵MyMoveForward和MyMoveRight用W和D的按鍵來操作人物前和右方向行走。但是僅僅按鍵綁定人物還并不能移動(dòng)。我們需要添加C+代碼來操控使得人物可以行走打開VS的編譯器,在我們初始創(chuàng)建過的Avatar.h的頭文件中我們修改如下/ 綁定用戶輸入操作virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;/向右移動(dòng)void MoveRight(float amount);/向前移動(dòng)void MoveForward(f
3、loat amount);截圖如下頭文件定義好之后,我們需要在源文件中將功能具體實(shí)現(xiàn)/ 綁定用戶按鍵輸入操作void AAvatar:SetupPlayerInputComponent(class UInputComponent* InputComponent)Super:SetupPlayerInputComponent(InputComponent);/綁定項(xiàng)目設(shè)置中按鍵與頭文件中函數(shù)功能InputComponent->BindAxis("MyMoveForward", this, &AAvatar:MoveForward);InputComponent-
4、>BindAxis("MyMoveRight", this, &AAvatar:MoveRight);從這一段綁定用戶按鍵輸入操作我們可以看出來,我們將項(xiàng)目設(shè)置中的按鍵名稱與我們的函數(shù)功能名稱進(jìn)行再一次的綁定void AAvatar:MoveRight(float amount)/若控制器和移動(dòng)的數(shù)值都存在if (Controller && amount)/獲取右轉(zhuǎn)三維向量FVector right = GetActorRightVector();/將移動(dòng)輸入的大小添加到玩家前進(jìn)向量之中AddMovementInput(right, amoun
5、t);這兩段我們通過調(diào)用虛幻內(nèi)置的API使得玩家可以操控前進(jìn)和右轉(zhuǎn)。那么對于左轉(zhuǎn)和后退來說,我們可以在項(xiàng)目設(shè)置中重新以上面的方式再次綁定兩個(gè)按鍵操作,或者添加兩個(gè)其他按鍵并將scale設(shè)置為-1當(dāng)然我們不能僅僅只控制前后左右的移動(dòng),我們還需要設(shè)置鼠標(biāo)的旋轉(zhuǎn)和傾斜我們在項(xiàng)目設(shè)置中新添加MyYaw 和 MyPitch 兩個(gè)輸入按鍵操作綁定用戶操作內(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,比較方便功能的實(shí)現(xiàn)以上基本實(shí)現(xiàn)了玩家簡單控制人物的效果,當(dāng)然現(xiàn)在測試起來人行動(dòng)的并不自然這和我們自帶的第三人稱效果還有一定的差距創(chuàng)建非玩家實(shí)體 Create None-player character entity NPC這個(gè)創(chuàng)建方式和創(chuàng)建我們自身控制的角色類型相同,同樣也是從添加C+代碼到項(xiàng)目中選擇Character 作為父類進(jìn)行繼承我們希望這個(gè)NPC可以告訴玩家一些信息,那么我們將
7、會使用到FString,FString 是用來代替C+的STL函數(shù)庫中string的,他有良好的跨平臺的特性,所以在UE4中使用C+進(jìn)行編程我們需要使用字符串類型的話就用FString好了。/作為NPC的實(shí)體碰撞器UPROPERTY(VisibleAnywhere,BlueprintReadOnly, Category = "Collision")TSubobjectPtr<class USphereComponent>ProxSphere;/NPC所需要傳遞的話UPROPERTY(EditAnywhere, BlueprintReadWrite, Catego
8、ry = "NPCMessage")FString NPCMessage;添加在NPC的頭文件中在這之后在UE4編輯器中添加繼承自該類的藍(lán)圖類。注:本人在測試此部分時(shí),如果在頭文件中加入實(shí)體碰撞器會出現(xiàn)Crash的情況,報(bào)錯(cuò)說需要初始化,有可能是我使用的是4.7版本更新,而教材書籍僅僅是老版本,所以我最后將創(chuàng)建碰撞器這句話去掉,在創(chuàng)建出藍(lán)圖實(shí)體后是依然會有碰撞體的,最后我們加上mesh,給NPC的message附上信息,放入場景之中。創(chuàng)建和NPC的對話窗體我們需要?jiǎng)?chuàng)建一個(gè)繼承自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的類中定義了一個(gè)字體,并且在界面上繪出一個(gè)線框和文字重新編譯項(xiàng)目,我們進(jìn)入U(xiǎn)E4中,創(chuàng)建一個(gè)繼承自MyHUD的藍(lán)圖類,同時(shí)設(shè)置我們自己的字體信息。最后在我們的游戲模式中將默認(rèn)的HUD改成我們自己創(chuàng)建的HUD下面我們要用一個(gè)一個(gè)列表來存放這些對話的信息,我們打開自己創(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);/時(shí)間逐步縮減messagesc.time -=GetWorld()->GetDeltaSeconds();/當(dāng)該條消息的時(shí)間小于0的時(shí)候?qū)⒃摋l信息移除if (messagesc
13、.time < 0)messages.RemoveAt(c);void AMyHUDMessage:addMessage(Message msg)messages.Add(msg);下面我們必須要完成我們的NPC實(shí)體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);這個(gè)是我們自己的NPC類的頭文件,我們新添加了碰撞檢測事件,里面的參數(shù)都是固定的API的參數(shù),指定是Collision類別的碰撞器才會觸發(fā)這個(gè)碰撞事件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é)點(diǎn)下面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)有交互時(shí)/將其他玩家進(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)我們的人物碰撞時(shí)都會有默認(rèn)的一個(gè)消息顯示在我們的屏幕上方,過我們默認(rèn)的時(shí)間后會自動(dòng)銷毀。那么最后我們來完善一下我們的整個(gè)消息/創(chuàng)建一個(gè)完整信息的結(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)體,我們需要給每個(gè)對話的人一個(gè)頭像。源文件中添加這句/繪制出背景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)有交互時(shí)/將其他玩家進(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的簡單對話之所就基本完成了最后我們希望添加給用戶一個(gè)生命值的效果首先我們需要在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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)老院職業(yè)暴露應(yīng)急預(yù)案及處置流程
- 參芪肺積方聯(lián)合信迪利單抗用于驅(qū)動(dòng)基因陰性的Ⅲc-Ⅳ期非小細(xì)胞肺癌維持治療的臨床研究
- 科技創(chuàng)新班主任工作計(jì)劃
- 2025端午節(jié)作文700字9篇
- 配送運(yùn)輸合同
- 北師大版二年級數(shù)學(xué)上冊教學(xué)計(jì)劃與實(shí)施細(xì)則
- 2024年中考二模 化學(xué)(上海卷)(參考答案)
- 汽車制造總經(jīng)理年度述職報(bào)告范文
- 網(wǎng)絡(luò)安全公司解決方案范文
- 2025年小東風(fēng)駕駛室項(xiàng)目市場調(diào)查研究報(bào)告
- 女科學(xué)家吳健雄
- 婦產(chǎn)科學(xué)-自然流產(chǎn)課件
- 新時(shí)代中小學(xué)教師職業(yè)行為十項(xiàng)準(zhǔn)則考核試題及答案
- 微納米定位技術(shù)v3課件
- 初中七年級數(shù)學(xué)下學(xué)期5月月考試卷
- 汽機(jī)發(fā)電量計(jì)算
- GB∕T 1457-2022 夾層結(jié)構(gòu)滾筒剝離強(qiáng)度試驗(yàn)方法
- 康復(fù)治療技術(shù)(康復(fù)養(yǎng)老服務(wù))專業(yè)群建設(shè)方案
- 第五章結(jié)型場效應(yīng)晶體管
- 麗聲北極星自然拼讀繪本第一級Uncle Vic‘s Wagon 課件
- 2019幼兒園家委會PPT
評論
0/150
提交評論