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

7. 変数と型

プログラムではデータをやりとりするのに変数を使います。変数という箱の種類で入れられる物が変わりますが、Unreal Engineブループリントについての変数について説明します。
  • 変数の範囲
  • 基本的な型
  • 何が値型で何が参照型か
  • 値型で気を付ける事
  • 参照型で気を付ける事

7. Unityの変数と型

7.1 型

例えば以下のような変数を定義したスクリプトがあります。
//整数型の変数intにaとつけて1を入れる
int a = 1;
void Start(){
    Debug.Log(a);
}
void Update(){
}
変数についての説明は省略します。intとは変数の種類で"型"と言います。変数の名前は自分で好きな名前を付けられることができます。変数の中身にあらかじめ何をいれるか(初期値)は省略可能です。

7.2 変数の範囲

変数の有効範囲はクラスの中で定義することができ、メソッドのなかでも定義することができます。メソッド内で定義した変数の有効範囲はメソッド内で定義した位置より下になります。例えば以下のプログラムではStartメソッド内で定義した変数bを別のメソッド、Updateメソッドで呼び出すことはできません。
int a = 1;
void Start(){
    int b = 2;
    Debug.Log(a);
    Debug.Log(b);
}
void Update(){
    Debug.Log(a);
    //エラー メソッド内で定義されていない、かつ他メソッドで定義された変数を呼ぶことができない
    Debug.Log(b);
}
また、クラス内の範囲内で変数を定義するときは、その変数を呼ぶメソッドが上に位置しても有効になります。
public class test{
    void Start(){
        int b =  2;
        Debug.Log(a);
        Debug.Log(b);
    }
    void Update(){
        Debug.Log(a);
    }
    int a = 1;
}
メソッド内の変数は、定義した位置の下から有効になります。有効範囲のことをスコープと呼びます。
void Start(){
    Debug.Log(a);
    Debug.Log(b);
    int b =  2;
}
void Update(){
    Debug.Log(a);
}
int a = 1;
bを複数定義してもスコープが違うとエラーになりません。同名の変数があった場合、スコープが狭い方が有効になります。
int b = 4;
void Start(){
    int b = 2;
    Debug.Log(b);
}
void Update(){
    int b = 3
    Debug.Log(a);
}
int a = 1;
同じスコープ内で同名の変数の定義はエラーになります。
int b = 4;
void Start(){
    int b = 2;
    int b = 5;
    Debug.Log(b);
}
void Update(){
    int b = 3
    Debug.Log(a);
}
int a = 1;

7.3 基本的な型

基本的な型
int型 整数
float型 有効桁数7桁の浮動小数
double型 有効桁数16桁の浮動少数
char型 1文字
string型 文字列
bool型 真か偽か
Transform型 位置(Location)、回転(Rotator)、スケール(Scale)を含んだ3Dトランスフォーム
Vector3型 ベクター(x,y,z)を扱う
string型の変数nameを定義して、初期値を与えます。
string name = "上田次郎";
void Start(){
    Debug.Log("私は" + name + "です!");
}
void Update(){
}
ゲームオブジェクトには常にTransformコンポーネントが設定されています。TransformコンポーネントはTransform型の変数から参照されます。
  • Transformコンポーネント
    • Position Vector3型
    • Rotation Quaternion型
    • Scale Vector3型
Transform型の変数を参照する場合は以下のように記述します。Transformクラスの中の変数positionにアクセスします。
transform.position += Vector3.right;
  • Vector3型
    • x float型
    • y float型
    • z float型
x,y,zで位置を表現します。

7.4 何が値型で何が参照型か

以下の型以外にもありますが、とりあえずここでの整理は、Unreal Engineとの比較の説明もありますので、以下を列挙します。この整理の引用は++C++; // 未確認飛行Cのサイトを参考に、Unityの情報を追加したものになります。サイトのURLを以下に記載しておきます。
値型 構造体型 struct(Vector3など)
数値型 整数型 byte,sbyte,char,int
浮動小数点型 float,double
bool
enum
参照型 class(Transformなど)
interface
delegate
object(GameObject)
string
配列,List,Dictionary
メソッド(func,action)
※ stringは参照型ですが挙動は値型と同じです。
🔗 参考リンク
たのしい工学
【Unityで学ぶ】C#の基本
++C++; // 未確認飛行 C
値型と参照型

7.5 値型で気を付ける事

値型はその変数自身が実データを持ちます。以下のスクリプトにあるVector3型のvはTransform型とは無関係です。
アクセス時間が短いです。軽いデータを扱うときは値型の方が早いです。
Vector3 v;
void Start(){
    v = transform.position;
}
void Update(){
    v += Vector3.right;
}

7.6 参照型で気を付ける事

参照型はアドレスでデータを扱う型です。実体を1つ持ち、1回の作成で1つ分のメモリを消費します。重いデータは参照型の方を使うことが多いです。
Transform t;
void Start(){
    t = transform;
}
void Update(){
    t.position += Vector3.right;
}

7. UEの変数と型

7.1 型

UE BPで変数を使うための準備をします。まずブループリントエディタのVariableのボタンを押します。
最初に変数を作成するときはBoolean型がデフォルトになっています。名前をaにします。
詳細パネルでVariable TypeをIntegerに変更します。
My BlueprintパネルのVariables項目の変数aの型がInteger型の色になっていることが確認できます。
※変数名左をクリックしても型を変えることができます。
UE BPも初期値を設定することは可能です。初期値を設定する場合は、一度ブループリントエディタでコンパイルが必要になります。コンパイルボタンを押すことでコンパイルが完了します。
初期値が編集できるようになります。
レベルブループリント上に変数aをドラッグ&ドロップします。このときGetかSetかを聞いてくるので、Getを選択します。
下図はStartイベントノードで変数の値を出力するブループリントになります。

7.2 変数の範囲

UE BPには「プログラムの初期状態とそれぞれの意味」で説明したとおり、変数の範囲という概念がありません。
変数bを作成して以下のようなブループリントを作成します。変数aに初期値1を与えておきます。
こちらはUnityで説明したクラス内の範囲内で変数を定義したときに示したスクリプトと同じものをイベントグラフで記述したものですが、クラスとメソッドで変数を設定する範囲の違いという考え方は無いので、変数aの初期値が表示されます。

7.3 基本的な型

基本的な型
Integer型 整数
Float型 有効桁数7桁の浮動小数
Vector型 ベクター(x,y,z)を扱う
Boolean型 真か偽か
Object型 全てのUnrealEngineの基底オブジェクト
String型 テキストString
Text型 ローカライズされたテキストString
Rotator型 3D回転(X:Roll, Y:Pitch, Z:Yaw)
Transform型 位置(Location)、回転(Rotator)、スケール(Scale)を含んだ3Dトランスフォーム
アクタ型 アクタ型はアクタの参照データを扱う
String型の変数nameを定義して、初期値を与えます。
Unityのスクリプトと同じ処理をUE BPで作成します。
デフォルトのアクタが持っているDefaultRootSceneコンポーネントのTransformプロパティが持っているLocation情報を取得する方法を紹介します。まず適当にaという名前のアクタを作成します。
アクタaをダブルクリックしてブループリントエディタを開いてから、EventGraphを開いて、GetActorTransformノードを置きます。GetActorTransformノードは、インプットピンのTargetがselfになっている場合は、aアクタからTransform情報を取得するノードです。
CubeアクタのTransformから、Split Struct Pinを選択すると、Location、Rotation、Scale情報が参照できるようになります。
さらにTransformよりBreak Vectorノードを接続することで、x,y,z情報が参照できるようになります。
TickイベントノードをつけているのはSetActorLocationノードの実行ワイヤーの接続元として引用しただけです。Vector RightノードはMake VectorノードでX:0,Y:1,Z:0に設定したものと同じ動きをします。

ショートカットキー

変数をドラッグ&ドロップするとGetノードにするかSetノードにするかを聞いてきます。
Ctrlキーを押しながら変数をドラッグ&ドロップするとGetノード、Altキーを押しながら変数をドラッグ&ドロップするとSetノードとして、それぞれ表示されるので、GetノードかSetノードかを選択する手間が省けます。

変数への昇格

ノードのピンから「変数へ昇格」で変数を作成することが可能です。

7.4 何が値型で何が参照型か

以下の表は、基本的な型で列挙した様々な型について、値型か参照型かを整理した表になります。
値型 構造体型 構造体(Vector,Rotator,Scaleなど)
数値型 整数型 char,Integer
浮動小数点型 Float,double
Boolean
Enumeration
参照型 Transform
コンポーネント(Actorコンポーネント、Sceneコンポーネント等)
Text
アクタ(Object)
String
配列
Transformの元となるBP C++で取り扱うFTransformは値型の構造体です。UE BPの場合、アクタのTransformに対して、GetActorTransformノードまたはSetActorTransformノードを使ってアクセスする場合は、参照型として扱われますので、Transformは参照型に分けています。
参照型の変数は、オブジェクト (アクタ、ポーン、キャラクターなど) の豊富なデータや機能に (要領よく) アクセスするための窓口と簡単に考えておいてよいかと思います。
🔗 参考リンク
Unreal Engineデベロッパードキュメント
ブループリントの構造体変数
Unreal Engineデベロッパーフォーラム
(動画チュートリアル関連) 変数の型で Reference とはどのようなものですか?
Object型については、変数を渡す時には値渡しになりますが、Object型はサイズが大きい可能性が高く、単純なコピーを渡してしまうと処理時間のコストが高くなってしまうため、アクタの親クラスでもあるObject型の場合は、参照渡しになります(逆引きP.87より)。

データピンが値型か参照型かはピンが丸形かひし形かで判別できます。詳細は以下のブログでご確認ください。
🔗 参考リンク
キンアジのブログ
【UE4】Blueprintパラメーターの参照渡しについて【★★】

7.5 値型で気を付ける事

値型はそれぞれが実データを持ちます。
Unityで作成したプログラムと同じものをUE BPで作成します。
構造体Vector型の変数vを作成します。
Cubeのコンポーネントを追加します。
以下のようなブループリントを作成します。
PlayするとCubeはY軸の正の方向に動きます。

7.6 参照型で気を付ける事

参照型はアドレスでデータを扱う型です。
Unityで作成したプログラムと同じものをUE BPで作成します。
Transform型の変数tを作成します。
コンポーネントにCubeを追加します。
以下のようなブループリントを作成します。
PlayするとCubeはY軸の正の方向に動きます。