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

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

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

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

Q&A

解決済

2回答

1251閲覧

Unity ある変数をすべてのオブジェクトのすべてのスクリプトから簡単に参照できるようにしたい

Sashimi_ShowYu

総合スコア61

Unity

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

0グッド

0クリップ

投稿2019/05/04 14:29

あるオブジェクトがspeedという変数を持っていたとして、それを他のすべてのオブジェクトのスクリプトから参照できるようにしたいです。

まず、public static  で変数を宣言すると、他からでも参照できると聞きました。で、試しにそれで宣言して他のオブジェクトから参照しようとしたのですが、「現在のコンテキストにそんな変数はない」とエラーが出て駄目でした。

とりあえず、今は正攻法(?)で、GetComponentを使って、目的の変数の値を取得していますが、たくさんあるオブジェクトのスクリプトに毎回毎回GetComponentを記述するのが面倒だし、煩雑になるので、できれば、もっと簡単な方法で取得したいです。その方法はあるでしょうか?

ちなみに、現状以下のようにGetComponentを使っています。
──────────────────────────────────
参照したい変数をもつ相手のオブジェクトをAite、ほしい変数をspeedとすると

public GameObject mottekuru;//ここにAiteをアタッチ public float speed2; void Start() { speed2=mottekuru.GetComponent<Aiteのスクリプト名>().speed; }

──────────────────────────────────

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

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

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

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

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

guest

回答2

0

ベストアンサー

なるほど。ひとまず、やろうとしていることに対しての方法(背景オブジェクトから値を取得する)は、以下のようにすることで解決できると思います。

// ※ 注意:背景をInstantiateしているとのことなので、 // このStart関数が呼ばれる時点でもしInstantiateされていない場合は // エラーが出るので、場合によってはStart関数のタイミングからずらす必要があるかもしれません。 void Start() { Background bg = FindObjectOfType<Background>(); speed2 = bg.speed; }

ただ、細かなタイミングなどを制御したいように見受けられたので、もう少し構造化を検討しないと後々しんどくなるかもしれません。
(もしそうなった場合は「デザインパターン」などで検索してみてください)

とはいえ、ひとまずは思いついた方法でやってみることが大事なので、上記の方法でトライしてみるといいでしょう。

投稿2019/05/05 05:43

edo_m18

総合スコア2283

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

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

Sashimi_ShowYu

2019/05/05 11:33

ありがとうございます! それでバッチリうまくいきました。 他のスクリプトを読む関数みたいなのを使う必要があるんですね。 助かりました<(_ _)>
guest

0

public GameObject mottekuru;はインスペクタから設定する想定ってことですよね?
であれば、GameObjectではなく、型を「GetComponentしたい型」にすることで解決できます。

具体的には以下のようにします。(Aiteのスクリプト名がAiteだとした場合)

public Aite mottekuru; public float speed2; void Start() { speed2 = mottekuru.speed; }

GameObjectにしなければ、Unityが自動的に対象の型としてアタッチしてくれるので、GetComponentを使わなくても直接対象オブジェクトのコンポーネントにアクセスすることができます。

投稿2019/05/04 16:46

edo_m18

総合スコア2283

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

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

Sashimi_ShowYu

2019/05/04 18:48

ありがとうございます。 ご指導の通り、やってみました。しかし、少し問題が・・・ public Aite mottekuru;  ↑これにインスペクタ上から相手オブジェクトを指定やるわけですが、その相手が「アセット上のプレハブ」だとうまくいかないのです(speedの値が0になっていて、値を持ってこれていない)。 しかし、「そのプレハブをシーンのヒエラルキーにドラッグアンドドロップして、シーンのヒエラルキーに配置したもの」であればうまくいきます(値を持ってこれる)。 しかし、シーン上に配置したものでは自分のやりたいことが全くできないです。 これはどうしたらいいでしょうか?
edo_m18

2019/05/05 00:33

そうですね。Prefabからだとそれはうまくいきません。 ちょっとどういう処理がされたいのか、全体の構想が分からないと方法がありすぎてこれ、という説明はむずかしいですね。 そもそもどういうことをやろうとしていて、なにができないのかの詳細を書いていただく必要があります。 コードレベルの話ではなくていいので、どういうことをやろうとしているのかを書いていただけますか?
Sashimi_ShowYu

2019/05/05 05:13

ありがとうございます。もう少しお付き合いください。 やろうとしていることを書きます。 縦シューティングゲームを作っています。 背景がスクロールするのですが、それに合わせて画面中の敵(戦車とか)も同じ速度でスクロールさせたいです。で、背景の移動速度と同じ速度で、敵も動かそうとしています。(背景は固定にして、カメラの方を動かせばいい、という話もあると思いますがその話は置いておいて) 背景スクロール速度を持つ変数は背景オブジェクトが持っています。 これを他のすべてのオブジェクトのスクリプトから参照できるようになれば、上記の目的が達成しやすいです。 しかし、背景オブジェクトはプレハブから Instantiateで生成しています。 問題はここで、 「Instantiateで生成したオブジェクト」から、変数を持ってくる方法がわかりません。 ここは前回の繰り返しになりますが(なので読まなくてもよいですが) GetComponent を使うにしても、参照相手をプレハブで指定すると値を取得できない(ただし、そのプレハブのインスペクターで値を指定した変数だけは、値を取得できることがわかりました。ただし、インスペクタで指定した値からゲーム中に変更があっても、それは一切反映されず、初期値のみしか取得できないので役に立たない。スクロールスピードが変わるので)。 かと言って、プレハブからInstantiateで生成したオブジェクトはそもそも参照相手として指定できない。 一応更にいうと、背景スクロールの進み具合で、敵の出現も管理しようとしています。 敵のプレハブから背景オブジェの位置情報を読み取って、背景オブジェがスクロールしてy座標5まで着たら、まっすぐ進む戦車、8まできたら右に曲がる戦車、を出現させる、といったことがしたいです。 例えば戦車プレハブに戦車の動きが記述してあるのですが、その中で if Y==5 {まっすぐ動く} else if Y==8{右に曲がる} みたいな感じで分岐させて動きに変化をつけようとしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問