この記事でのバージョン
Unity 2021.3.11f1
はじめに
先日Unity公式のYoutubeチャンネルにC#のTuple(タプル)に関する動画が上がっていました。
自分は全然Tupleを使いこなせていなかったので、勉強がてら記事にまとめてみました!
Tupleとは
そもそもTupleとはなんぞやという所からですが、いわゆる無名構造体というやつで、
構造体を変数生成と同時に宣言して使える
というC# 7.0からの機能です。(なので昔のUnityでは使えなかった)
例えばステータス等の複数のデータをまとめたい時は以下のような感じがstructを宣言しますが、
//ステータスの構造体 public struct Status { //各ステータス public int Hp, Atk, Def; //各ステータスを指定して作成 public Status(int hp, int atk, int def) { Hp = hp; Atk = atk; Def = def; } }
//ステータス初期化 var status = new Status(100, 10, 20); //10のダメージ status.Hp -= 10;
Tupleを使えば変数作成と同時に構造体を宣言出来るので
その場限りでしか使わない時などに非常に便利です。
//ステータス作成(変数作成と同時に構造体を宣言) (int Hp, int Atk, int Def) status = (100, 10, 20); //10のダメージ status.Hp -= 10;
さらに構造体内の変数名を右辺で設定したり、
var status = (Hp:100, Atk:10, Def:20);
そもそも変数名を省略出来たりとかなり融通も効きます。
var status = (100, 10, 20); //変数名を省略した場合はItem1, Item2……という名前になる status.Item1 -= 10;
なお、シリアライズは出来ないようでした。
//シリアライズはされない(Inspectorに表示されない) [SerializeField] private (string, int) Sample = ("さんぷる", 1);
ちなみにOdinのShowInInspectorを使えばInspectorの表示や値変更が可能でした。
//Inspectorに表示(シリアライズされるわけではない) [ShowInInspector] private (string, int) Sample = ("さんぷる", 1);
![]() |
Tupleの使い所
気になるTupleの使い所ですが、やはり一番はメソッドで複数の返り値が欲しい時です。
普通はわざわざ返り値専用のクラスを宣言したり、
outで受け取ったりとひと手間必要になりますが、Tupleなら簡潔に実装出来ます。
//booとintの2つの返り値を返すメソッド public (bool flag, int value) Sample() { return (false, 2); }
//2つの返り値を取得 var result = Sample(); if (result.flag) { var value = result.value; }
さらに値のスワップ(入れ替え)がなんと1行で行えちゃいます……!
int a = 1, b = 2; Debug.Log($"a {a}, b {b}"); (a, b) = (b, a); //aとbの値を入れ替える Debug.Log($"a {a}, b {b}");
![]() |