【Unity】スコアのカウントアップ、クリックされた回数を表示

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

UIボタンを押すと、数字が加算されます。

Unityでボタンを押すと数値が加算される機能は、ゲーム開発などで頻繁に使用されます。
この機能により、ユーザーのアクションに応じてスコアや能力値、ゲーム内通貨が増加します。

ボタンで加算する使用例
  • ゲームのスコアを加算する: プレイヤーが特定のアクションを完了した際にスコアが増える。
  • プレイヤーの能力値を増やす: 特定のアイテムを取得した際に能力値が向上する。
  • ゲーム内通貨を加算する: 購入やクエストクリア時に通貨が増加する。

本記事では、Unityでボタンを押すとカウントアップする方法を詳しく解説します。

本記事は次の人におすすめ
  • UIテキストとUIボタンの使い方を知りたい。
  • 変数を文字列と認識する方法(.ToString())について知りたい。
スポンサーリンク

数値を画面に表示する準備

ユーザーによるクリックやキーに入力でカウントアップするとき、
機能が正常に稼働しているか確認するには「Debug.Log()」を使用します。

Debug.Log()は、Consoleウィンドウに処理を表示されるだけで、
ゲーム画面にはカウントアップした結果は表示されません。
もちろんビルドしたゲームにも画面上に表示されません。

UIボタンを押してカウントアップした数値を画面上に表示するには、注意点があります。
Unityでは型が違う変数はエラーが生じます。

例えば、int型変数「Num」をstring型変数「NumString」に代入しようとします。

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

public class Sample : MonoBehaviour
{
    int Num;
    string NumString = Num;

}

しかし、consoleウィンドウにエラー文が表示されてゲームを再生することはできません。

エラー文

CS0236: A field initializer cannot reference the non-static field, method, or property ‘Sample.Num’

このエラーは、数値の変数を文字列の変数に直接割り当てると起きるエラーです。
コンパイルエラー 「CS0236」の詳細は以下の通りです。

フィールド初期化子によって、静的でないフィールド、メソッドまたはプロパティの “名前” を参照することはできません。

インスタンス フィールドを使用して、メソッドの外部にある他のインスタンス フィールドを初期化することはできません。

コンパイラ エラー CS0236

このエラーを解決するために変数の互換性を持たせるようにソースコードを工夫する必要があります。
要するに、変数を文字に変換して、ボタンを押すとカウントアップできるようにします。

To string()

ToString()メソッドは、C#のすべてのオブジェクトに対して使用できるメソッドであり、
オブジェクトの内容を文字列として表現するために使用されます。
特に、数値を文字列として表示したり、UIテキストに数値を表示したりする際に便利です。

ToString()メソッドを使ったコード例は以下の通りです。
このコードを使うことで、先ほどのエラーは解決されます。

using UnityEngine;

public class Sample : MonoBehaviour
{
    int Number = 10;

    void Start()
    {
        string NumberString = Number.ToString();
        Debug.Log(NumberString);
    }
}
  • 名前空間

「UnityEngine」:Unityの主要な機能やクラスを使用するために必要です。このスクリプトでは、MonoBehaviourを継承しており、Debug.Logを使用しているため必要です。

  • フィールド(メンバ変数)

Number」:整数型のメンバ変数で、このクラス内で利用されます。
初期値として10が設定されています。

  • Startメソッド

Numberフィールドの値を文字列に変換し、NumberStringという変数に格納します。
変換した文字列をデバッグログに出力します。これは、Unityのコンソールウィンドウに表示されます。

スクリプトをアタッチして、再生ボタンを押すと、以下の画像のように表示されます。
ただし、出力された変数は数値ではなく文字列です。

参考ページ:「Object-ToString – Unity スクリプトリファレンス

カスタムフォーマット

ToString()には引数としてフォーマットを指定することもでき、
数値の表示形式を細かく指定することができます。

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

public class CustomFormatExample : MonoBehaviour
{
    float Number = 123.456f;

    void Start()
    {
        string NumberString = Number.ToString("F2");
        Debug.Log(NumberString);
    }
}

例えば、制限時間を表示するときに、残り時間は、少なくとも小数第1位程度で良く、
スライダーバーで時間ゲージを作るときに有効です。

スライダーバーとカスタムフォーマットの使い方を紹介しています。

ソースコード例では、浮動小数点数を小数点以下2桁にフォーマットして文字列に変換しています。ToString(“F2”)は、数値を小数点以下2桁までの文字列に変換します。

UIボタンを押すとUIテキストとの数値を加算する

次に、UIボタンを押すと数値を加算し、その結果をUIテキストに表示する方法を説明します。

ソースコードを入力する前に、画面の準備をします。

HierarchyウィンドウからUI>Buttonを選択してください。
生成したボタンには子オブジェクトのTextがあるので、テキストを追加する必要はありません。


Legacy文字を使用すると、スクリプト制御が限られてしまいます。
また、文字の拡大がぼやけるというデメリットがあります。

textmeshproの基本的な操作を紹介しています。

ボタンを押すとカウントが増加し、UIテキストにその数値を表示するシステムを実装します。

ソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //追加

public class Count : MonoBehaviour
{
  public Text BtnCount;
  private int count;

void Start()
{
    count = 0;
    BtnCount.text = count.ToString(); //文字列に変換
}

public void CountBtn()
{
    count++; //インクリメント:値を1増やす
    BtnCount.text = count.ToString();
}
}

UdemyでUnityを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

ビックセール開催中(10月25日まで)
対象のコースが1800円から(最大95%OFF)

多彩な講座から自分に合った講座を探そう!

最大94%OFF

終了まで

時間

解説

  • 名前空間

「UnityEngine.UI」:Unityのユーザーインターフェース関連のクラス(Text・Button)を使用するために必要です。このスクリプトでは、Textコンポーネントを操作するために使用されます。

  • フィールド(メンバ変数)

「BtnCount」:ユーザーインターフェース上のテキスト表示を管理するためのText型の公開フィールド。カウントの値を表示します。
「count」:整数型のプライベートフィールドで、ボタンがクリックされた回数を保持します。

  • Startメソッド

countフィールドを0に初期化します。
countの値を文字列に変換し、BtnCountのテキストプロパティに設定します。
これにより、初期カウントがユーザーインターフェース上に表示されます。

  • CountBtnメソッド

ボタンがクリックされた時に呼び出される公開メソッドです。countフィールドの値を1増加させます。
増加後のcountの値を文字列に変換し、BtnCountのテキストプロパティに設定します。
これにより、最新のカウントがユーザーインターフェース上に表示されます。

例えば、ノベルゲームでは画面クリックするとテキストが進みます。
これには、Input.GetMouseButtonメソッドを使用します。

Input.GetMouseButtonメソッドで右クリックの処理を紹介しています。

また、ノベルゲームには、セーブやロード機能は必要不可欠であり、
画面上にUIボタンを置きます。

このとき、セーブをしようとUIボタンを押すと、画面クリックも処理されて、
カウントアップされてしまいます。

セーブ・ロード機能を紹介しています。

UI操作と画面の処理が同時にされないような抑止として、EventSystem.current.IsPointerOverGameObject()を使用します。

UI操作とメソッドによるカウントアップを区別する方法を紹介します。

UI操作と画面の処理が同時に稼働すると、バグ判定になりますので避けてください。

実演

本スクリプトをcompornentウィンドウにアタッチしてください。
作成したボタンのInspecterウィンドウ内にあるOn click()のプラスを選択します。

Noneに先ほどのボタンをアタッチして、Button>CountBtn()を選択します。
この手順を踏んで、ボタンでカウント機能を実装できました。

再生ボタンを押して、冒頭のような実行ができれば、成功です。

シーン切り替えて別の処理をするには?

本記事では、ボタンを押すと数値がカウントアップされる処理をしましたが、
シーン切り替え(遷移)をしてしまうと、取得した値は初期化されてしまいます。

しかし、実際のゲーム作品では、その数値がシーンをまたぐことがあります。

実装例として、
SceneAにボタン1、2があり、ボタン1を押すとSceneBに移動して加算する。
ボタン2を押すと、SceneBに移動して、減算する。

上記の機能を解説しています。

シーンを切り替えても、数値を保持する方法を紹介しています。

Invokeを使ったカウントアップ

UIボタン(Button)を押してカウントを上げる方法を解説しましたが、
Invokeを使えば、設定した時間や処理でカウントアップすることができます。

Invokeの使い方を紹介しています。

要するに、ユーザーが能動的ではなく、受動的にカウントを進めています。

まとめ

今回は、UIボタンを押すごとにUIテキストに表示された数値を加算する方法を紹介しました。

C#のオブジェクトのメソッドであるToString()は、
オブジェクトを文字列に変換するために使用されます。

マウスを何回クリックしたかカウントするためには、
i++のように(後置き)インクリメントを使います。

カウント機能を用いることで、ユーザーがマウスをクリックした回数を視覚的に判断できます。
クリックでアクションをするゲームを作成したいときに有効で、ユーザーアクションを重視したゲームに利用できます。

今回の加算するボタンを応用することができます。

付録.Pythonで数値変数を文字列変換する

今回の整数の変数を文字列に変換する操作をPythonで行うと、以下のようなコードになります。

number = 10
numberstring = str(number)
print(numberstring)

Pythonでは、3行で文字列変換ができて表示の「print」を除くと、
たった2行で簡潔にすることができます。

Pythonで文字列と数値を変換する方法を紹介しています。

この操作を利用してカウントダウンタイマーを作ることが可能です。

この記事を書いた人

プロフィール

アリッシア

                 

大学4年間で何か胸を張れるスキルを身に着けたくて当サイト運営を始めました。
現在、大学院に進学するか就職するか迷いながら勉強しています。
詳しいプロフィールはこちら

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Unity
フォローする
タイトルとURLをコピーしました