LoginSignup
0
0

[UEFN][Verse] Verse言語の配列/arrayをC#と比較しながら完全に理解したい。

Last updated at Posted at 2023-10-07

こんにちは、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

コードスタイルは強制ではないですが、慣習的にこのようなことが多いようです。
慣れていきましょう。

宣言の文法

それぞれ見ていきましょう

verseの配列
変数名 : [] = arrau{}
ArrayName1 : []type = array{}
ArrayName2 : []int = array{1, 2, 3, 4, 5}
ArrayName2.Length # 5
ArrayName2[2] # 3

image.png

c#の配列
[] 変数名;
type[] ArrayName1;
int[] ArrayName2 = { 1, 2, 3, 4, 5 };
ArrayName2.Length // 5
ArrayName2[2] // 3
int[] ArrayName3 = new int[5];

型名と変数名の書く位置が逆なので、気を付けてください。

Verseには new int[5]という書き方がない?

ないっぽいです。もし見つけたら教えてください。

配列の値の使い方

verseの配列
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}")
c#の配列
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言語の特殊な部分です。

先ほどの例だと

verseの配列の要素は失敗コンテキストの中のみで使用可能
if (Element := ExampleArray[Index]):
    # 何か書く

これがC#など他の言語との大きな違いです。
まぁとりあえず「if文で書かないといけない」と覚えておけば最初は良い気がします。

失敗コンテキストについては別の記事で解説出来たらと思います。

配列の要素を変更する

verseの配列
var ExampleArray : []int = array{1, 2, 3, 4, 5}
set ExampleArray[1] = 20
# array{1, 20, 3, 4, 5}
c#の配列
int[] exampleArray = new { 1, 2, 3, 4, 5 };
exampleArray[1] = 20;
// 1,20,3,4,5

Verseで配列の値を変更する場合、

  • varで宣言
  • setつきで変更

ということを気を付ける必要があります。

多次元配列

おまけで多次元配列も見ていきましょう。

verseの配列
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]
c#の配列
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ライフを!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0