(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

返り値を複数返したい時や値のスワップ(入れ替え)をしたい時はTuple(タプル)がオススメ【Unity】【C#】


このエントリーをはてなブックマークに追加

この記事でのバージョン
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);


ちなみにOdinShowInInspectorを使えば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}");