趣味のゲーム開発 vol.26

今回はスクリプトの整理を行いたいと思います。

まず、画面に表示しているライフやステージ名などの表示管理クラスを一つに統合したいと思います。
テキスト一つ一つに別のスクリプトをアタッチしていると、修正する時に探すのが手間なので・・・
後は、部分的に共通化できるならしたいかなと。

イメージとしては、表示オブジェクトの親オブジェクト(Canvas)にアタッチする画面表示全般を司るクラスを作る感じです。

親オブジェクトから子オブジェクトの取得は
Transform.GetChild(n).gameObject
nはヒエラルキービュー上の上からの順番(0始まり)

複数存在していた、画面表示系スクリプトを統合し、以下の通りクラスを作成しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DisplayManager : MonoBehaviour
{
   // 表示用オブジェクト
   private Text lifeText;
   private Text scoreText;
   private Text stageText;
   private int oldLifeNum;
   private int oldScore;
   private int oldStageNum;
   // Start is called before the first frame update
   void Start()
   {
       lifeText = transform.GetChild(3).GetComponent<Text>();
       scoreText = transform.GetChild(0).GetComponent<Text>();
       stageText = transform.GetChild(1).GetComponent<Text>();
       if (CheckNullObject())
       {
           UpdateLifeNum(GManager.instance.lifeNum);
           UpdateScore(GManager.instance.score);
           UpdateStageNum(GManager.instance.stageNum);
       }
   }
   // Update is called once per frame
   void Update()
   {
       UpdateLifeNum(GManager.instance.lifeNum);
       UpdateScore(GManager.instance.score);
       UpdateStageNum(GManager.instance.stageNum);
   }
   /// <summary>
   /// nullチェック
   /// </summary>
   /// <returns></returns>
   private bool CheckNullObject()
   {
       bool ret = true;
       if (GManager.instance == null ||
           lifeText == null ||
           scoreText == null ||
           stageText == null)
       {
           ret = false;
       }
       return ret;
   }
   /// <summary>
   /// ライフを更新する
   /// </summary>
   /// <param name="val">上書きするライフ値</param>
   public void UpdateLifeNum(int val)
   {
       // 値に変更があった場合のみ更新
       if (oldLifeNum != val)
       {
           lifeText.text = "x " + val.ToString();
           oldLifeNum = val;
       }
   }
   /// <summary>
   /// スコアを更新する
   /// </summary>
   /// <param name="val">上書きするスコア値</param>
   public void UpdateScore(int val)
   {
       // 値に変動があった場合のみ更新
       if (oldScore != val)
       {
           scoreText.text = "Score " + val.ToString();
           oldScore = val;
       }
   }
   /// <summary>
   /// ステージ数を更新する
   /// </summary>
   /// <param name="val">上書きするステージ数</param>
   public void UpdateStageNum(int val)
   {
       // 変動があった場合のみ更新
       if (oldStageNum != val)
       {
           stageText.text = "Stage " + val.ToString();
           oldStageNum = val;
       }
   }
}

こいつをCanvasオブジェクトにアタッチしてやったところ、問題なさそうだったので、これでOKとしましょう。

まだ時間に余裕があったので、ついでにClearEffectクラスも統合し、StageControllerクラスのクリア処理も
合わせて変更しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DisplayManager : MonoBehaviour
{
   [Header("クリア用アニメーションカーブ")] public AnimationCurve curve;
   [Header("ステージ管理クラス")] public StageControler sCtrl;
   [Header("クリア表示用オブジェクト")] public GameObject clearObject;
   // クリア状態フラグ
   private bool isClear = false; // クリア状態
   private bool compClear = false; // クリア完了
   // 表示用オブジェクト
   private Text lifeText;
   private Text scoreText;
   private Text stageText;
   
   private int oldLifeNum;
   private int oldScore;
   private int oldStageNum;
   private float clearTimer = 0.0f; // クリア処理用
   // Start is called before the first frame update
   void Start()
   {
       lifeText = transform.GetChild(3).GetComponent<Text>();
       scoreText = transform.GetChild(0).GetComponent<Text>();
       stageText = transform.GetChild(1).GetComponent<Text>();
       if (CheckNullObject())
       {
           UpdateLifeNum(GManager.instance.lifeNum);
           UpdateScore(GManager.instance.score);
           UpdateStageNum(GManager.instance.stageNum);
       }
       clearObject.SetActive(false);
   }
   // Update is called once per frame
   void Update()
   {
       UpdateLifeNum(GManager.instance.lifeNum);
       UpdateScore(GManager.instance.score);
       UpdateStageNum(GManager.instance.stageNum);
       if (isClear) { DoClearEffect(); }
   }
   /// <summary>
   /// クリアエフェクトの表示開始処理
   /// </summary>
   public void StartClearEffect()
   {
       isClear = true;
   }
   /// <summary>
   /// クリアエフェクト
   /// </summary>
   private void DoClearEffect()
   {
       if (clearObject == null)
       {
           Debug.Log("clearObject is null");
           return;
       }
       else
       {
           clearObject.SetActive(true);
       }
       if (!compClear)
       {
           if (clearTimer < 1.0f)
           {
               clearObject.transform.localScale = Vector3.one * curve.Evaluate(clearTimer);
               clearTimer += Time.deltaTime;
           }
           else
           {
               clearObject.transform.localScale = Vector3.one;
               sCtrl.ChangeScene(GManager.instance.stageNum + 1);
               compClear = true;
           }
       }
   }
   /// <summary>
   /// nullチェック
   /// </summary>
   /// <returns></returns>
   private bool CheckNullObject()
   {
       bool ret = true;
       if (GManager.instance == null ||
           lifeText == null ||
           scoreText == null ||
           stageText == null)
       {
           ret = false;
       }
       return ret;
   }
   /// <summary>
   /// ライフを更新する
   /// </summary>
   /// <param name="val">上書きするライフ値</param>
   public void UpdateLifeNum(int val)
   {
       // 値に変更があった場合のみ更新
       if (oldLifeNum != val)
       {
           lifeText.text = "x " + val.ToString();
           oldLifeNum = val;
       }
   }
   /// <summary>
   /// スコアを更新する
   /// </summary>
   /// <param name="val">上書きするスコア値</param>
   public void UpdateScore(int val)
   {
       // 値に変動があった場合のみ更新
       if (oldScore != val)
       {
           scoreText.text = "Score " + val.ToString();
           oldScore = val;
       }
   }
   /// <summary>
   /// ステージ数を更新する
   /// </summary>
   /// <param name="val">上書きするステージ数</param>
   public void UpdateStageNum(int val)
   {
       // 変動があった場合のみ更新
       if (oldStageNum != val)
       {
           stageText.text = "Stage " + val.ToString();
           oldStageNum = val;
       }
   }
}

次回も引き続きソースの整理をやっていきたいと思います。
ではまた!

この記事が気に入ったらサポートをしてみませんか?