次に調査する内容を何にするか
今のところ、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を継承しているクラスは渡せる
UnrealEngine4 最初にBluePrintとのリフレクション部分を調べる part3 メソッド
最初に
プロジェクトは BluePrintのThirdPersonExanmple プロジェクト名:BPTest C++クラス: MyActor 派生したBluePrintクラス:BP_MyActor
前回、構造体、Enum、メンバ変数のリフレクションを調べたので 今回は関数のリフレクション
基本的にはリフレクション入門はこれで終わりかな?
関数
関数のリフレクションは、UFUNCTIONを使うが この時のパラメータにより挙動が大きく異なるので よく使われるものをのせる
パラメータ一覧
下記をみるとよい
パラメータ無し
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; };
ヘルプによると 所有するオブジェクトに影響を与えることなく・・・ らしく、戻り値がなければダメのようだ
結果
パラメータ無しは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設定必要
UPROPERTY()
メンバそれぞれに対して、BluePrintにリフレクションするパラメータを設定する 今回は3種類書いてみた パラメーター無し、BlueprintReadOnly、BlueprintReadWrite 結果から言うと パラメータ無しだと Blueprintに公開されない BlueprintReadOnlyだと 書き込み不能 BlueprintReadWrite だと読み書き可能 みた通りの挙動
BluePrintでの結果
BP_MyActorのブループリントを開き、HogeStructのノードを開く
見て分かる通り、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のノードを開く
これで 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から呼び出せないため、それらのパラメータを付けることは不可能
BluePrintでの結果
private 変数はアクセス不能 protected 変数はアクセス可能 public_ 変数はアクセス可能
関数については次!
UnrealEngine4 最初にBluePrintとのリフレクション部分を調べる part1 クラスの作成&継承
UnrealEngine4 を初めて触る
インストールやセットアップは色々なサイトであるので、私は 最新のUnrealEngine4のソースをダウンロードし、エンジンビルドを行い BluePrintとのリフレクション部分を調べた 理由は、程よい難易度で、UnrealEngineの全体像を軽く理解できると思ったので
クラス作成
C++クラス作成
Unreal Engine | 2 - C++ クラスを作成する
メニューから
とりあえずActor選び
アクター名つける
そしてコンパイルする! VisualStudioソリューションを作成しビルドするもよし、エディタのホットリロードするもよし
BluePrintで継承する
BluePrint新規作成
先ほど作ったクラスを親に(MyActor)
とりあえずこれで、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
アンチャーテッド4
グラフィック、ゲームバランス 全てにおいてハイレベル
かつ、ゲーム下手な人でもストレスなくクリア出来る
とにかく売りの 肌の質感は圧巻で、時々俳優が演じている映画かと錯覚する
アクションも、パルクール、TPS、カーアクション、スニーキング
色々あるが、どれも素晴らしい出来。
やはり 世界最高峰の技術ですよ!
とりあえずクリア
キルゾーン シャドウフォール
リアルタイムレイトレーシングが売り
近未来系のゲームでは未だにナンバーワングラフィクスではないか?
ローンチタイトルとは思えない!
ただしゲームの難易度は高い。初見殺しだらけだし、ガイドも不親切で
ストレスがたくさんたまる!
でも それ故に、1歩進んだ時の嬉しさ100倍
やっと9章!! 頑張ってクリアするよ!
すげ~~~面白い!
そして 国内では最高レベルのグラフィック
なんたって ファイナルファンタジー最新作のエンジンを作った人のエンジンである
でも、プレイ動画配信拒否ってなんでだ・・・・
ちょこちょこプレイしています
とりあえず 今プレイしているのはこれぐらいかな。