C++幼女先輩

プログラミング成分多め

次に調査する内容を何にするか

今のところ、BluePrintとのリフレクションまわりの調査が終わった 正直いうとゲームを作る上で表向きには何も必要なさそうな部分だけど

Unrealの性質を知る上では、良い題材と思う いきなりリフレクションから始めるあたりが、私流というか、自分にとって最も効率の良い勉強法なんだろう

その延長でいけば、変数のレプリケーションやRPCまわりだが そこに行く前に、サーバーとクライアントの処理、Unrealの基本的なクラス についてが必要になる Unrealは元々 サーバに複数のプレイヤーが集まり ネットワーク対戦するゲームなので サーバにしかない変数、サーバにありクライアントと同期するもの、各プレイヤーにしかないもの、各プレイヤーとサーバにしかないもの などがある

ゲームを作るうえでは、当たり判定等の処理も必要だし UIも必要 敵AIも必要 そもそもキャラクターのセットアップやアニメーション機能必要じゃね? デザイナー向けのBluePrintも・・・

非常にやること多いんですけど・・・

ってことで、ミニゲーム作りながら地道にやるのがいいのかな

UnrealEngine4 最初にBluePrintとのリフレクション部分を調べる part4 BluePrintに渡せる型

BluePrintに渡せる型

BluePrintになんでも渡せると思うな!

C++コード

UENUM(BlueprintType)
enum class EHogeEnum : uint8 {
    HOGE,
    HOGE2,
    HOGE3
};

USTRUCT(BlueprintType)
struct BPSAMPLE_API FHoge {
    GENERATED_USTRUCT_BODY()
        float x;
};

USTRUCT(BlueprintType)
struct BPSAMPLE_API FHogeStruct {
    GENERATED_USTRUCT_BODY()

public:
    UPROPERTY(BlueprintReadWrite)   FHoge hoge_;
    UPROPERTY(BlueprintReadWrite)   EHogeEnum enum_;

    UPROPERTY(BlueprintReadWrite)   uint8   uint8_;
// UPROPERTY(BlueprintReadWrite)   uint16  uint16_;
// UPROPERTY(BlueprintReadWrite)   uint32  uint32_;
// UPROPERTY(BlueprintReadWrite)   uint64  uint64_;
// UPROPERTY(BlueprintReadWrite)   int8    int8_;
// UPROPERTY(BlueprintReadWrite)   int16   int16_;
    UPROPERTY(BlueprintReadWrite)   int32   int32_;
// UPROPERTY(BlueprintReadWrite)   int64   int64_;

    UPROPERTY(BlueprintReadWrite)   float  float_;
// UPROPERTY(BlueprintReadWrite)   double  double_;

    UPROPERTY(BlueprintReadWrite)   bool   bool_;

    UPROPERTY(BlueprintReadWrite)   FString FString_;
    UPROPERTY(BlueprintReadWrite)   FName   FName_;
    UPROPERTY(BlueprintReadWrite)   AActor  *AActor_;

    UPROPERTY(BlueprintReadWrite)   TArray<int32> TArray_;
// UPROPERTY(BlueprintReadWrite)   TMap<int32, int32>    TMap_;
// UPROPERTY(BlueprintReadWrite)   TSet<int32>   TSet_;

};

コメントになっているのは、基本的に渡せないもの。 意外と渡せるの少ないですね

構造体、Enumは USTRUCT,UENUM 付きのものは渡せる プリミティブ型では uint8、int32、float、bool のみ

コンテは TArrayのみ

UObjectを継承しているクラスは渡せる f:id:murasame-labo:20160908113351p:plain

UnrealEngine4 最初にBluePrintとのリフレクション部分を調べる part3 メソッド

最初に

プロジェクトは BluePrintのThirdPersonExanmple プロジェクト名:BPTest C++クラス: MyActor 派生したBluePrintクラス:BP_MyActor

前回、構造体、Enum、メンバ変数のリフレクションを調べたので 今回は関数のリフレクション

基本的にはリフレクション入門はこれで終わりかな?

関数

関数のリフレクションは、UFUNCTIONを使うが この時のパラメータにより挙動が大きく異なるので よく使われるものをのせる

パラメータ一覧

下記をみるとよい

https://docs.unrealengine.com/latest/JPN/Programming/UnrealArchitecture/Reference/Functions/index.html

パラメータ無し

 UFUNCTION(Category = "MyFunc")
        virtual void FuncNone() {};
    UFUNCTION(Category = "MyFunc")
        virtual void FuncNone2(int n) {};
    UFUNCTION(Category = "MyFunc")
        virtual int FuncNone3(int n) { return 1; };

パラメータを付けない場合は、BluePrintと繋がることはない だが、後に出てくる レプリケーション等のUnrealEngineで使う関数には指定する必要がある

BluePrintCallable

 UFUNCTION(BluePrintCallable, Category="MyFunc")
        virtual void FuncCallable() {};
    UFUNCTION(BluePrintCallable, Category = "MyFunc")
        virtual void FuncCallable2(int n) {};
    UFUNCTION(BluePrintCallable, Category = "MyFunc")
        virtual int FuncCallable3(int n) { return 1; };

BluePrintからC++のコードを実行する際に使う、最も多い使い方 基本的にUnrealではC++のクラスを継承しBluePrintを作る BluePrintで関数を Override可能

BlueprintImplementableEvent

 UFUNCTION(BlueprintImplementableEvent, Category = "MyFunc")
        void FuncImplementableEvent() ;
    UFUNCTION(BlueprintImplementableEvent, Category = "MyFunc")
        void FuncImplementableEvent2(int n);
    UFUNCTION(BlueprintImplementableEvent, Category = "MyFunc")
        int FuncImplementableEvent3(int n);

C++からBluePrintの関数を呼ぶための仕組み 名前から推測するに イベントのような形で実行するのだろう 実際にBluePrintでもイベントとして表示される

virtual不可能&C++側で関数をImplement不可能 関数定義だけ用意し、C++からこのコードを呼べば、BluePrintで定義した関数が呼べる イベントなので 引数は取れるが戻り値は返せない コンパイルエラーにはならないが、戻り値をつけるとBluePrintから見えなくなる

BlueprintPure

//  UFUNCTION(BlueprintPure, Category = "MyFunc")
//     virtual void FuncPure(){};
// UFUNCTION(BlueprintPure, Category = "MyFunc")
//     void FuncPure2(int n) {};
    UFUNCTION(BlueprintPure, Category = "MyFunc")
        virtual int FuncPure3(int n) { return 1; };

ヘルプによると 所有するオブジェクトに影響を与えることなく・・・ らしく、戻り値がなければダメのようだ

結果

f:id:murasame-labo:20160907201144p:plain

パラメータ無しはBluePrintに表示されない ImplementableEventは イベントとして表示。ただし戻り値を設定すると表示されない Callableは実行品が両端についた通常の関数 Pureは実行ピンのない、値をかえすだけのもの

これでBluePrintとのリフレクションの基礎は一通りおわった

UnrealEngine4 最初にBluePrintとのリフレクション部分を調べる part2 構造体、enum、メンバ変数

最初に

プロジェクトは BluePrintのThirdPersonExanmple プロジェクト名:BPTest C++クラス: MyActor 派生したBluePrintクラス:BP_MyActor

を作成する 作成したクラスを元にリフレクションを調査

構造体

構造体をBluePrintと両方で使いたい場合は、基底クラスのC++側で リフレクション付けて定義します

コード

Class宣言の前に

USTRUCT(BlueprintType)
struct BPSAMPLE_API FHogeStruct {
    GENERATED_USTRUCT_BODY()

public:
    UPROPERTY() float x;
    UPROPERTY(BlueprintReadOnly)    float y;
    UPROPERTY(BlueprintReadWrite)   float z;
};

名前

今回の構造体名は FHogeStruct 構造体は頭に Fのプリフィックスを付けねば認識してくれないのは Unrealの仕様

USTRUCT()

BluePrintに公開するときに必要 ただし、これだけではガーベージコレクションに入らないので、メンバ1つずつに対して UPROPERTY設定必要

パラメータは下記 https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/Reference/Structs/Specifiers/index.html

UPROPERTY()

メンバそれぞれに対して、BluePrintにリフレクションするパラメータを設定する 今回は3種類書いてみた パラメーター無し、BlueprintReadOnly、BlueprintReadWrite 結果から言うと パラメータ無しだと Blueprintに公開されない BlueprintReadOnlyだと 書き込み不能 BlueprintReadWrite だと読み書き可能 みた通りの挙動

パラメータ詳細は下記 https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/Reference/Properties/Specifiers/index.html

BluePrintでの結果

BP_MyActorのブループリントを開き、HogeStructのノードを開く

f:id:murasame-labo:20160907180419p:plain

見て分かる通り、IN (書き込み)は Zのみ、OUT(読み込み)はYとZで、Xは読み書きどちらも不能

これで 構造体をBluePrintとC++で使えるようになった

Enum

EnumをBluePrintと両方で使いたい場合は、基底クラスのC++側で リフレクション付けて定義します

コード

Class宣言の前に

UENUM(BlueprintType)
enum class EHogeEnum : uint8 {
    HOGE,
    HOGE2,
    HOGE3
};

名前

今回の構造体名は EHogeEnum Enumは頭に Eのプリフィックスを付けねば認識してくれないのは Unrealの仕様 また、内部表現は8ビット固定

UENUM()

BluePrintに公開するときに必要

BluePrintでの結果

BP_MyActorのブループリントを開き、HogeEnumのノードを開く

f:id:murasame-labo:20160907182152p:plain

これで EnumをBluePrintとC++で使えるようになった

メンバ変数

メンバ変数をBluePrintに公開するには、基底クラスのC++側で リフレクション付けて定義します

コード

Class

UCLASS(Blueprintable)
class BPSAMPLE_API AMyActor : public AActor
{
    GENERATED_BODY()
    
private:
    // UPROPERTY(BlueprintReadWrite, Category = "MyTest")    float private_;    // privateではアクセスを書くとコンパイルエラー
    UPROPERTY() float private_;

protected:
    UPROPERTY(BlueprintReadOnly, Category = "MyTest")    float protected_;


public:   
    UPROPERTY(BlueprintReadWrite, Category = "MyTest")   float public_;

    // Sets default values for this actor's properties
    AMyActor();

    // Called when the game starts or when spawned
    virtual void BeginPlay() override;
    
    // Called every frame
    virtual void Tick( float DeltaSeconds ) override;

};

UPROPERTY()

構造体の時と同じく、BlueprintReadOnly、BlueprintReadWrite を選べる また、Categoryをつけると、BluePrintでノードを検索するときに カテゴリー名で検索できるので便利 Privateの場合は BluePrintから呼び出せないため、それらのパラメータを付けることは不可能

パラメータ詳細は下記 https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/Reference/Properties/Specifiers/index.html

BluePrintでの結果

private 変数はアクセス不能 protected 変数はアクセス可能 public_ 変数はアクセス可能

f:id:murasame-labo:20160907184439p:plain

関数については次!

UnrealEngine4 最初にBluePrintとのリフレクション部分を調べる part1 クラスの作成&継承

UnrealEngine4 を初めて触る

インストールやセットアップは色々なサイトであるので、私は 最新のUnrealEngine4のソースをダウンロードし、エンジンビルドを行い BluePrintとのリフレクション部分を調べた 理由は、程よい難易度で、UnrealEngineの全体像を軽く理解できると思ったので

クラス作成

C++クラス作成

Unreal Engine | 2 - C++ クラスを作成する

メニューから

f:id:murasame-labo:20160906213727j:plain

とりあえずActor選び

f:id:murasame-labo:20160906213729j:plain

f:id:murasame-labo:20160906213824j:plain

アクター名つける

f:id:murasame-labo:20160906213727j:plain

そしてコンパイルする! VisualStudioソリューションを作成しビルドするもよし、エディタのホットリロードするもよし

BluePrintで継承する

BluePrint新規作成

f:id:murasame-labo:20160906215151p:plain

先ほど作ったクラスを親に(MyActor)

f:id:murasame-labo:20160906215154p:plain

とりあえずこれで、C++クラスを継承したBluePrintができた。

C++とBluePrintをリフレクションする場合には、C++でクラスを作成しBluePrintで継承する

C++コードを見る

C++のコード(MyActor.h)をみてみる

#pragma once

#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class HOGE_API AMyActor : public AActor
{
    GENERATED_BODY()
    
public:   
    // Sets default values for this actor's properties
    AMyActor();

    // Called when the game starts or when spawned
    virtual void BeginPlay() override;
    
    // Called every frame
    virtual void Tick( float DeltaSeconds ) override;

    
    
};

上記が自動生成されたコード。

AActorクラスを継承している。 Unrealではクラス名の頭に意味があり Uがつくものは UObject、AはActorを継承している Fもある

コンストラクタ、BeginPlay、Tickが用意されている

BeginPlayはワールドに生成された時、Tickは毎フレーム呼ばれるコールバック

ここで疑問が何個かあるとおもう

#include "MyActor.generated.h"

自動生成されたヘッダファイル。 ヘッダを変更するとUnrealBuildToolが自動的に生成する リフレクション用のファイル 自動生成されるので気にする必要はない

UCLASS()

コードをおうと

#if UE_BUILD_DOCS
#define UCLASS(...)
#else
#define UCLASS(...) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_PROLOG)
#endif

#define BODY_MACRO_COMBINE_INNER(A,B,C,D) A##B##C##D
#define BODY_MACRO_COMBINE(A,B,C,D) BODY_MACRO_COMBINE_INNER(A,B,C,D)

とりあえず あまり気にせず、Unrealに管理させるクラスには UCLASS() が必要と。

HOGE_API

HOGEはプロジェクト名 これも気にしない

: public AActor

Actorから継承させなければ、Unrealの色々な機能が使えない。 UObject、AActor、ACharacter・・等色々あるが今回は AActorで行う

GENERATED_BODY()

#define GENERATED_BODY(...) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_GENERATED_BODY)
#define BODY_MACRO_COMBINE_INNER(A,B,C,D) A##B##C##D
#define BODY_MACRO_COMBINE(A,B,C,D) BODY_MACRO_COMBINE_INNER(A,B,C,D)

これも特に気にせず、Unrealに管理させる場合に必要とおぼえておこう

Unrealに管理させるとは

BluePrintでは明示的にオブジェクトの削除が出来ず、ガーベージコレクションでメモリ管理を行う また BluePrintと連携するには、リフレクション機能が必要(おそらくDLLのような形ではないか?) のため AActorの継承、UCLASS()、GENERATED_BODY() の明記 が必要になる

実際の BluePrintとの連携は 次回

UnrealEngineはじめるにあたって・・

UnrealEngine4 を始めるにあたって どこから勉強するか?

最初に悩むところはそこだろうし、役割によっても変わってくる

当然プランナーやデザイナーだと、プログラマとは違うところから入るので
そこは除外すると

大きくプログラマは何種類かにわかれるとおもう
以下は、Unreal触って少しで感じた、役割により最初に覚える箇所



1、アニメーション、キャラクター
必然的に グラフィックデザイナーとの仕事が多くなるので、3Dソフトの知識があるとよい
また、ブループリントを多用すると思うので、ブループリントを覚えたい
アニメーションブループリントは、特殊なのでこれも覚える
デザイナーと協力するところなので、その辺の知識が必要
シーケンスエディタなどGUIの使い方も必要


2、サーバインタフェース(通信)
たいていUnrealだと多人数のマルチプレイが多く、サーバとクライアントで
レプリケーションやRPCを使ってやり取りする
まずは Unrealでの通信の仕組みを理解し、レプリケーション、RPCを覚えること


3、メインルーチン
ゲームのメイン部分を作る。
プランナーとのやり取りも多くなるだろう
彼らが触れるように、パラメーターをブループリントに出したり

リフレクション周りを最初に覚えたほうがいいと思う

 

4、UI

UIはWidget などの扱い方とリフレクションが必要

おそらくデザイナもあるていどのブループリントを使い表現をしてくることが多いと思うので
以外に知識量が多いとおもう

 

5、リーダー

リーダー的な立場は全部できなければならない。

まずは、リフレクション周りから覚えたほうが良いと思う

理由は なんとなくだが。

 

 

そんなわけで、まずは私は ブループリントとのリフレクション周りから勉強した。

 

 カットシーンについては 全く別知識なので今回は考慮してません

 

 

 

最近プレイしているゲーム&評価しているゲーム

ゲームプログラマは常にゲームをプレイしていなければならない(はず)

ここ数年、ゲームの最新技術に取り残されている気がするけど、必死に追いつかなければ。。

とにかくPS4はすごいハードだ。もちろん最新のPCはもっとすごいかもしれないが
家庭用ゲーム機とは思えないぐらいのハイスペックグラフィクスが作成できる

そんなわけで 最近のプレイゲーム


3DS
モンスターハンター クロス

みんなプレイしている人気ゲーム。こころなしかクロスになり人口が減った気がするが・・・?
さすがに3DSという、ハードスペックの低いゲームだけあって、グラフィックが弱い
影はあきらかな ガタガタだし、ちらつきもあるし、エフェクトも 凄さがない
ただし、それでも超売れるのは コンテンツ力だな。
ちなみに 忙しくて電車内プレイで、オンラインは全くプレイしておらず やっとHR6にソロでなったばかり
片手とスラッシュアックスが得意で、今は太刀と大剣遊んでいる


PSVita
勇者のくせにこなまいきだG
甥っ子がプレイしているのでダウンロードしたった
基本無料でDLC課金だが、あまりお金を使えないという親切設計
タッチパネルのみの 落ち物パズルゲームだが
魔王になり勇者を倒すという使命のあるゲーム
甥っ子もWiki情報をノートに書いて必死に攻略していた
自分の子供の頃も、ジャンプの袋とじをノートに写したり、パスワードをと
ゲーム用ノートは大活躍だった


PS4
アンチャーテッド

グラフィック、ゲームバランス 全てにおいてハイレベル
かつ、ゲーム下手な人でもストレスなくクリア出来る
とにかく売りの 肌の質感は圧巻で、時々俳優が演じている映画かと錯覚する
アクションも、パルクール、TPS、カーアクション、スニーキング
色々あるが、どれも素晴らしい出来。
やはり 世界最高峰の技術ですよ!
とりあえずクリア

 

 

キルゾーン シャドウフォール

リアルタイムレイトレーシングが売り
近未来系のゲームでは未だにナンバーワングラフィクスではないか?

ローンチタイトルとは思えない!
ただしゲームの難易度は高い。初見殺しだらけだし、ガイドも不親切で
ストレスがたくさんたまる!
でも それ故に、1歩進んだ時の嬉しさ100倍
やっと9章!! 頑張ってクリアするよ!

 

メタルギアソリッド V ファントムペイン

すげ~~~面白い!
そして 国内では最高レベルのグラフィック
なんたって ファイナルファンタジー最新作のエンジンを作った人のエンジンである
でも、プレイ動画配信拒否ってなんでだ・・・・
ちょこちょこプレイしています




とりあえず 今プレイしているのはこれぐらいかな。