Unityと言うよりはC#の話です。C#ではメソッドの返り値に1つの型しか指定することができません。
そこで複数のパラメータをメソッドで返す場合にどうしたら良いかを紹介したいと思います。
#自分で新しくクラスや構造体を定義する
**最も無難で正統派な方法。**自分でそういった複数の型を内部に持つクラスや構造体を作ってしまう。
用途に合わせていちいちクラスを定義することは結構面倒くさいのが難点だが、コードの可読性はかなり高まる。
outキーワードを使う
Pyhisics.Raycast等でも登場するoutを使うパターン。
メソッドの引数定義にoutを指定することで、その引数を出力用の変数として宣言することができます。
ただoutを使うとコードが汚くなっていくので自分はあまり好きじゃないです。
out
void Start()
{
string loadData;
var isSuccessed = LoadData(out loadData);
if (isSuccessed)
{
Debug.Log(loadData);
}
}
/// <summary>
/// データをロードする
/// </summary>
/// <param name="data">読み込み成功時の値</param>
/// <returns>ロードの成否</returns>
bool LoadData(out string data)
{
try
{
//なんかロード処理
data = ("ロードしたデータ");
//成功したらtrueを返す
return true;
}
catch
{
data = null;
//例外が出たらfalseを返す
return false;
}
}
ValueTupleを使う
C#7以降ならValueTuple(タプル)が使えます。
返り値のパラメータ数が多くないならValueTupleでも十分使えます。
protected void Start()
{
// 分解代入できる
var (isSucceed, result) = LoadData();
if (isSucceed)
{
Debug.Log(result);
}
}
private (bool,string) LoadData()
{
try
{
//ココらへんでロード処理
return (true, "ロードしたデータ");
}
catch
{
return (false, null);
}
}
#まとめ
- 専用の型を用意してそれにまとめるのが一番安全だが、面倒くさい
- ValueTupleは便利だが、戻り値の数が増えるとぐちゃぐちゃになるので乱用は注意