ふわーりんの勉強まとめ

勉強したことを忘れない為のブログ

C# regionディレクティブ

振り返ってみると前の記事からおよそ1年・・・

全然更新していませんでした。すみません

 
ここからが本題です。

UnityなどでC#スクリプトを書いているときにメソッドを探す時いちいちスクロールするの面倒くさいなぁ~メソッドや変数の宣言を折りたたむことができればなぁ
と思い調べてみればregionディレクティブという良い機能がありましたので使ってみました。
 
はじめにディレクティブを使用しているスクリプトと使用していないスクリプトでエディタ内の表示比較してみます。

※今回サンプルとしてUnityちゃんに付属している「IdelChanger.cs」を使わせていただきました。

スクリプトファイルの比較

・regionディレクティブを使用していないスクリプト
	public class IdleChanger : MonoBehaviour
	{
	
		private Animator anim;						// Animatorへの参照
		private AnimatorStateInfo currentState;		// 現在のステート状態を保存する参照
		private AnimatorStateInfo previousState;	// ひとつ前のステート状態を保存する参照
		public bool _random = false;				// ランダム判定スタートスイッチ
		public float _threshold = 0.5f;				// ランダム判定の閾値
		public float _interval = 10f;				// ランダム判定のインターバル
		//private float _seed = 0.0f;					// ランダム判定用シード
	


		// Use this for initialization
		void Start ()
		{
			// 各参照の初期化
			anim = GetComponent<Animator> ();
			currentState = anim.GetCurrentAnimatorStateInfo (0);
			previousState = currentState;
			// ランダム判定用関数をスタートする
			StartCoroutine ("RandomChange");
		}
	
		// Update is called once per frame
		void  Update ()
		{
			// ↑キー/スペースが押されたら、ステートを次に送る処理
			if (Input.GetKeyDown ("up") || Input.GetButton ("Jump")) {
				// ブーリアンNextをtrueにする
				anim.SetBool ("Next", true);
			}
		
			// ↓キーが押されたら、ステートを前に戻す処理
			if (Input.GetKeyDown ("down")) {
				// ブーリアンBackをtrueにする
				anim.SetBool ("Back", true);
			}
		
			// "Next"フラグがtrueの時の処理
			if (anim.GetBool ("Next")) {
				// 現在のステートをチェックし、ステート名が違っていたらブーリアンをfalseに戻す
				currentState = anim.GetCurrentAnimatorStateInfo (0);
				if (previousState.nameHash != currentState.nameHash) {
					anim.SetBool ("Next", false);
					previousState = currentState;				
				}
			}
		
			// "Back"フラグがtrueの時の処理
			if (anim.GetBool ("Back")) {
				// 現在のステートをチェックし、ステート名が違っていたらブーリアンをfalseに戻す
				currentState = anim.GetCurrentAnimatorStateInfo (0);
				if (previousState.nameHash != currentState.nameHash) {
					anim.SetBool ("Back", false);
					previousState = currentState;
				}
			}
		}

		void OnGUI ()
		{
			GUI.Box (new Rect (Screen.width - 110, 10, 100, 90), "Change Motion");
			if (GUI.Button (new Rect (Screen.width - 100, 40, 80, 20), "Next"))
				anim.SetBool ("Next", true);
			if (GUI.Button (new Rect (Screen.width - 100, 70, 80, 20), "Back"))
				anim.SetBool ("Back", true);
		}


		// ランダム判定用関数
		IEnumerator RandomChange ()
		{
			// 無限ループ開始
			while (true) {
				//ランダム判定スイッチオンの場合
				if (_random) {
					// ランダムシードを取り出し、その大きさによってフラグ設定をする
					float _seed = Random.Range (0.0f, 1.0f);
					if (_seed < _threshold) {
						anim.SetBool ("Back", true);
					} else if (_seed >= _threshold) {
						anim.SetBool ("Next", true);
					}
				}
				// 次の判定までインターバルを置く
				yield return new WaitForSeconds (_interval);
			}

		}

	}
regionディレクティブを使用したスクリプト

f:id:konapurinn:20190323225555p:plain

116行あったスクリプトがわずか13行に折りたたむことができました。
折りたたんでいるので、あるメソッド(例えばStartメソッド)を変更したい際は、そのメソッドのみ展開し編集することができます。

使用方法

使用するには折りたたむ最初の箇所に「#region」、最後の箇所に「#endregion」と記入します。
さらに「#region」のあとに任意の言葉を記入することができます

使用例

f:id:konapurinn:20190323231207p:plain
ディレクティブ使用例(Startメソッド)

最後に

今回はスクリプトが膨大になった際に役立つディレクティブ機能を紹介しました。
スクリプトが膨大になって、いちいちメソッドを探すのが面倒で困っている人などのお力になれたら幸いです。


f:id:konapurinn:20190323232038p:plain

この作品はユニティちゃんライセンス条項の元に提供されています
unity-chan.com

リファレンス

docs.microsoft.com


今回の記事で間違っていることなどありましたらTwitterで連絡してくれると助かります。


Twitter:https://twitter.com/fuwafuwahrin?lang=ja