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

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

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

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

Unity

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

Q&A

解決済

1回答

3549閲覧

【Unity】値を変更した変数を別のスクリプトから呼び出したい

tyomo_ng

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2020/09/01 10:16

前提・実現したいこと

メダルゲームを作っています。
実現したいこと:ゲームをプレイして獲得したメダルを入れている変数を、違うスクリプトにある残りメダルを入れている変数に足した値を画面上に表示させたいです。

発生している問題

獲得メダルを入れている変数(totalNumber)があるスクリプトから残りメダルを入れているスクリプトの変数(Now)を呼び出そうとすると、最初に宣言した時の値が使われてしまい、値を変更するメソッドにある変更後の値を呼び出すことが出来ません。

該当のソースコード(見てもらうために必要が無いと思われるソースコードは一部省略しております)

C♯

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.PlayerLoop; 5using UnityEngine.UI; 6 7public class Botton : MonoBehaviour//ボタンを押したときに残りメダルから1Playあたりのメダルを引くためのクラス 8 9{ 10 11  public Text Text; 12 public int playMedal = 15;//1Playに必要なメダル 13 private int startMedal =500;//開始時の残りメダル 14 public int nowMedal; //メダルを入れた後の値を表示 15 16 public int Now;//ここの値が呼び出されてしまいます 17 18 GameObject plusScore;//他クラスのスクリプトをアタッチしているゲームオブジェクトを取得 19 PlusScore script;//他クラスのスクリプトを取得する 20 21 // Start is called before the first frame update 22 void Start() 23 { 24 Text.GetComponent<Text>(); 25 plusScore = GameObject.Find("PlusScore"); 26 script = plusScore.GetComponent<PlusScore>(); 27 } 28 public void Plus() //ボタンを押すと残りメダルから1Playのメダル枚数を引く 29 { 30 nowMedal = script.finalMedal- playMedal; //メダルを引く 31 Now = nowMedal; 32 Text.text =Now.ToString()+"枚"; // 33 }

C♯

1using System.Collections; 2using System.Collections.Generic; 3using System.Runtime.ExceptionServices; 4using UnityEditor; 5using UnityEngine; 6using UnityEngine.UI; 7 8public class PlusScore : MonoBehaviour 9{ 10 int totalNumber;//獲得したメダルを入れる変数 11 public int finalMedal = 500;//1Play後の残りメダルを入れる変数。初期値が500なのはわざとです。 12 public Text TextF; 13Botton script; //Bottonスクリプトをアタッチしているオブジェクトを呼び出す 14 public int nowMedal ;//残りメダル 15 16 void Start() 17 { 18 plusScore = GameObject.Find("MedalIn"); 19 script = plusScore.GetComponent<Botton>(); 20 } 21 22 StartCoroutine(Final(script.Now)); //Final1メソッドをscript.Now変数の引数を渡して実行する。この時にscript.Nowの値が最初に宣言した値の0になってしまうのでBottonクラスのPlus()内にある計算後のNowの値を引数として使いたいです。 23 24public IEnumerator Final1(int startNumber) //獲得枚数と残りメダルを足すメソッド 25 { 26 yield return new WaitForSeconds(0.1f);//下の操作を0.1秒待つ処理 27 Text FinalScore = finalscore_Object.GetComponent<Text>(); 28 TextF.GetComponent<Text>(); 29 FinalScore.text = "獲得: " + totalNumber + "枚";//獲得したメダル枚数を画面上に表示する。ここは問題ないです。 30 //獲得メダルを加算する 31 nowMedal = startNumber + totalNumber;//ここでstartNumberが0になってしまっています 32 finalMedal = nowMedal; 33 TextF.text = finalMedal+ "枚";  34 } 35}

試したこと

staticを使う方法などをやりましたが上手くいきませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

値渡しである限りは希望する動作は複雑になるように思うので、参照渡しを使うのはいかがでしょうか?
[メモリとリソース管理] 参照渡し

diff

1void Start() 2 { 3 plusScore = GameObject.Find("MedalIn"); 4 script = plusScore.GetComponent<Botton>(); 5 } 6 7- StartCoroutine(Final(script.Now)); //Final1メソッドをscript.Now変数の引数を渡して実行する。この時にscript.Nowの値が最初に宣言した値の0になってしまうのでBottonクラスのPlus()内にある計算後のNowの値を引数として使いたいです。 8+ StartCoroutine(Final(ref script.Now)); //Final1メソッドをscript.Now変数の引数を渡して実行する。この時にscript.Nowの値が最初に宣言した値の0になってしまうのでBottonクラスのPlus()内にある計算後のNowの値を引数として使いたいです。 9-public IEnumerator Final1(int startNumber) //獲得枚数と残りメダルを足すメソッド 10+public IEnumerator Final1(ref int startNumber) //獲得枚数と残りメダルを足すメソッド 11 { 12 yield return new WaitForSeconds(0.1f);//下の操作を0.1秒待つ処理 13 Text FinalScore = finalscore_Object.GetComponent<Text>(); 14 TextF.GetComponent<Text>(); 15 FinalScore.text = "獲得: " + totalNumber + "枚";//獲得したメダル枚数を画面上に表示する。ここは問題ないです。 16 //獲得メダルを加算する 17 nowMedal = startNumber + totalNumber;//ここでstartNumberが0になってしまっています 18 finalMedal = nowMedal; 19 TextF.text = finalMedal+ "枚";  20 } 21}

(動作確認をしていないので、もしかしたら上記の変更だけでは動かないかもしれませんが。。)

投稿2020/09/01 10:54

yuuyu

総合スコア1139

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

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

tyomo_ng

2020/09/01 11:35 編集

解答して下さりありがとうございます。refはコルーチンでは使えないようなので普通の関数に全て変更してrefを入れてみたんですけど、startNumberの値は0のままで希望の動作になりませんでした...もし他に上手くいきそうな方法がありましたらご教示のほどよろしくお願いいたします。
yuuyu

2020/09/01 15:09

そうでしたか。。 とりあえず思いついたのは、 yield return new WaitForSeconds(0.1f); この処理を、Final1のなかではなく、呼び出し元のほうで行う、というのはいかがでしょうか?
tyomo_ng

2020/09/02 02:58

大変申し訳ありませんでした...教えて下さったrefに加えて少しだけ修正をしたら獲得したメダルと残りメダルが足されていることが確認できました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問