質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

Unityのスライダーの値を動かした際に、決められた値のみ表示させる仕組みを作りたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,700

score 5

前提・実現したいこと

unityにて、カウントダウンタイマーアプリを作成中です。
スライダーのバーを引っ張ることで、計測する時間(分)をテキストに表示させて、スタートボタンを押すことでカウントダウンがはじまるようにしました。

現在の仕様ですと、スライダーのバーを引っ張るとテキストには、小数点第2位までの数字が表示される仕組みになっています。

さらに、機能を加えて、スライダーのバーを引っ張って表示する際のみ、決められた時間のみを表示させたいと考えています。
具体的には、5分,10分,15分といった値だけを表示させるといったことをしたいです。

現在は、OnValuechanged()の中で、スライダーの値を取得しています。

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;

public class SliderController : MonoBehaviour
{
    Slider TimeSlider;
    private GameObject GaugeText;
    private GameObject CoinText;
    private int score = 0;
    private float difference;
    private float Startvalue;
    private bool iscount = false;
    private float nowtime;
    private float save;
    private GameObject StopButton;
    private GameObject StartButton;
    private GameObject ResetButton;
    private int Scoreoffline;
    private GameObject Slider;
    System.DateTime StartTime = System.DateTime.MinValue;

    // Use this for initialization
    void Start() {

        TimeSlider = GetComponent<Slider>();
        TimeSlider.value = nowtime;

        float maxTime = 120f;

        TimeSlider.maxValue = maxTime;

        this.GaugeText = GameObject.Find("GaugeText");
        this.CoinText = GameObject.Find("CoinText");
        StartButton = GameObject.Find("StartButton");
        StopButton = GameObject.Find("StopButton");
        ResetButton = GameObject.Find("ResetButton");

    }

    // Update is called once per frame
    void Update() {
        this.difference = Startvalue - nowtime;

        if (iscount == true && nowtime > 0)
        {
            nowtime -= Time.deltaTime;
            PlayerPrefs.SetFloat("nowtime", nowtime);
            PlayerPrefs.SetString("DateTime.Now", System.DateTime.Now.ToString());
            PlayerPrefs.Save();
            float minute = nowtime / 60;
            this.GaugeText.GetComponent<Text>().text = minute.ToString("f2").Replace(".", ":");
        }
        else if (iscount == true && nowtime <= 0)
        {
            nowtime = 0f;
        }


        if (this.difference >= 10)
        {
            Debug.Log("difference" + difference);
            Debug.Log("Test" + "test");
            this.score += 100;
            Startvalue = nowtime;
            CoinText.GetComponent<Text>().text = this.score + "G";
            PlayerPrefs.SetInt("score", score);
            PlayerPrefs.Save();
            Debug.Log(Startvalue);
            Debug.Log("difference" + difference);
        }

    }
    public void CountStart()
    {
        Startvalue = nowtime;
        Debug.Log(nowtime);
        iscount = true;
        nowtime = TimeSlider.value * 60;
        StartTime = System.DateTime.Now;
        Debug.Log(TimeSlider.value);
        Debug.Log(Startvalue);
        //スタートボタンを非表示にする
        StartButton.gameObject.GetComponent<CanvasGroup>().alpha = 0;
        StartButton.gameObject.GetComponent<CanvasGroup>().blocksRaycasts = false;
        //とめるボタンと休憩するボタンの表示
        StopButton.gameObject.GetComponent<CanvasGroup>().alpha = 1;
        StopButton.gameObject.GetComponent<CanvasGroup>().blocksRaycasts = true;
        ResetButton.gameObject.GetComponent<CanvasGroup>().alpha = 1;
        ResetButton.gameObject.GetComponent<CanvasGroup>().blocksRaycasts = true;
    }

    public void OnValuechanged()
    {
        this.GaugeText.GetComponent<Text>().text = TimeSlider.value.ToString("f2").Replace(".", ":");
    }

試したこと

検索しても、同じようなことをしている方が見当たらず、どうコードを書けば良いのかわからないので質問させていただきました。

補足情報(FW/ツールのバージョンなど)

unity2018.4.17f1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

スライダーを5分単位で動かせるようにするとなると、たとえば下記のようなやり方はどうでしょうか?

    public void OnValuechanged()
    {
        // まずスライダーの値を取得し...
        float sliderValue = TimeSlider.value;

        // 5で割って整数に丸めて5倍してやり、5分ごとの値とする
        sliderValue = Mathf.Round(sliderValue / 5) * 5;

        // OnValueChangedを発生させずにスライダーの値を変更する
        TimeSlider.SetValueWithoutNotify(sliderValue);

        // 2018.4だと上記の書き方はできないかもしれない
        // その場合、一旦onValueChangedを空のイベントに差し替えて
        // むりやりOnValueChangedを抑制する
        /*
        Slider.SliderEvent currentOnValueChanged = TimeSlider.onValueChanged;
        TimeSlider.onValueChanged = new Slider.SliderEvent();
        TimeSlider.value = sliderValue;
        TimeSlider.onValueChanged = currentOnValueChanged;
        */

        // テキストを更新する
        // なお、いろいろな解説サイトをご覧いただきますと、GetComponentをむやみに使うのは
        // 非効率的だとの意見を見かけることも多いかと思います
        // これぐらいの規模のコードなら、今のままでも速度面ではほとんど問題はないでしょうが
        // もし気になるようならリファクタリングしてみてもいいでしょう
        this.GaugeText.GetComponent<Text>().text = sliderValue.ToString("f2").Replace(".", ":");

        // ちなみに、上記の書き方だと「分」を小数で表記した時の小数点を
        // コロンに置き換えただけのようですが、これで意図通りでしょうか?
        // もし60進法...つまりコロンの後ろを「秒」にしたい場合、一例としては
        // 下記のような感じでいかがでしょう

        // まず整数部分を抜き出して「分」とする
        // int minutes = Mathf.FloorToInt(sliderValue);

        // 元の値からminutesを引いて小数部分を取り出し、
        // 60倍して端数を落として「秒」とする
        // int seconds = Mathf.FloorToInt((sliderValue - minutes) * 60);

        // 分と秒をコロンで繋げて表示用文字列とする
        // 秒の値が2桁なら、頭に0を入れて2桁で表示する
        // this.GaugeText.GetComponent<Text>().text = $"{minutes}:{seconds:D2}";
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/15 09:55

    丁寧な返信ありがとうございます。
    TimeSlider.value = Mathf.Round(sliderValue / 5) * 5;で、スライダーの値を5で割って、5をかけるだけで自分が求める動作ができました。
    とは言え、OnvalueChangedを使用せず、スライダーの値を変更する方法もあるのだと勉強になりました。
    とても参考になったため、ベストアンサーとさせていただきます。ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る