🌥もこも制作日記🌥

創作に関することを書いていきます。だいたいゲーム系

【Unity2019.3.0a4】関数名を取得する方法。引数として必要になった時など

問題点

下のような関数名を引数として取る関数を使用する際に以下のような問題が起きる。

  • ベタ打ちによるタイポが発生
  • 関数名を修正する時に大変になる
  • methodNameとして渡す関数が、どこで使用されているか探す事が困難になる
public void RPC(string methodName, PhotonTargets target, params object[] parameters)
public void Invoke(string methodName, float time)

以下の章ではいくつかの解決方法を参考コードと共に記述したよー。
実際に使ってるコードから抜き出しました。若干見にくいかも。

解決方法①(本命じゃない)

Actionでラップする。
目的の関数名はActionのプロパティから取得する。

コード

public void UpdateColorByBelong(PhotonView photonView,int belongType)
{
 var rpcMethod = new Action(RpcUpdateColorByBelong);        
 photonView.RPC(rpcMethod.Method.Name,PhotonTargets.All,belongType);
}

[PunRPC]
private void RpcUpdateColorByBelong(int ghostType)
{
 _renderer.color = _colorTable[ghostType];
}

問題点

関数を実行するたびにインスタンスを生成するのは負荷的に心配。

解決方法②(本命じゃない)

Actionにキャストする。 大体問題点もコードも①と同じ。

コード

public void UpdateColorByBelong(PhotonView photonView,int belongType)
{
 var rpcMethod =  (Action<int>)RpcUpdateColorByBelong;        
 photonView.RPC(rpcMethod.Method.Name,PhotonTargets.All,belongType);
}

[PunRPC]
private void RpcUpdateColorByBelong(int ghostType)
{
 _renderer.color = _colorTable[ghostType];
}

問題点

毎回キャストするコストがどれだけ安く済むのか。
地味に引数に対応したActionを打ち込む手間がある。

解決方法③ (本命)

nameof演算子を用いる。
定数式らしいので実行時の計算負荷に影響がない。(下記URL先で定数式である事が確認できる。)

nameof演算子は関数を引数に取る。
なのでIDEにより容易に使用箇所が検索できる。
また、Renameの際にも文字列で参照している箇所がないかと恐れる必要がなくなる。

docs.microsoft.com

public void UpdateColorByBelong(PhotonView photonView,int belongType)
{
 photonView.RPC(nameof(RpcUpdateColorByBelong),PhotonTargets.All,belongType);
}

[PunRPC]
private void RpcUpdateColorByBelong(int ghostType)
{
 _renderer.color = _colorTable[ghostType];
}

終わりに

ベタ打ちタイポの恐怖から解放されました

Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル