変数が箱っていう例え分かりづらいよね?

めちゃくちゃ小さいHDD(SSD)とかの方がいい気がする。

 

////////////////////////////////////////////////////////////

// 雑記

////////////////////////////////////////////////////////////

 

www.unrealengine.com

 

Unreal Engine 4.18 Preview 1 がリリースされました!早い(確認)

ボリュームライトマップやスカイライトの方向性強化、クロスツールのアップグレード、物理アセットエディターとメディアフレームワークを刷新、Google's ARCoreとApple's ARKitのサポートを改善など盛りだくさんです!

WWDC 2017で行われたARデモのiOS向けフォワードレンダラーも今回から使用できるらしいですよ!(ただし推奨スペックはApple A10以上、iOS 10.3以上)

 

////////////////////////////////////////////////////////////

// ここまで宣伝

// ここから本編

////////////////////////////////////////////////////////////

 

変数はプログラマーが一生付き合っていく相棒です。

変数とは何ぞや?というとデータを格納する記号なわけですが、

Unreal Engine においての変数はもちろん" ゲームで使用するデータ "を入れるわけです。

なので、Unreal Engineではゲーム制作で使用しやすいようにデータを格納できます。

 

////////////////////////////////////////////////////////////

// UPROPERTYマクロについて(English)

////////////////////////////////////////////////////////////

UPROPERTY - Epic Wiki

 

このようにUPROPERTYマクロはたくさんあるのですが、

(私が)よく使う順で全部見ていきたいと思います。

// deprecatedは除外しています。

 

////////////////////////////////////////////////////////////

// ソースコード

////////////////////////////////////////////////////////////

 

ToyBoxUnrealCpp/UPROPERTY_MACRO at master · ToyBoxUnrealCpp/ToyBoxUnrealCpp · GitHub

 

ここに置いておきますね。

 

////////////////////////////////////////////////////////////

// デザイナーにぶん投げる系

////////////////////////////////////////////////////////////

EditAnywhere, EditDefaultsOnly, EditInstenceOnly

Editとついているので分かりやすいです。

f:id:You_O:20170925191117p:plain

エディタのディテールパネルから編集できるようにする指定子です。

f:id:You_O:20170925183138p:plain

レベルエディタにはm_editAnywhereとm_editInstanceOnlyが…

f:id:You_O:20170925183523p:plain

ブループリントエディタにはm_editAnywhereとm_editDefaultsOnlyがいるのが確認できますね!

 

////////////////////////////////////////////////////////////

// 数値を確認する系

////////////////////////////////////////////////////////////

VisibleAnywhere, VisibleDefaultsOnly, VisibleInstanceOnly

f:id:You_O:20170925191208p:plain

f:id:You_O:20170925183632p:plain

f:id:You_O:20170925183722p:plain

Edit~と同じですね。

ただし、グレーアウトして編集不可となっています。

 

////////////////////////////////////////////////////////////

// 表示方法系

////////////////////////////////////////////////////////////

Category = "CategoryName", Category = "MainName|SubName"

Category指定子でエディタ上の表示カテゴリを指定できます。

|(orBit演算子)でサブカテゴリを指定できます。

f:id:You_O:20170925184235p:plain

f:id:You_O:20170925184039p:plain

実は””で囲む必要はなかったりしますが、私は囲む方が好きです。

 

SimpleDisplay, AdvancedDisplay

f:id:You_O:20170925191320p:plain

f:id:You_O:20170925184331p:plain

m_simpleDisplayはシンプルですね。

f:id:You_O:20170925184418p:plain

m_advancedDisplayは▼を押すとドロップダウンリストが出てきます。

 

////////////////////////////////////////////////////////////

// ブループリント系

////////////////////////////////////////////////////////////

BlueprintReadOnly, BlueprintReadWrite

f:id:You_O:20170925191436p:plain

m_blueprintReadOnlyをブループリント上で呼び出すと…

f:id:You_O:20170925184639p:plain

Getしかありません。

Setがないのでこの変数はブループリント上では変更できませn。

 

m_blueprintReadWriteを呼び出すと…

f:id:You_O:20170925184749p:plain

GetとSetがありますね!

 

////////////////////////////////////////////////////////////

// 配列系

////////////////////////////////////////////////////////////

EditFixedSize

f:id:You_O:20170925191528p:plain

可長変配列の配列数をエディタから変更できなくします。

ソースコード上からは変更できます。

f:id:You_O:20170925184959p:plain

上は+で増やせます。

下は変更できません。 

 

////////////////////////////////////////////////////////////

// デリゲート系

////////////////////////////////////////////////////////////

Unity、C#勢はなじみ深いでしょうかね?

C、C++勢の方は関数ポインタと言えば伝わるでしょうか?

デリゲートです。

UnrealC++はC#からデリゲートを逆輸入しています。

 

BlueprintAssignable, BlueprintCallable

f:id:You_O:20170925191631p:plain

Assignableはデリゲートをバインドする関数、

Callableはデリゲートをコールする関数に結びつけます。

f:id:You_O:20170925185221p:plain

m_blueprintAssignableはバインド系の関数が来てますね!

f:id:You_O:20170925185325p:plain

m_blueprintCallableはコール系の関数が来ています。

 

BlueprintAuthorityOnly

この指定子が付けられたデリゲートは、BlueprintAuthorityOnlyのイベントのみ受け付けます。

// ???よくわからない…

 

////////////////////////////////////////////////////////////

// エディタ上でなんかする系

////////////////////////////////////////////////////////////

Instanced

f:id:You_O:20170925191739p:plain

オブジェクト型しかつけられません。

このクラスがインスタンスとして生成されたとき、

この指定子がつけられた変数のオブジェクトのコピーが与えられます。

f:id:You_O:20170925185654p:plain

m_instancedなんかおる。

 

SaveGame

f:id:You_O:20170925191834p:plain

そのまんまです。

セーブのためにシリアライズします。

 

Transient, DuplicateTransient, NonPIEDuplicateTransient, TextExportTransient

f:id:You_O:20170925192104p:plain

 

Transient

この変数は外部ファイルへの保存をしない設定になります。

SaveGameと同時には扱えません.

f:id:You_O:20170925185904p:plain

エディタを再起動すると…

f:id:You_O:20170925190057p:plain

0で初期化されています。

 

DuplicateTransient

Duplicate時(このオブジェクトをコピーして何かしらするとき)にこの指定子がついている変数は外部ファイルへの保存を禁止します。

f:id:You_O:20170925185904p:plain

エディタを再起動すると…

f:id:You_O:20170925190057p:plain

値は保存されています。

レベル上のオブジェクトをコピペすると…

f:id:You_O:20170925190221p:plain

0で初期化されています。

 

NonPIEDuplicateTransient

// ネットワーク作るのめんどくさかったので説明だけ

PIE(Play in Editor)セッション用に複製されていない場合、シリアライズしません。

 

TextExportTransient

テキストをコピー/ペーストするときに値をシリアライズすることを禁止します。

レベル上のオブジェクトをコピペすると…

f:id:You_O:20170925190221p:plain
0で初期化されています。

 

NoClear

f:id:You_O:20170925192210p:plain

エディタ上のClearボタンとNoneボタンを非表示にします。

f:id:You_O:20170925190412p:plain

m_yesClear/* YesClearってなんだよ */にはclearボタンがあります。

f:id:You_O:20170925190516p:plain

m_noClearにはclearボタンがありません。

 // Noneはなんかどっちもなかった…

 

NonTransactional

この指定子が付けられた変数はアンドゥ/リドゥができなくなる。

 

Export

よくわかりません。

説明見る限り、エクスポート時にオブジェクトデータ丸ごとテキスト化すると書いてあるので、

このオブジェクトへの参照パスを登録せずにインポート時にこのオブジェクト丸ごと再生成するみたいな感じ?

 

 

////////////////////////////////////////////////////////////

// ネットワーク系

////////////////////////////////////////////////////////////

// ネットワーク作るのがめんどくさかったので説明だけ。

// 私は使ったことありません。

Replicated

ネットワークからレプリケートする変数としてマークアップします。

サーバー側が常にプロパティの更新を行い、

その値をクライアント側にレプリケートします。

 

ReplicatedUsing

ReplicatedUsing = Functionで定義されたFunctionがコールバック関数として登録されます。

この変数がレプリケートされるときは、コールバック関数が実行されることで、ネットワークじょうでレプリケートされます。

 

RepRetry

このプロパティは完全な状態で送信されなかった時には再送信されます。

 

NotReplicated

レプリケーションをスキップします。

この指定子はサービスリクエスト関数の構造体メンバとパラメータのみに有効です。

 

////////////////////////////////////////////////////////////

// コンフィグ系

////////////////////////////////////////////////////////////

Config, GlobalConfig

Configで指定された.iniファイルへ永続的な値としてセーブされます。

GlobalConfigはConfigと同じですが、必ずベースクラスから読み込まれるようになります。

 

////////////////////////////////////////////////////////////

// アセットデータ系

////////////////////////////////////////////////////////////

AssetRegistrySearchable

なんかタグが自作できるっぽいです。

// 参考サイト

pafuhana1213.hatenablog.com

AssetDataの中にはパスやらなんやら色んなデータがありますが、

その中にTagsAndValuesという変数があるっぽいですね。

AssetRegistrySearchable指定子をつけてあげると、その変数の中に追加されると…

// なるほどわからん

f:id:You_O:20170925190916p:plain

一応アセットデータの中にはそれっぽいものがありました。

 

////////////////////////////////////////////////////////////

// マチネ系

// 使ったことない筆頭

////////////////////////////////////////////////////////////

 Interp

マチネで使える補間可能な変数。

常にエディタ上から編集できる。

 

すごい多いです。

この他にもメタデータ指定子というのが同じくらいあります。

では今日はここまで。

 

////////////////////////////////////////////////////////////

// 参考サイト

////////////////////////////////////////////////////////////

// UPROPERTY一覧

https://wiki.unrealengine.com/UPROPERTY#Instanced

// T3Dについて

http://historia.co.jp/archives/2588

// Exportについて

https://answers.unrealengine.com/questions/79810/uproperty-whats-the-use-of-the-export-keyword.html

// レプリケーションとは

https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

// アセットレジストリについて

https://wiki.unrealengine.com/UPROPERTY#Instanced

/* ありがとうございました */

UnrealEngine4の修行を積む。

UnrealEngineを触っていて一つ不便に思うことがあります。

 

参考サイトが英語しかねぇ!

 

ということで、つれづれなるまゝに、米語の電子掲示板に向かひて、如何すべからんと思ひしことをそこはかとなく書き付くれば、誰そために利きもがな。(たぶん正しくない)

 

////////////////////////////////////////////////////////////

//このブログではタイトル通りUnrealC++を触ります。

//Blueprintはおまけ程度に。

////////////////////////////////////////////////////////////

 

////////////////////////////////////////////////////////////

//コーディングルール

////////////////////////////////////////////////////////////

最初ということで、このブログでのコーディングルールを決めます。

まずはUnrealEngine4さんのコーディングルール

docs.unrealengine.com

 

UnrealEngine4さんはアッパーキャメルケース(例:UpperCamelCase)を使っています。

 

なので、私はUnrealEngine4さんのコードと区別する意図で、ローワーキャメルケース(例:lowerCamelCase)を利用しようと思います。

 

追加の接頭辞として、

m_:メンバ変数

s_:スタティック変数

の2つの接頭辞を追加します。

 

その他のルールはすべてUnrealEngine4さんのコーディングルールに従いましょう。

  

では、今日はここまで。

 

次回からはTPSテンプレートの(手打ちで)コピーを予定しています。