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」の詳細は以下の通りです。
フィールド初期化子によって、静的でないフィールド、メソッドまたはプロパティの “名前” を参照することはできません。
インスタンス フィールドを使用して、メソッドの外部にある他のインスタンス フィールドを初期化することはできません。
コンパイラ エラー 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文字を使用すると、スクリプト制御が限られてしまいます。
また、文字の拡大がぼやけるというデメリットがあります。
ボタンを押すとカウントが増加し、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は、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
- 【Unity C# ゲーム開発超入門】7つのミニゲームを作っておぼえる!UnityとC#講座
Unityで頻出の機能を実際のゲーム作りで学習。
何か作りたい、今後の開発で役立てたい初心者におすすめ
- 【Unity C# ゲーム開発初心者レベルアップ】7つのトランプゲームを作っておぼえる!UnityとC#講座
トランプやボードゲーム作りに特化している講座。
テーブルゲームを作りたい人におすすめ。
- 【全行程を網羅!最初に学びたい総合学習】Unityワールド制作講座
Unityワールド制作の全工程を学習できる講座。
RPGを作りたい人におすすめ。
- Unity ゲーム開発:インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】
C#の文法やApp StoreとGoogle Playへゲームをリリース方法を解説。
ゲームを出品したい人におすすめ。
解説
- 名前空間
「UnityEngine.UI」:Unityのユーザーインターフェース関連のクラス(Text・Button)を使用するために必要です。このスクリプトでは、Textコンポーネントを操作するために使用されます。
- フィールド(メンバ変数)
「BtnCount」:ユーザーインターフェース上のテキスト表示を管理するためのText型の公開フィールド。カウントの値を表示します。
「count」:整数型のプライベートフィールドで、ボタンがクリックされた回数を保持します。
- Startメソッド
countフィールドを0に初期化します。
countの値を文字列に変換し、BtnCountのテキストプロパティに設定します。
これにより、初期カウントがユーザーインターフェース上に表示されます。
- CountBtnメソッド
ボタンがクリックされた時に呼び出される公開メソッドです。countフィールドの値を1増加させます。
増加後のcountの値を文字列に変換し、BtnCountのテキストプロパティに設定します。
これにより、最新のカウントがユーザーインターフェース上に表示されます。
例えば、ノベルゲームでは画面クリックするとテキストが進みます。
これには、Input.GetMouseButtonメソッドを使用します。
また、ノベルゲームには、セーブやロード機能は必要不可欠であり、
画面上にUIボタンを置きます。
このとき、セーブをしようとUIボタンを押すと、画面クリックも処理されて、
カウントアップされてしまいます。
UI操作と画面の処理が同時にされないような抑止として、EventSystem.current.IsPointerOverGameObject()を使用します。
UI操作と画面の処理が同時に稼働すると、バグ判定になりますので避けてください。
実演
本スクリプトをcompornentウィンドウにアタッチしてください。
作成したボタンのInspecterウィンドウ内にあるOn click()のプラスを選択します。
Noneに先ほどのボタンをアタッチして、Button>CountBtn()を選択します。
この手順を踏んで、ボタンでカウント機能を実装できました。
再生ボタンを押して、冒頭のような実行ができれば、成功です。
シーン切り替えて別の処理をするには?
本記事では、ボタンを押すと数値がカウントアップされる処理をしましたが、
シーン切り替え(遷移)をしてしまうと、取得した値は初期化されてしまいます。
しかし、実際のゲーム作品では、その数値がシーンをまたぐことがあります。
実装例として、
SceneAにボタン1、2があり、ボタン1を押すとSceneBに移動して加算する。
ボタン2を押すと、SceneBに移動して、減算する。
上記の機能を解説しています。
Invokeを使ったカウントアップ
UIボタン(Button)を押してカウントを上げる方法を解説しましたが、
Invokeを使えば、設定した時間や処理でカウントアップすることができます。
要するに、ユーザーが能動的ではなく、受動的にカウントを進めています。
まとめ
今回は、UIボタンを押すごとにUIテキストに表示された数値を加算する方法を紹介しました。
C#のオブジェクトのメソッドであるToString()は、
オブジェクトを文字列に変換するために使用されます。
マウスを何回クリックしたかカウントするためには、
i++のように(後置き)インクリメントを使います。
カウント機能を用いることで、ユーザーがマウスをクリックした回数を視覚的に判断できます。
クリックでアクションをするゲームを作成したいときに有効で、ユーザーアクションを重視したゲームに利用できます。
今回の加算するボタンを応用することができます。
付録.Pythonで数値変数を文字列変換する
今回の整数の変数を文字列に変換する操作をPythonで行うと、以下のようなコードになります。
number = 10
numberstring = str(number)
print(numberstring)
Pythonでは、3行で文字列変換ができて表示の「print」を除くと、
たった2行で簡潔にすることができます。
この操作を利用してカウントダウンタイマーを作ることが可能です。