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

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

新規登録して質問してみよう
ただいま回答率
85.50%
UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Unity

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

Q&A

1回答

1079閲覧

Unityでボタンをクリックしたときに、ほかのオブジェクトについてるスクリプトのメソッドを実行することはできないのでしょうか。

Sobasenbei

総合スコア132

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Unity

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

0グッド

0クリップ

投稿2021/05/01 14:39

unityでほかのオブジェクトについているスクリプトのを実行しようとしたところ、そのメソッドで取得したローカル変数は普通なのですが、そのスクリプトのほかのメソッドで変更されたメンバ変数が反映されず、なぜか初期値のまま計算されてしまいます。Update関数でDebug.Logを行ったときにはきちんと現在の値を表示してくれるので、GUIボタンの挙動がややこしいことになってるものだと思いますが、ボタンのOn Clickで呼び出されたメソッドにはそのスクリプトのメンバ変数は使えないということでしょうか

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class rythm1 : MonoBehaviour 7{ 8 9 [SerializeField] RectTransform lettucebutton; 10 [SerializeField] RectTransform patebutton; 11 12 [SerializeField] RectTransform pan; 13 14 15 Vector2 leftup = new Vector2(280, 550); 16 Vector2 leftbottom = new Vector2(280, 200); 17 Vector2 rightup = new Vector2(270, -450); 18 Vector2 rightbottom = new Vector2(800, 200); 19 20 [SerializeField] AudioSource audiosource; 21 [SerializeField] AudioClip clip; 22 23 float st; 24 25 [SerializeField] gamedirsc da; 26 private int miss; 27 28 29 GameObject lettuce; 30 GameObject pate; 31 32 private void OnEnable() 33 { 34 miss = da.Setmiss; 35 36 pan.position = leftbottom; 37 lettucebutton.position = leftup; 38 patebutton.position = rightbottom; 39 40 41 st = Time.time; 42 43 audiosource.PlayOneShot(clip); 44 StartCoroutine("coroutine"); 45 46 Debug.Log(st); 47 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 da.Setmiss = miss - 1; 82 } 83 84 } 85 // Update is called once per frame 86 void Update() 87 { 88 89 if (Input.GetMouseButtonDown(1)) 90 { 91 Debug.Log(st); 92 } 93 } 94}

このスクリプトで言うと、OnEnableとUpdateのDebug.Logではきちんとゲームが始まってからの時間が表示されるのですが、Clickpan、ボタンで呼び出されるメソッドではstがなぜか0と表示されてしまいます。
また、スクリプトの切り替えが前提となるスクリプトのためOnEnableを使っているためか、GetComponentをしてもnullexceptionとなってしまいます。この場合はどうすればよいのでしょうか

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

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

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

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

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

guest

回答1

0

このスクリプトには大きな問題点があります。
それは、stの中身を、OnEnable内でしか設定していないからです。
そのため、OnEnableのときに設定されたstの中身が変わらずに残ります。
Time.timeはインスタンスではなくfloat型の値なので、Time.timeが変わってもstの中身は変わりません。
解決策として、以下のコードを追加で記述します。

C#

1void Update(){ 2 st = Time.time;//追加 3}

こうすることで、Update内で、stが更新されるため、Clickpan()内でもしっかりとした結果が得られるはずです。

投稿2021/05/01 22:58

task58

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問