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

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

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

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

button

HTMLで用いる<button>タグです。

Unity

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

Q&A

解決済

2回答

975閲覧

Unityのボタンクリックについて

Sobasenbei

総合スコア132

C#

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

button

HTMLで用いる<button>タグです。

Unity

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

0グッド

0クリップ

投稿2021/05/01 03:49

編集2021/05/01 07:24

Unity2020でリズムゲームを作ろうと考えており、時間を計るのにTime.timeの差を利用しようと思っています。
しかし、スクリプト内のOnEnable関数で代入したはずの変数stがClickButton関数の変数stに反映されず0になってしまいます。
こちらはリズム部分のスクリプトです。

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6 7public class rythm1 : MonoBehaviour 8{ 9 [SerializeField] GameObject panbutton; 10 [SerializeField] GameObject lettucebutton; 11 [SerializeField] GameObject patebutton; 12 13 [SerializeField] Button panb; 14 15 Vector2 leftup = new Vector2(-270, -450); 16 Vector2 leftbottom = new Vector2(-270, -770); 17 Vector2 rightup = new Vector2(270, -450); 18 Vector2 rightbottom = new Vector2(270, -770); 19 20 [SerializeField] AudioSource audiosource; 21 [SerializeField] AudioClip clip; 22 23 float st; 24 25 [SerializeField] gamedirsc da; 26 27 [SerializeField] GameObject canvas; 28 GameObject pan; 29 GameObject lettuce; 30 GameObject pate; 31 32 private void OnEnable() 33 { 34 35 pan = (GameObject)Instantiate(panbutton); 36 pan.transform.SetParent(canvas.transform,false); 37 lettuce = (GameObject)Instantiate(lettucebutton); 38 lettuce.transform.SetParent(canvas.transform, false); 39 pate = (GameObject)Instantiate(patebutton); 40 pate.transform.SetParent(canvas.transform, false); 41 42 st = Time.time; 43 44 audiosource.PlayOneShot(clip); 45 StartCoroutine("coroutine"); 46 47 Debug.Log(st); 48 } 49 50 private IEnumerator coroutine() 51 { 52 yield return new WaitForSeconds(5.33f); 53 Destroy(pan); 54 Destroy(lettuce); 55 Destroy(pate); 56 enabled = false; 57 } 58 59 // Start is called before the first frame update 60 void Start() 61 { 62 63 } 64 65 public void ClickPan() 66 { 67 Debug.Log(st); 68 var beat = Time.time; 69 var don = beat - this.st; 70 71 if ((don >= 2.46f & don <= 2.86f)|(don >= 4.46f & don <= 4.86f)) 72 { 73 Debug.Log("Great!"); 74 Debug.Log(don); 75 } 76 else 77 { 78 79 Debug.Log("Miss!"); 80 Debug.Log(don); 81 } 82 83 } 84 // Update is called once per frame 85 void Update() 86 { 87 if (Input.GetMouseButtonDown(0)) 88 { 89 Debug.Log(da); 90 } 91 } 92} 93

こちらは上のスクリプトなどを動かす大元のスクリプトです

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class gamedirsc : MonoBehaviour 6{ 7 public int miss = 30; 8 public float now; 9 [SerializeField] rythm1 rythm1; 10 // Start is called before the first frame update 11 void Start() 12 { 13 14 } 15 16 17 18 19 // Update is called once per frame 20 void Update() 21 { 22 if (Input.GetMouseButtonDown(2)) 23 { 24 now = Time.time; 25 rythm1.enabled = true; 26 } 27 } 28 29 30} 31

このコードではスクリプトが開始された時の時間とボタンを押したときの時間の差を求めています。
ですがClickbuttonのstがなぜか0になってしまうため時間差が求められません。また、deltaTimeを利用しようとしてもUpdate関数で代入したはずの変数も0になってしまいました。
ボタンをクリックした時に呼び出される関数ではほかの変数を参照することができないのでしょうか。
僕の想像では、プレハブ化して生成されたボタンであることが原因だと思っているのですが。
初めての質問でおかしな書き方になってしまい申し訳ありません。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/01 05:08

0になってしまうコードになっているのでしょう。 軽く書いてみたけど逆に0にする方が面倒な事をしないと無理な気がしましました。
Sobasenbei

2021/05/01 05:33

私もそう考えたのですが、確認しても変数stはこのスクリプトでしか使っていませんし、 そもそも宣言時にすら0を代入していないので、どこから0が入ってきたのかが全く分からない状態なのです
退会済みユーザー

退会済みユーザー

2021/05/01 05:46

可能性としてはOnEnableとClickButtonが同じフレームにおいて実行されてしまっている?とかでしょうか?0が代入されるタイミングはプレイ時にOnEnableが走ってタイミングで0が代入されます。 OnEnableが走る部分とClickButtonが走る部分が違うフレームならその差分の秒数がdonに代入されるように書いている様に見えます…
tsuki01

2021/05/01 05:54

こちらのスクリプトはどのタイミングで有効化されますか? シーンが開始されたと同時に有効化されるなら、「OnEnable」関数内での”st”には0が入るのではないでしょうか。 ※「OnEnable」関数内で”Debug.Log(st);”としていますが、こちらでは0以外の値が入っているということでしたら、その旨を質問文に追記すると、また違ったコメントが得られるかもしれません。 (質問文のコードがかなり崩れているので、質問編集時に合わせて修正頂けると、他の回答者さんも見やすくなるので助かります)
Sobasenbei

2021/05/01 06:00

ゲームの構造としては、上記のスクリプトがenabledしたときにリズムがながれ、そのリズムに合わせて画面のボタンを押し、それにより上記スクリプトのclickbutton関数が呼び出されタイミングの判定を行い、曲が流れ終わった後にまたenableをfalseにして別のリズムのスクリプトをtrueにするという仕組みにしたいと考えています。 Debug.Logの部分もボタンをクリックしたときにのみ出てくるので関数の呼び出しがおかしいということでもなく、 enableされた瞬間に呼び出されているということもありませんでした。 また、OnEnableで表示させたstでは、きちんとゲームが開始されてからの時間が表示されました。
Sobasenbei

2021/05/01 06:02

enableされるタイミングは、デバッグ用のため、今のところは大元のスクリプトでGetMouseButtonDown(2)で、マウスのホイールクリックでenabled=true にしています
tsuki01

2021/05/01 06:59

> 1570pさん 失礼しました。画面のリロードしなかったので同じ様なコメントしてしまいました。 > Sobasenbeiさん こちらで検証してみたものの再現しないのと、「OnEnableで表示させたstでは、きちんとゲームが開始されてからの時間が表示されました。」というこなのでパッと原因が分からずです。。 ”st”の宣言部分や大元となっているスクリプトなど、長くならないなら全コードを載せて頂いた方が明確な回答を得られやすくなるかもしれません。
guest

回答2

0

解決したら質問を解決済にした方が良いと思いますよ。

投稿2021/05/09 16:12

YDK

総合スコア63

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

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

0

自己解決

プレハブのボタンを生成して使うのではなく、画面外のボタンのpositionを移動する仕組みにして、Unityのバージョンを変えたらうまくいきました。
バージョン前後の挙動の違いを見るとバグだった気もしますが詳しいところはよくわかりません。解決法を提案してくださった皆様に感謝します。

投稿2021/05/01 16:00

Sobasenbei

総合スコア132

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問