UnityユーザーのためのUEブループリント入門
コードとビジュアル両方のスクリプトを比較してゲームエンジンを学びます

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デベロッパードキュメント
関数

関数の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でできるかできないという情報は見つかりませんでした。