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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

Q&A

解決済

2回答

1012閲覧

他のスクリプトから変数を共有したいです

AIUEO_

総合スコア1

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

0グッド

0クリップ

投稿2020/10/08 08:46

前提・実現したいこと

他のスクリプトから変数を共有したいです

###エラー

Object reference not set to an instance of an Object

TestScript

C#

1public int bulletCount = 5;

###OtherScript

C#

1public TestScript testScript; 2 3void Start() 4{ 5 int bCount; 6 bCount = testScript.bulletCount; 7 Debug.Log(bCount); 8}

試したこと

pubkicでやる方法以外にもプロパティーや関数を作る方法も試しました
このサイトを参考にしています:
https://qiita.com/Teach/items/8d1cdb90a3b533707c9a

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

Unityで作っています
visual studio for macで作っています

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

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

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

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

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

guest

回答2

0

ベストアンサー

(TestScriptやOtherScriptがMonoBehaviourを継承している前提で回答します)

public TestScript testScript;と定義しただけでは中身は空(null)なので、中身を設定する必要があります。

一番簡単な方法としては、Unityエディタから、OtherScriptがアタッチされたゲームオブジェクトをインスペクターで確認すると、「testScript」という名前の欄が出てくるので、それにTestScriptをドラッグなどで設定すればよいです。

スクリプト上で行う場合は、GetComponent<TestScript>()FindObjectOfType<TestScript>()などで取得するか、gameObject.AddComponent<TestScript>()でTestScriptを新規で作成してください。

投稿2020/10/08 11:40

fiveHundred

総合スコア10152

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

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

0

TestScriptという型のオブジェクトをnewしていなからエラーになって当然です。
インスタンスを生成してから参照するか、参照したいフィールドをpublic staticで宣言すればいいんじゃないですかね。

投稿2020/10/08 09:49

gentaro

総合スコア8947

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

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

Tto777

2020/10/08 10:27

このコードでInspectorからのオブジェクト参照が間違ってなければnewする必要はありません。
gentaro

2020/10/08 11:27 編集

提示されたコードだけを見ればnewは必須です。 前提条件があるのなら、それを質問文に含んでいる必要があります。 「○○ならば」の「○○」は質問者が提示すべき情報であり、書いていないものを前提とした回答を求められても困ります。 その前提条件が必ずあるはずだ、とお考えであれば、それを踏まえた回答をしてあげてください。
fiveHundred

2020/10/08 11:30

Unityの場合、自作のクラスはMonoBehaviourを継承することがほとんどで、そのMonoBehaviourはnewしてはいけないようになっています。 もしそうであれば、代わりにAddComponentやGetComponentなどを使うか、インスペクターで設定することになります。 Tto777さんはこのことを言いたいのでしょう。 まあ、それを判別できる箇所を書いていない質問者が悪いといえば悪いですが。
gentaro

2020/10/08 11:37

あくまで提示されたコードのみを参照し、出ているエラーとC#の文法から判断すれば、この回答は最も精度が高い可能性を示しているはずです。 「○○なら✕✕という回答がある」と思う方は、この回答とは別に回答してあげれば良いと思いますが、この回答作成時点で提示されている質問文に対して、この回答を修正する必要は一切感じません。 なので、この回答に対してコメントされても困る、という話なんですが。
Tto777

2020/10/08 12:02 編集

参考記事がUnityのMonoBehaviour継承を前提に書かれている為に書かせて頂きました。 それで無ければ参考コードは動きません。 かといってgentaroさんの回答がC#の記述として間違いではないのでマイナスは付けていません。 補足としてコメントしただけです。 不快な思いをさせてしまった様ならばすいませんでした。
fiveHundred

2020/10/08 11:57 編集

状況次第ではやってはいけない、というものなので、補足したほうがいいのかなと思ってコメントしました。 決して、修正しろと言っているわけではありませんし、私も(質問の内容が不足しているので)修正する必要はないと思っています。
fiveHundred

2020/10/08 12:05 編集

なお、MonoBehaviourが継承されているかどうか質問からは分からないので、私は(Tto777さんと違って)gentaroさんの回答自体は間違っていないという考えです。 MonoBehaviourが継承されていないのであれば、当然ながらnewすることになりますし、そのような記述をすることも多いです。 Unityだけに限っても、newするクラスはありますし。
gentaro

2020/10/08 12:52

お気持ちはありがたく受け取らせていただきます。 ただ、コメントとしてここに残すよりは、別回答として作成していただいた方が目に付きやすいのではないか、とも思いますので、その点はご理解ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問