🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

4193閲覧

ボタンを押したらテキストに数値を加算していく。がわからない。

NNNNum

総合スコア5

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2019/12/19 15:57

編集2019/12/22 14:02

前提・実現したいこと

テキストを用意して、そのテキストの下に対応したボタンを配置し、
ボタンを押すと上にあるテキストに数値が+1されるようなスクリプトを組みたいのですが、
Unityを始めたばかりでなにを用意すれば実現するのかがわかりません。

試したこと

試しにOnclickでテキストに数字を表示させようと思ってスクリプトを組んでみたのですがエラーが起きて走りません。
こういった画面で
イメージ説明

ScoreManagerという名前のGameObjectに以下のスクリプトをアタッチ?(というのかよくわからないです)して、スクリプトでテキストの初期化をしています。
(今後点数がn以上になったらシーンを遷移 みたいな物も入れたいと思っています)

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ScoreManager : MonoBehaviour { public GameObject score_object = null; void Start () { Text score_text = score_object.GetComponent<Text> (); score_text.text = ""; } }

そしてbuttonにはButton_Testというスクリプトをアタッチして、更にOnclickでTestを呼び出してとりあえずログが出るようにしました。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Button_Test : MonoBehaviour { public void Test() { Debug.Log("Press the button"); } }

そしてこのままButton_Testの中でテキストに数値を入れてみようと思って
コードを

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Button_Test : MonoBehaviour { public void Test() { Debug.Log("Press the button"); score_text.text = "1"; } }

という風にするとエラーが起きます。

できないだろうということはなんとなく分かってるんですが、どうしたらできるかが分からないです。
このまま ="1"の部分を加算するような文に変えても文字列に加算をしているような気がするし、
そもそも動かないのは別のスクリプトで宣言したテキストをひっぱってこようとしていてそれが無理なことなのかな?
とも思ってます。

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

Unity 2018.4.12f1 Personal

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rsu

2020/01/07 08:30

ボタンを押したらテキストの数字が+1され,決めた数以上になったら何かしたいという事ですか?
NNNNum

2020/01/07 08:39

はい、そうです。そうなんですが、buttonのonclickから呼び出すスクリプトの中の変数ではなく、 別のGameObjectにアタッチされているスクリプトの中の変数を加算して、その値をTextに表示したいと思っていて、その別スクリプトの中にある変数を呼び出すor呼び出さなくても別スクリプト内で使えるような宣言の仕方?をする方法を探しています。 回答してくださった方が提示してくれたURLを参考に作っていますが、追加でなにか参考になるページ等あればお願いしますm(_ _)m
guest

回答3

0

ベストアンサー

#ボタン1つから数字を変える場合
ボタンに付けてインスペクターから数字とテキスト,OnClickを設定する.

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Counter : MonoBehaviour 7{ 8 //数字を表示するテキスト 9 public Text CounterText; 10 11 //処理を行う数字 12 public int N; 13 14 //足す数 15 public int PlusInt = 1; 16 17 //引く数 18 public int MinusInt = 1; 19 20 //今の数字 21 private int Now; 22 23 public void Start() 24 { 25 Now = 0; 26 CounterText.GetComponent<Text>(); 27 } 28 29 //足すメソッド 30 public void Plus() 31 { 32 Now += PlusInt; 33 CounterText.text = Now.ToString(); 34 if (Now == N) 35 { 36 IntN(); 37 } 38 } 39 //引くメソッド 40 public void Minus() 41 { 42 Now -= MinusInt; 43 CounterText.text = Now.ToString(); 44 if (Now == N) 45 { 46 IntN(); 47 } 48 } 49 50 public void IntN() 51 { 52 //指定した数になった時の処理を書く 53 } 54} 55

#何かのGameObjectを通して数字を変える場合
1つ目のプログラムを何かのゲームオブジェクトに付けてインスペクターから設定する.

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class CountGameObject : MonoBehaviour 7{ 8 //今の数字 9 public int Now; 10 11 //足す数字 12 public int PlusInt = 1; 13 14 //引く数字 15 public int MinusInt = 1; 16 17 //数を表示するテキスト 18 public Text CounterText; 19 20 //処理を行う数 21 public int N; 22 23 public void Start() 24 { 25 Now = 0; 26 CounterText.GetComponent<Text>(); 27 } 28 29 public void Plus() 30 { 31 Now += PlusInt; 32 CounterText.text = Now.ToString(); 33 if (Now == N) 34 { 35 IntN(); 36 } 37 } 38 39 public void Minus() 40 { 41 Now -= MinusInt; 42 CounterText.text = Now.ToString(); 43 if (Now == N) 44 { 45 IntN(); 46 } 47 } 48 49 public void IntN() 50 { 51 FindObjectOfType<CountButton>().IntN(); 52 } 53} 54

2つ目はボタンに付ける.

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class CountButton : MonoBehaviour 7{ 8 9 //足すメソッド 10 public void Plus() 11 { 12 FindObjectOfType<CountGameObject>().Plus(); 13 } 14 15 //引くメソッド 16 public void Minus() 17 { 18 FindObjectOfType<CountGameObject>().Minus(); 19 } 20 21 public void IntN() 22 { 23 //指定した数になった時の処理を書く 24 } 25} 26

//に続くコメントを見ながら設定していってください.
テストはしてませんが足す,引くも入れました.

投稿2020/01/07 09:11

rsu

総合スコア75

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NNNNum

2020/01/07 09:23

何かのGameObjectを通して数字を変える場合 の1つ目のスクリプトには変数や処理をすべて入れておいて、buttonに紐づけているスクリプトにはそれを呼び出す処理を書いている?という理解でいいでしょうか?このとき指定した数になったときの処理を1つ目のスクリプトのほうに書かないのはどういった理由からなんでしょうか?
rsu

2020/01/07 09:43

特に理由はありません。
guest

0

これはUnityと言うよりも、プログラム的なエラーではないかと思います。

C#

1~省略~ 2 3public class Button_Test : MonoBehaviour { 4 5 public void Test() { 6 Debug.Log("Press the button"); 7 score_text.text = "1"; 8 } 9}

score_textが宣言されていないにも関わらずいきなり登場しています。
こういう風にしたいなら、ScoreManagerを継承するか、シングルトンクラスを使って引っ張ってくるしか方法はないかと思います。

投稿2019/12/23 00:53

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NNNNum

2019/12/23 08:39

ScoreManagerで宣言している変数score_textを、 グローバル変数のようにしてどのスクリプトからでも使えるようにする。  みたいなことはできないのでしょうか? プログラミングを最後にしたのが2年ほど前で記憶があやふやなのですが、 複数のスクリプトが書かれたファイルを使うプログラムを書いたことがなく、 Unity上でどうやってこれらの複数のスクリプトが走っているのか意味がわからず、 更に共通した変数をどうやったら扱えるかもわからず・・・。 先述しているScoreManager内でシーンの遷移もできるようにする予定がある場合、 stdioさんが提案してくださった、ScoreManagerを継承するorシングルトンクラスを使う のどちらが理にかなっているでしょうか? そしてもしお手数でなければUnity,C#における継承を詳しく解説したおすすめの記事などがあれば 教えていただけると助かります。(自分でぐぐって探してもいますが、もしおすすめがあればぜひ・・・)
stdio

2019/12/24 06:10 編集

よく、2年前の記憶のみでプログラムが難解になりがちなゲームを制作しようと思いましたね... 色々と管理クラスもあり、制御クラスもあり、描画クラスもありと言っていると複雑になるのがゲーム開発の難しいところです。継承やシングルトンクラスなんてググればいくらでも出ますよ。 その辺の知識はUnityではなく、C#の知識なのでC#で調べれば良いと思います。 開発精神的な面でいいなと思った記事がこちら https://qiita.com/While_Off_White/items/f6a866724e89b0b3d469
NNNNum

2019/12/24 10:55

コメントありがとうございます。 こういうことを言うべきではないとは思いますが、 私はゲームを制作したくてやっているわけではありません。 やりたくないのにゲームのチーム制作をすることになってしまっためやっているだけです。 やることになってしまった以上他人に迷惑はかけられないので、 こうやってわからなくなったところを質問している次第です。 こういう無気力無関心さがいけないとは分かっていますが、そう直せるものじゃないです。 その上で継承についてぐぐって調べてみたんですが、この場合ScoreManagerの中に スコアを加算するようなクラス?を追加しておいて、 ButtonTest内でScoreManagerを継承してbase?を使ってScoreManager内のスコアを加算する クラスを呼び出せば良いのでしょうか? 色々試してみているんですができなくて、ほんとにわからないです。
BluOxy

2019/12/24 11:11 編集

学校の課題でしょうか。ゲーム制作に興味がないと技術が身にならないので、NNNNumさんもやる気のある人たちも、お互い辛い状況になるとおもいます。 本当に興味がないなら思い切って制作に加わるのは辞めた方が良いですし、興味を持つ気力があるならまずはそこを持つところからアクションを起こすべきと思います。
stdio

2019/12/25 01:23

ゲーム制作のいいところは、「やっているとだんだん楽しくなってくる」というのが他のプログラミング制作より強いというところです。 やりたくないなら、辞めてもいいですが、BGMやSE制作、グラフィック制作、企画といった事もあるので、プログラミングが出来ないと言って邪魔になることはありません。 エンターテインメントの世界なので楽しさはどこかに転がっていますよ。
NNNNum

2020/01/05 11:07

どなたでもいいので、とにかく軽いサンプルのようなものをご提示いただけないでしょうか そこから理解したい じゃだめでしょうか
stdio

2020/01/06 02:52

この問題はインスタンスのアクセス間違いというごく単純なミスです。 継承か、シングルトンクラスぐらいならググればスグに出ます。 教えるのが嫌とか以前に、それぐらいゲーム制作するなら理解して当然という話になってしまっています。 シングルトンクラスが理解出来ないならこちらの記事でも参考にしてみて下さい。 https://qiita.com/mczkzk/items/e20a8ee8a722a51ca1f8
guest

0

まずはUnityuGUIについて理解を深めることをお勧めします。
各オブジェクトの性質を理解すれば簡単にできる内容を質問されているので、
まずはご自身で取り組んでみてください。

UnityuGUIについては下記のブログで詳しく解説してくださっています。
UnityuGUI コンポーネント解説

理解した上でどうしてもわからない場合は再度改めてはっきりとどこの方法が分からないかを明記して質問してください。
現状の質問ですと、丸投げの質問なので低評価を押されている理由はそこにあると思います。

投稿2019/12/20 00:12

Y0241-N

総合スコア1066

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問