(この記事の使用環境: Unity5.5.0f3 Personal、Windows10

UIを使ってボーナスポイント振り分けの仕組みを作ってみたので、備忘録です。

SnapCrab_NoName_2017-3-14_21-51-28_No-001


動画はこんな感じ。



仕様はざっくりこんな感じ。
  • プレイヤーレベルはプレイヤーを動かすスクリプトで持っている変数を取得し表示する
  • プレイヤーレベルからボーナスポイントを算出する(レベル+1)
  • ボーナスポイントは歩き速度ボーナスと走り速度ボーナスに振り分けることができる
  • 歩き速度ボーナスと走り速度ボーナスはそれぞれスライダーから、0~+5の範囲で、整数値で設定できる
  • 歩き速度ボーナスと走り速度ボーナスに配分したポイントが全体のボーナスポイントを超えたら、ポイントが足りない旨のメッセージを表示する。また、適用ボタンを押せないようにする
  • リセットボタンを押すとスライダーで変更した値がリセットされる
  • 適用ボタンを押すとスライダーで変更した値が(プレイヤーを動かすスクリプトの変数に)適用される。各パラメータはpublic staticで定義され、シーン遷移しても保持される
  • 戻るボタンを押すとメインのシーンへ遷移する

各UI要素を管理するスクリプトの中身はこんな感じ。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

// --- スライダーを使ってボーナスポイントの振り分けを行う ------------------------------------
public class SettingUIController : MonoBehaviour
{
    public Text playerLvText;               // プレイヤーのレベルを表示するテキストUI
    public Text remainingPointText;         // ボーナスポイントの残りを表示するテキストUI

    public Slider walkSpeedBonusSlider;     // 歩き速度ボーナスを変更するスライダー
    public Text walkSpeedBonusValueText;    // 歩き速度ボーナスの値を表示するテキストUI

    public Slider runSpeedBonusSlider;      // 走り速度ボーナスを変更するスライダー
    public Text runSpeedBonusValueText;     // 走り速度ボーナスの値を表示するテキストUI

    public Text messageText;                // 各種メッセージを表示するテキストUI

    public Button applyButton;              // 適用ボタン

    int remainingPoint;

    // --- 初期化 ------------------------------------------------
    private void Start ()
    {
        messageText.text = "";

        playerLvText.text = "プレイヤーレベル: " + SkeltonMove.playerLv.ToString ();

        // 残ポイントの計算と表示
        remainingPoint = SkeltonMove.bonusPoint - (int) walkSpeedBonusSlider.value - (int)runSpeedBonusSlider.value;
        remainingPointText.text = "残ポイント: " + remainingPoint.ToString ();

        // 歩き速度ボーナスの取得と表示
        walkSpeedBonusSlider.value = SkeltonMove.walkSpeedBonus;
        walkSpeedBonusValueText.text = "+" + SkeltonMove.walkSpeedBonus.ToString ();

        // 走り速度ボーナスの取得と表示
        runSpeedBonusSlider.value = SkeltonMove.runSpeedBonus;
        runSpeedBonusValueText.text = "+" + SkeltonMove.runSpeedBonus.ToString ();
    }

    // --- スライダーで変更した値(未適用)をリセットする -----------------
    public void ResetValue ()
    {
        walkSpeedBonusSlider.value = SkeltonMove.walkSpeedBonus;
        runSpeedBonusSlider.value = SkeltonMove.runSpeedBonus;
        remainingPointText.text = "残ポイント: " + remainingPoint.ToString ();
        StartCoroutine (ShowMessage ("変更をリセットしました", 2f));
    }

    // --- スライダーで変更した値を適用する -----------------
    public void ApplyValue ()
    {
        SkeltonMove.walkSpeedBonus = (int) walkSpeedBonusSlider.value;
        SkeltonMove.runSpeedBonus = (int) runSpeedBonusSlider.value;
        StartCoroutine (ShowMessage ("変更を適用しました", 2f));
    }

    // --- 指定した秒数、メッセージを表示する ------------------------------
    IEnumerator ShowMessage(string message, float time)
    {
        messageText.text = message;
        yield return new WaitForSeconds (time);
        messageText.text = "";
    }

    // --- 戻るボタンを押すと Main シーンへ遷移する -----------------------
    public void GoToMainScene ()
    {
        SceneManager.LoadScene ("Main");
    }

    // --- 歩き速度ボーナス用のスライダーを動かしたときに呼び出すメソッド ---------------------
    public void ChangeWalkSpeedBonus (Slider slider)
    {
        walkSpeedBonusValueText.text = "+" + slider.value.ToString ();
        RemainingPointCalc ();      // 残ポイント計算
    }

    // --- 走り速度ボーナス用のスライダーを動かしたときに呼び出すメソッド ---------------------
    public void ChangeRunSpeedBonus (Slider slider)
    {
        runSpeedBonusValueText.text = "+" + slider.value.ToString ();
        RemainingPointCalc ();      // 残ポイント計算
    }

    // --- 残ポイントの計算と適用ボタンの有効無効切り替え、メッセージ表示 ---------------------
    void RemainingPointCalc ()
    {
        remainingPoint = SkeltonMove.bonusPoint - (int) walkSpeedBonusSlider.value - (int) runSpeedBonusSlider.value;
        remainingPointText.text = "残ポイント: " + remainingPoint.ToString ();
        remainingPointText.color = ( remainingPoint >= 0 ) ? Color.white : Color.red;
        applyButton.interactable = ( remainingPoint >= 0 ) ? true : false;
        messageText.text = ( remainingPoint >= 0 ) ? "" : "ポイントが足りません";
    }
}


スライダーのインスペクタでの設定はこんな感じ。
「Whole Numbers」にチェックを入れることで、整数値(1きざみ)でスライダーを動かすことができます。
SnapCrab_NoName_2017-3-14_22-18-54_No-00

今回は以上です。

(管理情報: プロジェクト 3D_Test > 3D_Test_01)