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

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

ただいまの
回答率

90.03%

Unityで別クラスのメソッドを呼び出す方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,621

ppphysiccc

score 18

最近Unityの勉強を始めました。
加速度センサを使ってカメラを動かすアプリの制作中です。

前提・実現したいこと

以下のような作りになっております。

**カメラを動かすクラスA
・加速度とジャイロの値を取得して、カメラをあれこれ

加速度、ジャイロの値やFPSなどを表示するためのクラスB
・加速度とジャイロの値とFPSの値を取得してuGUI Textを利用して表示**

いずれ加速度の数値表示は削除するので今のまま直接クラスAで加速度の計算をしてしまってもいいのですが、コードをすっきりさせたいのと
今後も別のスクリプトに記述した関数や変数を呼び出したいといったことが多く出てくるかと思いますので、ここで覚えておきたいです。

現状は期待する動きにはなってはいるのですが、
前述した通りコードを整理している途中でして、加速度やジャイロ取得の値を2度記述している箇所を修正したいと思っています。

試していること

クラスCを作成
・加速度を取得して加工するメソッド(accel)
・ジャイロの値を取得して加工するメソッド(gyro)
・FPSの値を取得して加工するメソッド(fps)
を作り、それをクラスA、Bで呼び出して使う。

例えばクラスCに

public Vector3 accel(){
   Vector3 kasokudo = 加速度を取得;
   // 加工
   return kasokudo;
}

クラスAに

C classC;

void Update(){
   Vector3 test = classC.accel(); // ****
   //------略-----
}


のような形で書いてみたりしています。

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

// ****の箇所で
NullReferenceException: Object reference not set to an instance of an object
というエラーが出てしまい、いまいち動きません。恐らく、classCがNullとなってしまっているためにエラーが出ているのだと推測しておりますが、
どのようにして修正を行えばよいのかわかりません。
調べてみてもインスタンス化辺りがいまいち理解できずにいます。

上記のことがやりたい場合はどのような記述を行えばよろしいのでしょうか。
すごく初歩的な質問かと思いますが、ぜひ宜しくお願い致します。

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

言語はC#です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2016/08/01 09:24 編集

    「new」とか入っていませんか?

    キャンセル

  • ppphysiccc

    2016/08/01 09:52 編集

    大変失礼致しました。
    昨日色々修正を試みておりましたので

    C classC = new C; // 記述していた

    void Update(){
    Vector3 test = classC.accel(); // ****
    //------略-----
    }

    ようです。
    質問内容にある通り実行をしたところ、正しくは// ****の箇所が
    NullReferenceException: Object reference not set to an instance of an object
    となります。
    classCがNullとなってしまっているためにエラーになっているのではと推測しています。
    情報の共有ミス大変失礼いたしました。

    キャンセル

  • ppphysiccc

    2016/08/01 09:53

    こちらのフォームは改行が効かないのですね。。
    本文を修正致しました。

    キャンセル

回答 2

checkベストアンサー

0

C classC;


C classC = new C(); //なり何なりとにかくインスタンスを取得or生成して突っ込む

調べてみてもインスタンス化辺りがいまいち理解できずにいます。

(クラスベースの)オブジェクト指向で初心者が躓くポイントが
「インスタンス」って何?
だと思います。

疑り深いあなたのためのオブジェクト指向再入門-オセロを例に考える

再入門となっていますが、インスタンスが何かを悟るにはちょうどいいかと。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/01 11:49

    ご回答ありがとうございます!
    とにかく見よう見まねで実装を行っていましたが、まだまだ勉強不足だと実感しました。
    インスタンス化…最初の山ですね。
    ご紹介していただいたサイトや他サイトを参考にしつつもう少し学習を行ってみたいと思います。

    キャンセル

0

C classC

void Start()
classC = gameObject.GetComponent<C>

のように使用したところ動かすことができました。
しかし、解決方法としてはこちらの実装で正しいものかどうか、またはもっとこうしたほうが効率的というようなものはありますでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる