こんにちは、Unity/Unrealエンジニアのイワケンです。
最近はUEFNを楽しんでいます。
さて、UEFN(Fortnite)でマップを作る際にVerse言語を使えるわけですが、プログラミング言語の基本である「配列(array)」も「クセつよ!」です。なので完全に理解するために、ドキュメントを解説しつつ、私の好きな言語「C#」と比較しながら、具体例のコードで理解していきたいと思います。
Verse配列理解の3行まとめ
- コードのスタイルガイドの違いに気を付けろ
- 配列の要素はif文の中で使おう
- 値を更新する時は、varで宣言。setで更新
今回の参考ドキュメント
Verse言語の配列
C#の配列
配列とは
そもそも配列とはという話なのですが、目的としては 「同じ型の複数の値や変数を管理する」 があげられます。
VerseとC#のスタイルガイドの違い
VerseとC#はコードスタイルが違います。てかほぼ逆です。なのでUnityエンジニアは最初混乱します。
Verse | C# | |
---|---|---|
型名 | lower_snake_case | PascalCase |
変数名 | PascalCase | camelCase or PascalCase |
コードスタイルは強制ではないですが、慣習的にこのようなことが多いようです。
慣れていきましょう。
宣言の文法
それぞれ見ていきましょう
変数名 : []型 = arrau{}
ArrayName1 : []type = array{}
ArrayName2 : []int = array{1, 2, 3, 4, 5}
ArrayName2.Length # 5
ArrayName2[2] # 3
型[] 変数名;
type[] ArrayName1;
int[] ArrayName2 = { 1, 2, 3, 4, 5 };
ArrayName2.Length // 5
ArrayName2[2] // 3
int[] ArrayName3 = new int[5];
型名と変数名の書く位置が逆なので、気を付けてください。
Verseには new int[5]という書き方がない?
ないっぽいです。もし見つけたら教えてください。
配列の値の使い方
ExampleArray : []int = array{1, 2, 3, 4, 5}
for (Index := 0..ExampleArray.Length-1):
if (Element := ExampleArray[Index]):
Print("{Element} in ExampleArray at index {Index}")
int[] exampleArray = new { 1, 2, 3, 4, 5 };
for (int i = 0; i < exampleArray.Length; i++){
Console.WriteLine(exampleArray[i]);
}
Verse言語の配列の要素へのアクセス は 「失敗する可能性がある式 (failable expression)」 であり、if文
などの 「失敗コンテキスト (failure context)」 でしか使用することができません。ここがVerse言語の特殊な部分です。
先ほどの例だと
if (Element := ExampleArray[Index]):
# 何か書く
これがC#など他の言語との大きな違いです。
まぁとりあえず「if文で書かないといけない」と覚えておけば最初は良い気がします。
失敗コンテキストについては別の記事で解説出来たらと思います。
配列の要素を変更する
var ExampleArray : []int = array{1, 2, 3, 4, 5}
set ExampleArray[1] = 20
# array{1, 20, 3, 4, 5}
int[] exampleArray = new { 1, 2, 3, 4, 5 };
exampleArray[1] = 20;
// 1,20,3,4,5
Verseで配列の値を変更する場合、
- varで宣言
- setつきで変更
ということを気を付ける必要があります。
多次元配列
おまけで多次元配列も見ていきましょう。
var Counter : int = 0
Example : [][]int =
for (Row := 0..3):
for(Column := 0..2):
set Counter += 1
if (NumberOfColumns : int = Example[0].Length):
for(Row := 0..Example.Length-1, Column := 0..NumberOfColumns):
if (Element := Example[Row][Column]):
Print("{Element} at index [{Row}][{Column}]")
出力は
1 at index [0][0]
2 at index [0][1]
3 at index [0][2]
4 at index [1][0]
5 at index [1][1]
6 at index [1][2]
7 at index [2][0]
8 at index [2][1]
9 at index [2][2]
10 at index [3][0]
11 at index [3][1]
12 at index [3][2]
int[,] Example = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12} };
for (int i = 0;i < Example.GetLength(0); i++){
for (int j = 0; j < Example.GetLength(1); j++){
System.Console.WriteLine("Element({0},{1})={2}", i, j, Example[i, j]);
}
}
出力は
/* Output:
Element(0,0)=1
Element(0,1)=2
Element(0,2)=3
Element(1,0)=4
Element(1,1)=5
Element(1,2)=6
Element(2,0)=7
Element(2,1)=8
Element(2,2)=9
Element(3,0)=10
Element(3,1)=11
Element(4,2)=12
*/
余談: 値型か参照型か
配列と言えば参照型という私の感覚なのですが、Verseの配列は値型なのでは...? というXポストを見かけたのですが、まだ検証していません。詳しい人教えてください。
まとめ
本記事では、Verse言語の配列/arrayを理解するためにC#と比較しながら注意ポイントをまとめてみました。
3行まとめはこちら
- コードのスタイルガイドの違いに気を付けろ
- 配列の要素はif文の中で使おう
- 値を更新する時は、varで宣言。setで更新
では、楽しいVerseライフを!