趣味のゲーム開発 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;
}
}
}
次回も引き続きソースの整理をやっていきたいと思います。
ではまた!
この記事が気に入ったらサポートをしてみませんか?