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

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

新規登録して質問してみよう
ただいま回答率
85.47%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

3回答

1814閲覧

unityでボタンを押すたびに数字が増えるようにしたい

iwaki

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2020/03/17 02:11

Unityでボタンを押すたびに数字が増えるようにしたい(ボタンとテキストは別のシーン)

このサイトで私と同じような質問をした方がいたのですが、
(リンク→https://teratail.com/questions/172619)
この質問で、ボタンとテキストがそれぞれ別のシーンにある場合を教えていただきたいです。
私が考えたスクリプトは、クラス名をスクリプト名に変えただけなので上のリンクから参照していただけると幸いです。
また、毎回以下の2つのエラーメッセージが表示されます。

The referenced script (Unknown) on this Behavior is missing! The referenced script on this Behavior (Game Object'GamaObject') is missing!

該当のソースコード

ソースコード

試したこと

gameobjectをどちらのシーンに作ればよいか分からなかったので両方試しましたが、「2回」から増えることはありませんでした。

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

参考にしたサイト→https://teratail.com/questions/172619
unityのバージョン→unity 2019.3.4f1

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

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

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

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

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

guest

回答3

0

(コメントに対する返信です。ソースコードが正しく表示されないためこのようにしております)
(ベストアンサーにする場合はこの回答ではなく、hogefugapiyoさんにしてください)

現状から察するに以下のようになっていると思います。

C#

1public Text label; 2public static int count; 3 4void Start () 5{ 6 (クラス名).count = 2; //(※) 7 UpdateLabel(); 8} 9void UpdateLabel(){ 10 label.text = (クラス名).count + "回"; 11}

この場合、スクリプトのゲームオブジェクトが生成されるたびに、(※)の部分が実行されて2回にリセットされてしまいます。
以下のように、countを直接初期化するようにすればよろしいかと思います。

C#

1public static int count = 2;

投稿2020/03/17 11:27

fiveHundred

総合スコア9853

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

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

iwaki

2020/03/17 11:40

ご回答ありがとうございます。できました!初心者で右も左も分からないですが、teratailを利用して良かったです。本当にありがとうございます。これからもよろしくお願いします。
guest

0

ベストアンサー

#パターン1 何も考えずstaticに身を任せる
何も考えず、とにかくという場合はstatic修飾子を使ってしまう手です。

public static int count;
これならどこからでもアクセスできるようになるので、GameDirector.countとか書けばどこからでも値の参照/代入ができます。難点としては文字通りどこからでも参照できるので他の場所で書き換えとか起こる可能性もあります。

#パターン2 シングルトンで管理する
ゲームデータ、スコアデータなどシーンをまたいでも維持しておきたいデータをシングルトンで管理するクラスを作ってしまうパターン。(プレイヤーのデータなどを管理するのは他のゲームでもあったりします)

DontDestroyOnLoadという設定をすると特定のオブジェクトがシーンをまたいでも削除されずに維持されるようになります。これを使って他のシーンでもスコアなどが参照できるように渡し役となるクラスを作ります。ただ、DontDestroyをつけただけだと再読み込みしたときにオブジェクトが何個も複製されていくなどの場合もあるので、常に1つだけが存在するようにするシングルトンという考え方を使います。

詳しくは、シングルトンという考え方を参照してください

[Unity]シングルトンを使ってみよう
https://qiita.com/Teach/items/c146c7939db7acbd7eee

#パターン3 PlayerPrefsを使う
扱うデータが少ないなら、一時データとしてPlayerPrefsに入れてしまうのも手です。
ただし、これは端末のデータを消すか明示的に値を消さない限りは残り続けるので取り扱いに注意します。(アプリを落としても値が残っています)

PlayerPrefs.SetInt("count",count); とかでcountという名前でカウント値を保存し
PlayerPrefs.GetInt("count",0); とかで保存されているCountの値を読み込んできます。(読み込めなかった場合は、カンマのあとの数値…この場合は0が返ってくる)

UnityのPlayerPrefsでデータをセーブする
https://smartgames.hatenablog.com/entry/2015/01/19/004227

投稿2020/03/17 02:38

hogefugapiyo

総合スコア3302

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

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

iwaki

2020/03/17 05:23

ご回答ありがとうございます。パターン1でしようと思うのですが、GameDirector.countとすると、 「現在のコンテキストに、’GameDirector’という名前は存在しません。」 と表示されてしまいました。どうすればよいでしょうか。よろしくお願いします。
fiveHundred

2020/03/17 06:26

「GameDirector」の部分を定義したクラス名にする必要がありますが、それは当然行ってますよね?
iwaki

2020/03/17 10:35

クラス名にしていませんでした。。 しかし、そこは直しましたが相変わらず”2回”から変わりません。コンソールには、 label.text = (クラス名).count + "回"; の部分が原因であると書いてあります。どのようにすればよいでしょうか。 何度もすみません、よろしくお願いします。
fiveHundred

2020/03/17 11:28

それについて、新しく回答として投稿したので、そちらを確認してください。
guest

0

  1. シーンをまたいで変数を共有する方法を調べる(https://teratail.com/questions/137851)
  2. ボタンが押されたら共有変数を+1する
  3. 別シーンでは共有変数を参照し、テキストへ反映

投稿2020/03/17 02:34

takabosoft

総合スコア8356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問