亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

Unreal Engine使用C++入門示例

2019-11-06 09:45:52
字體:
來源:轉載
供稿:網友

epic games宣布ue4免費使用之后,吸引了大批看好VR和AR前景的游戲開發者。

不過國內ue4教程和資料太少,而且一大部分資料都是關于藍圖(BluePRint)的,好在官網放出了guide和demo。更多討論,可以前往討論區:http://www.52vr.com/forum-93-1.html

本文先演示一個如何在UnrealEngine上創建一個C++項目,然后實現一個可用按鍵控制物體的示例:

1. 安裝Unreal Engine,在此不做詳細說明。從官網上下載安裝,然后注冊epic games賬號。如果要下源碼,需要綁定Github賬號,等到EpicGames自動邀請之后才能瀏覽源碼。

2. 新建項目:

安裝好之后,啟動UnrealEngine,選擇 新建項目-> c++ -> 基礎代碼

 

等加載完之后,選擇文件->新建c++類,然后在如下界面選擇繼承Pawn(Pawn是可由玩家控制或者AI控制的物體的基類):

我在創建的時候取類名為CollidingPawn,  創建完之后會自動打開vs2012(如果沒裝會提示你裝一個,其他版本比如vs2015也不行,只能是2012),生成一個CollidingPawn.cpp和CollidingPawn.h。

頭文件如下所示, 我按照自己的理解加了注釋:

CollidingPawn.h:

  

[代碼]:

view sourceprint?
01#pragma once
02 
03 
04 
05#include "GameFramework/Pawn.h"
06 
07#include "CollidingPawn.generated.h"
08 
09 
10 
11UCLASS()
12 
13class DEMO__API ACollidingPawn : public APawn
14 
15{
16 
17    GENERATED_BODY()
18 
19 
20 
21public:
22 
23    // 構造函數,可在此方法中放置物體和參數
24 
25    ACollidingPawn();
26 
27 
28 
29    // 游戲開始調用此方法
30 
31    virtual void BeginPlay() override;
32 
33     
34 
35    // 如果PrimaryActorTick.bCanEverTick設置為true,則每一幀都會調用此方法。如果處于性能的考慮,可以將其關閉。
36 
37    virtual void Tick( float DeltaSeconds ) override;
38 
39 
40 
41    // 在此函數中綁定按鍵和方法
42 
43    virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;
44 
45};

接下來,我們在原來的基礎上,來實現按鍵控制物體的小程序

先創建一個可見的球體:

在CollidingPawn.cpp的構造函數ACollidingPawn::ACollidingPawn()中添加一個球體,一個網格組件(mesh),一個彈簧臂和相機,代碼如下:

[代碼]:

view sourceprint?
01//創建一個球體
02 
03    USphereComponent* SphereComponent = CreateDefaultSubobject(TEXT("RootComponent"));
04 
05    //設置為根組件
06 
07    RootComponent = SphereComponent;
08 
09    //設置半徑
10 
11    SphereComponent->InitSphereRadius(40.0f);
12 
13    SphereComponent->SetCollisionProfileName(TEXT("Pawn"));
14 
15 
16 
17    // 創建并放置網格物體組件,這樣我們能看到球體的位置
18 
19    UStaticMeshComponent* SphereVisual = CreateDefaultSubobject(TEXT("VisualRepresentation"));
20 
21    //如果不把網格附加到SphereComponent 就看不到球體
22 
23    SphereVisual->AttachTo(RootComponent);
24 
25    static ConstructorHelpers::FObjectFinder      SphereVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere"));
26 
27    if (SphereVisualAsset.Succeeded()){
28 
29        SphereVisual->SetStaticMesh(SphereVisualAsset.Object);
30 
31        SphereVisual->SetRelativeLocation(FVector(0.0f, 0.0f, -40.0f));
32 
33        SphereVisual->SetWorldScale3D(FVector(0.8f));
34 
35    }
36 
37 
38 
39    //  使用彈簧臂來讓相機獲得一種平滑、自然的運動。
40 
41    //  彈簧臂的目的是讓視角跟SphereComponent保持一定距離,如果不加,效果像fps游戲的第一視角一樣
42 
43    USpringArmComponent* SpringArm = CreateDefaultSubobject(TEXT("CameraAttachmentArm"));
44 
45    SpringArm->AttachTo(RootComponent);
46 
47    SpringArm->RelativeRotation = FRotator(-45.f, 0.f, 0.f); //45度角
48 
49    SpringArm->TargetArmLength = 400.0f; //彈簧臂長度
50 
51    SpringArm->bEnableCameraLag = true;
52 
53    SpringArm->CameraLagSpeed = 3.f;
54 
55 
56 
57    // 創建相機并附加到彈簧臂
58 
59    // 如果沒有相機 什么都看不到
60 
61    UCameraComponent* Camera = CreateDefaultSubobject(TEXT("ActualCamera"));
62 
63    Camera->AttachTo(SpringArm, USpringArmComponent::SocketName);

然后配置按鍵: 打開ue編輯器, 選擇編輯->項目設置-> 輸入, 然后在右邊的axis mappings加入如下設置:

MoveForWard,MoveRight,Turn,Turn_Y 可自定義,表示跟各個按鍵的綁定關系。

然后創建一個類CollidingPawnMovementComponent繼承自PawnMovementComponent(控制pawn移動的組件),我們可以把WASD綁定的行為綁定到這個component上,然后把該component綁定到我們剛才創建的球體上:

CollidingPawnMovementComponent.cpp

  

[代碼]:

view sourceprint?
01#include "Demo.h"
02 
03#include "CollidingPawnMovementComponent.h"
04 
05 
06 
07void UCollidingPawnMovementComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
08 
09{
10 
11    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
12 
13 
14 
15    // Make sure that everything is still valid, and that we are allowed to move.
16 
17    if (!PawnOwner || !UpdatedComponent || ShouldSkipUpdate(DeltaTime))
18 
19    {
20 
21        return;
22 
23    }
24 
25 
26 
27    // Get (and then clear) the movement vector that we set in ACollidingPawn::Tick
28 
29    FVector DesiredMovementThisFrame = ConsumeInputVector().GetClampedToMaxSize(1.0f) * DeltaTime * 150.0f;
30 
31    if (!DesiredMovementThisFrame.IsNearlyZero())
32 
33    {
34 
35        FHitResult Hit;
36 
37        SafeMoveUpdatedComponent(DesiredMovementThisFrame, UpdatedComponent->GetComponentRotation(), true, Hit);
38 
39 
40 
41        // If we bumped into something, try to slide along it
42 
43        if (Hit.IsValidBlockingHit())
44 
45        {
46 
47            SlideAlongSurface(DesiredMovementThisFrame, 1.f - Hit.Time, Hit.Normal, Hit);
48 
49        }
50 
51    }
52 
53};

然后在CollidingPawn.h中加入如下代碼:

[代碼]:

view sourceprint?
1class UCollidingPawnMovementComponent* OurMovementComponent;
先將movementComponent綁定到剛才加的球體上,在CollidingPawn構造函數底部加入如下代碼:

[代碼]:

view sourceprint?
1// Create an instance of our movement component, and tell it to update the root.
2    OurMovementComponent = CreateDefaultSubobject<ucollidingpawnmovementcomponent>(TEXT("CustomMovementComponent"));
3    OurMovementComponent->UpdatedComponent = RootComponent;</ucollidingpawnmovementcomponent>
為了讓游戲中的其他類知道CollidingPawn目前正在使用CollidingPawnMovementComponent作為移動控制組件,需要在CollidingPawn.h中加入以下代碼:

[代碼]:

view sourceprint?
1virtual UPawnMovementComponent* GetMovementComponent() const override;
然后在CollidingPawn.cpp中加入:

[代碼]:

view sourceprint?
1UPawnMovementComponent* ACollidingPawn::GetMovementComponent() const
2{
3    return OurMovementComponent;
4}
剛才我們已經將新創建的移動控制組件綁定到了球體上,現在需要把WASD觸發的函數綁定到移動組件上,在CollidingPawn中實現往前移動,往左移動,轉動視角的三個方法:

[代碼]:

view sourceprint?
01// 往前(后)移動
02void ACollidingPawn::MoveForward(float AxisValue)
03{
04    if (OurMovementComponent && (OurMovementComponent->UpdatedComponent == RootComponent))
05    {
06        OurMovementComponent->AddInputVector(GetActorForwardVector() * AxisValue);
07    }
08}
09 
10// 往左(右)移動
11void ACollidingPawn::MoveRight(float AxisValue)
12{
13    if (OurMovementComponent && (OurMovementComponent->UpdatedComponent == RootComponent))
14    {
15        OurMovementComponent->AddInputVector(GetActorRightVector() * AxisValue);
16    }
17}
18 
19// 左右轉動視角
20void ACollidingPawn::Turn(float AxisValue)
21{
22    FRotator NewRotation = GetActorRotation();
23    NewRotation.Yaw += AxisValue;
24    SetActorRotation(NewRotation);
25}
然后將這三個方法在ACollidingPawn::SetupPlayerInputComponent中注冊:

[代碼]:

view sourceprint?
1void ACollidingPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
2{
3    Super::SetupPlayerInputComponent(InputComponent);
4 
5    InputComponent->BindAxis("MoveForward", this, &ACollidingPawn::MoveForward);
6    InputComponent->BindAxis("MoveRight", this, &ACollidingPawn::MoveRight);
7    InputComponent->BindAxis("Turn", this, &ACollidingPawn::Turn);
8}
以上就完成了一個可用WASD移動和鼠標控制左右視角的球體如果上下移動視角,可仿照以上的ACollidingPawn::Turn方法,將NewRotation.Yaw += AxisValue; 改為NewRotation.Pitch += AxisValue;即可

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩精品久久奇米色影视| 欧美激情区在线播放| 国产精品久久久久久av下载红粉| 成人av色在线观看| 久久91亚洲人成电影网站| 97av在线视频免费播放| 国产精品av在线播放| 久久久精品999| 国产午夜精品全部视频在线播放| 欧美午夜无遮挡| 一区二区成人av| 欧美成人免费全部观看天天性色| 欧美精品一二区| 麻豆国产va免费精品高清在线| 亚洲国产另类久久精品| 欧美亚洲激情视频| 国产午夜精品一区二区三区| 国产欧美日韩专区发布| 欧美午夜性色大片在线观看| 久久在线观看视频| 国产精品18久久久久久首页狼| 国产福利精品在线| 久久国产精品首页| 亚洲第一免费网站| 91精品在线看| 精品国产老师黑色丝袜高跟鞋| 欧美另类精品xxxx孕妇| 美女av一区二区三区| 亚洲美女自拍视频| 亚洲自拍偷拍福利| 国产精品一区二区久久久久| 精品夜色国产国偷在线| 中文字幕亚洲图片| 日韩综合视频在线观看| 亚洲精品白浆高清久久久久久| 98视频在线噜噜噜国产| 亚洲女人被黑人巨大进入al| 亚洲a区在线视频| 精品国产网站地址| 国产精品午夜国产小视频| 国产精品日韩精品| 色综合久久久久久中文网| 91视频免费网站| 成人情趣片在线观看免费| 精品国内产的精品视频在线观看| 欧日韩不卡在线视频| 欧美性资源免费| 久久综合亚洲社区| 亚洲欧美精品一区| 国内精品久久久久| 乱亲女秽乱长久久久| 97香蕉超级碰碰久久免费的优势| 91精品成人久久| 亚洲乱亚洲乱妇无码| 亚洲综合av影视| 欧美电影院免费观看| 欧美视频免费在线| 亚洲护士老师的毛茸茸最新章节| 亚洲性夜色噜噜噜7777| 夜夜嗨av色一区二区不卡| 久久久999精品免费| 一区二区三区国产在线观看| 国产精品情侣自拍| 青青草成人在线| 亚洲va码欧洲m码| 欧美日在线观看| 亚洲第一精品夜夜躁人人爽| 国产日韩在线视频| 综合久久五月天| 久久综合免费视频| 一区二区中文字幕| 日韩女优人人人人射在线视频| 中文字幕在线视频日韩| 久久精品亚洲精品| 国产97在线观看| 欧美激情手机在线视频| 欧美精品久久久久久久| 欧美理论电影在线播放| 97视频在线播放| 国产一区二区三区精品久久久| 日韩极品精品视频免费观看| 中文字幕v亚洲ⅴv天堂| 精品呦交小u女在线| 久久中国妇女中文字幕| 欧美成人免费播放| 国产91久久婷婷一区二区| 日韩国产精品亚洲а∨天堂免| 国产日韩精品在线| 久久精品99久久香蕉国产色戒| 中文字幕日韩电影| 日韩在线精品一区| 国内精品久久久久影院优| 欧美在线视频一区| 国产精品日韩在线观看| 国产女人精品视频| 国产成人精品日本亚洲专区61| 精品丝袜一区二区三区| 国产成人在线亚洲欧美| 国产a级全部精品| 国产婷婷成人久久av免费高清| 久久久久久久久久久人体| 在线成人激情黄色| 蜜臀久久99精品久久久久久宅男| 亚洲一级免费视频| 久久精品夜夜夜夜夜久久| 亚洲女成人图区| 成人写真视频福利网| 国产美女久久久| 在线视频欧美日韩| 国产欧美日韩综合精品| 国产欧美精品在线| 亚洲精品福利在线| 欧美成人激情图片网| 欧美精品在线视频观看| 综合久久五月天| 国产精品美女无圣光视频| 久久视频国产精品免费视频在线| 97免费视频在线| 久久久久久久久久久av| 亚洲男女性事视频| 欧美电影在线观看网站| 视频在线一区二区| 97久久精品在线| www高清在线视频日韩欧美| 亚洲第一网站免费视频| 国产精品自拍视频| 91av免费观看91av精品在线| 草民午夜欧美限制a级福利片| 日韩美女激情视频| 久久久av免费| 亚洲精品www久久久久久广东| 亚洲人永久免费| 91精品视频免费看| 日本高清不卡在线| 欧美激情第三页| 成人欧美在线视频| 69av在线播放| 国产色婷婷国产综合在线理论片a| 亚洲人成电影网站色www| 欧美成人免费观看| 亚洲护士老师的毛茸茸最新章节| 欧美精品免费在线观看| 欧美成人激情视频免费观看| 成人精品aaaa网站| 日韩中文字幕在线观看| 欧美黄色片在线观看| 久久久久久一区二区三区| 亚洲视频免费一区| 欧美色道久久88综合亚洲精品| 国产97在线播放| 美女扒开尿口让男人操亚洲视频网站| 亚洲曰本av电影| 日韩成人在线播放| www高清在线视频日韩欧美| 亚洲色图日韩av| 91av免费观看91av精品在线| 78m国产成人精品视频| 亚洲女人被黑人巨大进入| 九九热最新视频//这里只有精品| 秋霞午夜一区二区| 欧美性猛交丰臀xxxxx网站| 欧美激情a在线| 久热在线中文字幕色999舞| 久久人人爽人人爽人人片av高请|