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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

4回答

665閲覧

Unity 別のスクリプトからメソッドを呼び出す際の挙動

ueshima334

総合スコア0

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2020/12/25 13:42

前提・実現したいこと

Unityにて変数が代入されるタイミングについて質問です。
これが正常な挙動なのかどうかがわかりませんので、教えていただきたいです。

発生している問題・エラーメッセージ

下記コードにおいて、Start()内で a を出力すると 1 と表示されます。 しかし、別のスクリプトから、CheckInt()を呼び出した際は a が 0と出力されてしまいます。 Start()が呼ばれた時点で a = 1 が実行されるので、CheckInt()が呼ばれた際は a = 1であるという認識は間違いでしょうか? もしこれが正常な挙動であるならば、CheckInt()の時点で a = 1 を代入したいのであればメソッド内で指定するしかないのでしょうか。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SaveOperation : MonoBehaviour 6{ 7 int a; 8 9 void Start() 10 { 11 a = 1; 12 Debug.Log(a); 13 } 14 15 public void CheckInt() 16 { 17 Debug.Log(a); 18 } 19 20} 21 22

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

YAmaGNZ

2020/12/25 22:50

これをどのように呼んだのでしょうか?
ueshima334

2020/12/26 02:32

同シーンの別のオブジェクトに貼り付けたスクリプトから、OnCollisionEnterメソッド内で、呼んでおります。 シーン開始時にコンソールにa = 1が出力されているので、Start()は実行されているのは確認できます。 その後にCheckInt()が呼ばれると、aは0と出力されてしまいます。
YAmaGNZ

2020/12/26 04:13

その部分のソースを提示すべきです。 startが呼ばれたインスタンスとは別のインスタンスのCheckintを呼んでいることも考えられます。
guest

回答4

0

シーン開始時にStart()メソッド内のdebug.Logが表示されているので最初にStart()が呼ばれていることは確認できます。

シーン内にSaveOperationが複数あって別のSaveOperationのStartが呼ばれているかもしれません。

Startが呼ばれる前にCheckIntが呼ばれる状況としては、SaveOperation.enabledがfalseになっている状況(Inspectorのチェックボックスのチェックが外れている状況)でCheckIntの呼び出し元のOnCollisionEnterが発生した場合が考えられます。

投稿2020/12/30 17:10

Ram.Type-0

総合スコア424

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

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

0

提示されている情報を元に(わからないところは想像で)Unity2020.1.0b8.3654で再現したところ、問題なく動きました。
自分の設定した状況が間違っている可能性はありますが、参考にして下さい。

再現したシーンは次のようになっています。

  • CubeにSaveOperation(改良点は下の通り)スクリプトとRigidBodyを付与

C#

1int a; 2 3void Start() 4{ 5 a = 1; 6 Debug.Log("Start:"+a.ToString());//Start時と明記 7} 8 9public void CheckInt() 10{ 11 Debug.Log("CheckInt:"+a.ToString());//CheckInt時と明記 12}
  • Cubeの上にSphereを設置し、classの中に以下の文が書かれたスクリプトとRigitBodyを付与

C#

1void OnCollisionEnter(Collision col){ 2 col.gameObject.GetComponent<SaveOperation>().CheckInt();//接触したコリジョンを取得→その元のゲームオブジェクトを参照→そのなかのSaveOperationコンポーネントを見つける→CheckInt関数実行 3}

すると、下のようにしっかり反映されていることがわかります。この結果は最初からCubeとSphereが接触した状態でも変わりませんでした。
シーンの状況
ログ

Unityのバージョンや、どのようなスクリプトの当てはめ方か・OnCollisionEnter内のスクリプトがどのような表記かなど、質問の文面からではわからない状況が原因となっている可能性が考えられるので、その辺りを詳しく教えていただければ幸いです。

投稿2020/12/29 05:17

Karakuri_Polta

総合スコア50

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

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

0

y_waiwaiさんと似たような回答になりますが、確かにStart()よりも先にCheckInt()が呼ばれているのが原因です。

ただ、unityを使っていらっしゃるとのことで、MonoBehaviourを継承しているためStart()は自動的に呼ばれますので安心してください。

ですのでStart()の後にCheckInt()を実行するようにコードを書き換えてみてください。

投稿2020/12/25 17:44

PinoMatcha

総合スコア368

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

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

ueshima334

2020/12/26 02:34

シーン開始時にStart()メソッド内のdebug.Logが表示されているので最初にStart()が呼ばれていることは確認できます。 その後に別のスクリプトのOnCollisionEnter()内でCheckInt()を呼び出すとaは0と出力されてしまいます。
guest

0

Startが呼ばれる前にCheckIntが呼ばれた、ということはないんでしょうか
というか、提示のコードではStartが呼ばれることはなかったり。

投稿2020/12/25 14:03

編集2020/12/25 14:04
y_waiwai

総合スコア88042

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

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

ueshima334

2020/12/26 02:34

シーン開始時にStart()メソッド内のdebug.Logが表示されているので最初にStart()が呼ばれていることは確認できます。 その後に別のスクリプトのOnCollisionEnter()内でCheckInt()を呼び出すとaは0と出力されてしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問