14. アクセス指定子(アクセス修飾子)
アクセス修飾子は、他スクリプトからの変数や関数へのアクセスをコントロールするかを設定するものです。Unity、Unreal Engineともに、他からのアクセスができるpublicと、アクセスができないようにするprivateのアクセス修飾子を持っています。
アクセス修飾子の種類
ワールドアウトライナ(インスペクター)の詳細パネルで編集できるメリット
14. アクセス修飾子
14.1 アクセス修飾子の種類
以下2種類の代表的なアクセス修飾子について
private
その型をメンバに含んでいる場合にのみアクセス可能
public
どこからでもアクセス可能、他のスクリプトからアクセスできる、インスペクターから値を調整できる
14.2 インスペクターで編集できるメリット
publicを使うとスクリプトを変更しなくても値を変更できます。インスペクターで値を設定すると、スクリプトの初期値は無視されます。また、play中に値を設定した場合、playを停止するとインスペクターの再生前の値に戻ります。
インスペクターで値を設定できる型
基本的には以下の型はplay中に値を設定できます。
int
float
double
char
string
bool
上記以外にもUnityが定義したものは可能なものがあります。
GameObject
Transform
インスペクターで値を編集できない型
MonoBehaviourを継承していないクラスは値を編集できません。また、構造体も値を編集できません。
14. アクセス指定子
14.1 アクセス指定子の種類
UE BPにもpublic,privateのアクセス修飾子があります。
「目が閉じたアイコン」がprivateのアクセス指定子です。外部のブループリントから直接アクセスができない変数になります。
どこかをクリックすると画像は閉じます
レベル上にアクセス指定子をprivateにした変数aをもつアクタを置いたとき、アクタの詳細パネルに変数aは表示されません。
どこかをクリックすると画像は閉じます
「目を開けたアイコン」がpublicのアクセス指定子です。エディタ上から直接値を設定したり外部のブループリントからアクセスしたりすることが可能な変数です。
どこかをクリックすると画像は閉じます
レベル上にアクセス指定子をpublicにした変数aをもつアクタを置いたとき、アクタの詳細パネルに変数aが表示されます。
どこかをクリックすると画像は閉じます
変数だけでなく、以下の機能についてもアクセス指定子の利用が可能です。[UEのみ]関数、イベント、マクロ、インターフェースとの違いにもアクセス指定子の項目があります。
private
変数、関数、マクロ
public
変数、イベント、関数、インターフェイス
protected
関数
protectedとは、現在のブループリント、そして現在のブループリントから派生したブループリントからのみ関数を呼び出せることを意味します。ここではpublicとprivateに絞って説明します。
🔗 参考リンク
Unreal Engineデベロッパードキュメント
関数
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/functions-in-unreal-engine
関数のpublic化とPrivate化
Unityと同じように、アクタAを作成して、関数Testを作成します。
どこかをクリックすると画像は閉じます
どこかをクリックすると画像は閉じます
関数Testは呼ばれることを確認できるように、Pring Stringノードが呼ばれるようにしておきます。
どこかをクリックすると画像は閉じます
関数Testをpublicにするには、関数Testの詳細パネルのAccess SpecifierをPublicにします。デフォルトはPublicです。
どこかをクリックすると画像は閉じます
次に、アクタBを作成します。
どこかをクリックすると画像は閉じます
アクタBの変数に、アクタA型の変数を作成します。
どこかをクリックすると画像は閉じます
アクタA型の変数の詳細パネルをみると、Variable TypeがAになっていることを確認します。
どこかをクリックすると画像は閉じます
変数名は適当にActorAとします。
ActorAをブループリント上に置きます。
どこかをクリックすると画像は閉じます
レベルから変数にアクセスできるように、ActorAの右側にある目を「目を開けたアイコン」に変更します。変更するには目のアイコンをクリックします。
どこかをクリックすると画像は閉じます
ActorAの出力ピンから検索して、Testと入力します。Function Testが候補に出てくることがわかります。
どこかをクリックすると画像は閉じます
FunctionのTestを選択します。
どこかをクリックすると画像は閉じます
BアクタのBeginPlayイベントに接続します。
どこかをクリックすると画像は閉じます
ここでBアクタをコンパイルして保存します。
どこかをクリックすると画像は閉じます
どこかをクリックすると画像は閉じます
次に、レベルにAアクタ、Bアクタそれぞれを配置します。Locationは特に気にしなくてよいです。
どこかをクリックすると画像は閉じます
レベルから直接、またはワールドアウトライナから、Bアクタを選択して、詳細パネルを確認します。
どこかをクリックすると画像は閉じます
DefaultのActor AにNoneと表示されている項目が確認できるので、Noneのところをクリックして、Aアクタを選択します。これはレベル上に配置したAアクタになります。
どこかをクリックすると画像は閉じます
どこかをクリックすると画像は閉じます
Playすると、Aアクタの関数Testが呼ばれていることが確認できます。
どこかをクリックすると画像は閉じます
次に、Aアクタの関数Testの詳細パネルのAccess SpecifierをPrivateにします。
どこかをクリックすると画像は閉じます
コンパイル、保存をしてから、再度Playすると、関数Testは呼ばれず、ActorAを呼ぼうとしたら何もアクセスできなかったというエラーが出力されます。
どこかをクリックすると画像は閉じます
どこかをクリックすると画像は閉じます
アクタのスポーン
アクタのスポーン(生成)でも、publicに設定された変数、関数を呼ぶことができます。
例えば、Aというアクタがpublicに設定されたA_intというInteger型の変数を持っているとします。
どこかをクリックすると画像は閉じます
そしてBというアクタからスポーンします。スポーンの方法は、Spawn Actor from Classノードを使います。右クリックで「spawn」と入力すると出てきます。 Spawn Actor from Classノードは、ゲーム中にキャラクターを生成したいというときに使います。
どこかをクリックすると画像は閉じます
どこかをクリックすると画像は閉じます
そしてclass nameにAアクタを選択します。
どこかをクリックすると画像は閉じます
Return Valueピンから検索して「get (変数名)」と入力します。ここでは「get a int」と入力します。入力時に_(アンダースコア)は使えません。検索の結果には_(アンダースコア)が表示されません。
どこかをクリックすると画像は閉じます
そのアクタがもつ変数をpublicにすることで変数を取得することができます。
どこかをクリックすると画像は閉じます
14.2 ワールドアウトライナの詳細パネルで編集できるメリット
UE BPについてもpublicを使うとスクリプトを変更しなくても値を変更できます。アクタCを作成して、Integer型の変数C_intを作成して、Publicにしてからコンパイル、保存します。C_intのデフォルト値は0にします。
どこかをクリックすると画像は閉じます
どこかをクリックすると画像は閉じます
イベントグラフのTickイベントからPrint Stringノードを作成します。さらにC_Int変数のGetノードを置きます。変数C_Intをイベントグラフにドラッグ&ドロップしてから、Get C_Intを選択します。別の方法も紹介しますと、変数C_Intを選択した状態でCtrlを押しながらドラッグ&ドロップすると、Getノードとして配置できます。最後に、Pring StringノードのInStringピンに変数C_IntのGetノードの出力ピンから接続します。
どこかをクリックすると画像は閉じます
コンパイル、保存してから、レベルに戻り、アクタCをレベルに置き、Playします。
変数C_Intの初期値が連続表示されています。
どこかをクリックすると画像は閉じます
ワールドアウトライナからアクタCを選択して、詳細パネルの変数C_Intをマウスで左右にドラックしたり、直接数値を入力します。
どこかをクリックすると画像は閉じます
数値が変更されていくことが確認できます。
どこかをクリックすると画像は閉じます
Unityでいうところのシリアライズが、UE BPでできるかできないという情報は見つかりませんでした。