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になってしまいました。
ボタンをクリックした時に呼び出される関数ではほかの変数を参照することができないのでしょうか。
僕の想像では、プレハブ化して生成されたボタンであることが原因だと思っているのですが。
初めての質問でおかしな書き方になってしまい申し訳ありません。
回答2件
あなたの回答
tips
プレビュー