C++で作ってみましょう(*'ω'*)
今回はついにC++の説明をしていこうと思います。
一部UE関係ないC++特融のことなども少し紹介します。
今回は作る上で必ず使うであろう関数などを重点的に説明します。
※C++のすごく細かい知識などは少し省くかもしれません。
※GASなどの難しいお話は説明しません!
C++とはそもそも何?
より効率よく行えるプログラミング言語になります。
ヘッダーファイルとCPPファイルに分かれており、
ヘッダーファイルにはクラス定義や関数や定数などを宣言しておき、
CPPファイルの方に各種関数の処理を記載する形になります。
それからUE用処理のクラスや関数などが用意されているので、
それをBPと同様に呼び出して処理が作成できます。
公式ドキュメントにより細かい説明があるのでこちらもどうぞ。
UE4 の C++ プログラミング入門 | Unreal Engine ドキュメント
※補助されているとはいえ少しは知識が無いと厳しいので、
回転する床のActorを作ってみよう
まず作らないと話が始まらないので作っていきましょう!
とその前に環境構築からの説明になりますが、
私は今回VisualStudioCodeを使用しています。
VScodeの環境構築はこちらをご参照ください。
【UE5】VSCodeでプロジェクトのビルドを行う。 - アルゴンUE4/UE5&アプリ開発日記
VisualStudioを使用する場合は少し古いですが記載しています。
【UE4】VisualStudio2017でUE4を動かす(Windows) - アルゴンUE4/UE5&アプリ開発日記
実際にプロジェクトを作成していきます。
今回はC++プロジェクトを作成していきます。
サードパーソンテンプレートをC++プロジェクトで作成します。
プロジェクトを追加したらメニューのToolsから、
「NewC++Class…」を選択してC++用の処理ファイルを作成します。
選択したらアクターとファイルを選択できるダイアログが出ます。
元となるクラスが今回はActorになってほしいのでActorを選択して作成します。
作成するとTestActorのヘッダーファイルとCPPファイルが作成されます。
余談ですがVSCodeの場合は「Commands_Default.json」に、
追加したC++関連のファイルを追加します。
それでは実際に.h(ヘッダーファイル)の説明をしていきます。
まずは#pragma onceから説明します。
こちらは呼び出しているヘッダーファイルを、
何度も呼ばれないようにするための宣言になります。
その下は「#include "ヘッダーファイル名"」を記述しています。
今回はCoreMinimal.hやGameFramework/Actor.hや、
GameFramework/RotatingMovementComponent.hなどになります。
各種ヘッダーについての説明は下記になります。
・CoreMinimal.h
→ Vector2DやColorなどの値関連の変数を使用するための宣言
・GameFramework/Actor.h
→ Actor用の関数や変数を使用するための宣言
・GameFrameWork/RotatingMovementComponent.h
→ 各種回転動作を制御するコンポーネントを使用するための宣言
・TestActor.generated.h
→ UPROPERTYなどを生成する際に使用する宣言
※これ以降にヘッダーファイルを宣言するとエラーになるので注意!
続いて実際の処理について説明していきます。
まず一番上のGENERATED_BODY()からですね。
これはUEのC++の特徴でUCLASSを使用したUE4用のクラスとして、
使用する場合は必ず呼び出す必要のあるマクロになります。
続いてPublic:やProtected:などのアクセス修飾子になります。
Public →変数宣言後などほかのクラスでも呼び出せる。
Protected → サブクラスからなら呼び出せる。
private → 同一クラス内のみで呼び出せる。
続いて一番上のATestActor();についてですが、
こちらはコンストラクタ用の宣言になりBPで表すと下記のノードになります。
続いてvirtual void Tick(float DeltaTime) overrideになります。
C++のvirtual ? override? となる方が多いと思うので、
こちらも少し説明します。
まずVirtualについてですがこれは継承したクラスの関数を、
カスタムして使用したい時に使用します。
overrideを書く理由はオーバーライドした関数ということを表します。
ヘッダーファイル内の変数や関数について
UPROPERTYですがUE4上での変数の扱い方などを設定することが可能です。
細かい部分はこの後説明しますが書いてある部分は説明します。
EditAnywhere → どこでも編集が可能
Category ="" → カテゴリの設定
BlueprintReadWrite → BP上で呼び出せて編集等行えること
今回追加した変数で追加したものは、
回転板用のStaticMeshComponentと、
回転動作を司るRotatingMovementComponentと、
回転量の変数でFRotatorこの3つを作成しています。
ヘッダーファイルは宣言のみなので以上になります。
CPPファイル内の処理
今度はCPPファイルの方の紹介になります。
まず元のヘッダーファイルのみ宣言してます。
これによりヘッダーファイルの関数・変数を使用できます。
こちらはコンストラクタの処理になります。
ATestActor::ATestActor()がコンストラクタ用の宣言になります。
bCanEventTickでTickを使用するかどうかのフラグをfalseにしています。
※今回は使用していないのでfalseにしていますが
もし必要があればそのままにしてください。
StaticMeshComponentとしてSubobjectのStaticMeshを作成します。
必要はないですが一応ルートコンポーネントにアタッチしてます。
スタティックメッシュ用のモデルデータ情報をロードします。
モデルをロードできたらロードしたメッシュを適応します。
回転板にするために縦横の倍率を5にして縦幅を0.5fにする。
RotatingMovementComponentとしてSubobjectのRotationを作成します。
回転する軸の位置と回転量をそれぞれ設定します。
※ポインタ(*)の付いた変数は「->」アロー演算子で呼び出します。
BeginPlayの関数内になります。
※Super:BeginPlay();ではC++にはなくUE特融のものになります。
最後に回転量をRotationRate(RotationMovementの回転量)に渡します。
最後にTickになりますが今回は使用していないので何も処理はしません。
以上が今回作成した回転処理になります。
後はこれをマップ上でドラッグアンドドロップして配置したり、
回転速度が速い場合は数値を変更してみてください。
実際に動かしたものは下記ツイートになります。
ブログ用C++のみで作った回転足場 pic.twitter.com/8oeIQEjPOq
— アルゴンブログ公式 (@Argonblog) 2023年5月27日
UPROPERTYの説明
ここではもう少しUPROPERTUYについて、
少し触れていきたいと思います。
まずUPROPERTYとは何ぞや?というお話になるかと思います。
UPROPERTYとはUE特有のメタデータや指定子を設定するための、
マクロ宣言になります。
この中では主にどのようにUE上でアクセスできるか?
その他別の方法でのアクセスを有効にするかなど設定できます。
※余談ですがこういったマクロ関連の部分は、
Engine/Source/Runtime/CoreUObject/ObjectMacros.hに、
すべての設定方法が記されているのでこちらを見るのも便利です。
アクセス関係については私が説明するまでもなく、
下記のQiitaに分かりやすく説明されているので私の方では省きます。
それ以外で私が使いそうなものをいくつか紹介させていただきます。
〇Config・GlobalConfigについて
値や数値の変数の中でUPROPERTY(VisibleAnywhere,Config)と設定します。
次にUClass()の中に「Config=Game」を記載します。
実際にプログラムで書くと下記のような形になります。
こちらは各種ゲームの設定値を入れたりコンフィグの値を設定するのに、
便利だったりするので覚えておいて損はないかなと思い紹介しました。
ドキュメントにも紹介されてるのでもう少し細かい説明はこちらで。
コンフィギュレーション ファイル | Unreal Engine ドキュメント
それからGUI関係で行いたい場合は下記を参照
[UE4] 「エディタの環境設定」や「プロジェクト設定」に項目を追加する|株式会社ヒストリア
すいませんUPROPERTYまわりやUCLASS周りは色々あるんですが、
もっと細かく書くために別記事に分けようと思います。
※C++専用で何か作りたいなと思います。
Q&A
ここからはこの記事を書きながら疑問に思うかなと思ったことなどを、
Q&A方式で残していこうと思います。
※今後色々分かったことがあったら増やしていきます。
Q:プログラム言語に振れたことがないのでC++自体が良くわかりません。
A:まずはC++の元となっているC言語の扱いから学びましょう。
いくつか本もありますが動画で教えているサイトもあります。
まずはこちらをやってみるのが良いでしょう
C言語入門 (全22回) - プログラミングならドットインストール
本で個人的におすすめしている本をいくつか書いておきますね。
独習C++ 新版(高橋 航平 επιστημη(エピステーメー))|翔泳社の本
ゲームプログラミングC++(Sanjay Madhav 吉川 邦夫 今給黎 隆)|翔泳社の本
Q:UE関連のC++の書籍などを購入したいのですが、
どこかにまとまってないでしょうか?
A:C++onlyでリンクまとめてみました。
C++でつくるUnreal Engineアプリ開発for Windows & m / 鈴木 晃【著】 - 紀伊國屋書店ウェブストア|オンライン書店|本、雑誌の通販、電子書籍ストア
アンリアる! C++入門編 ~対話形式で学ぶUnreal Engine~ - Colory Games - BOOTH
Q:GetPlayerPawnなどの呼び出し方が分かりません・・・
A:Kismet/GameplayStatics.hから呼び出すことができます。
GameplayStatics内にGetPlayerCharacterやGetPlayerPawnなどがあります。
ヘッダーファイルの方に「#include kismet/GameplayStatics.hを宣言して」、
CPPファイルの方に下記のような形で呼び出すことで取得できます。
※GetWorldはどこからPlayerCharacterのデータを引っ張ってくるかを表します。
AActor::GetWorld()などクラスに合う形で取得してください。
ACharacter *TestCharacter = UGameplayStatics::GetPlayerCharacter(GetWorld(),0);
最後に
ここまで見ていただきありがとうございました!
今回はだいぶ文章が多めのものになりますが、
これだけの知識だとまだまだC++で全部作れる。
というわけにはいかないので今後もいろいろ記事を作っていこうと思います。
一旦はここまでで見ていただきありがとうございました。