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

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

ただいまの
回答率

90.84%

  • C#

    6293questions

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

  • Unity

    3398questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

Unityでのクラスやインスタンスについて

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 371

moyashi0331

score 2

前提・実現したいこと

unityでのクラスやインスタンスについて
クラスやらインスタンスやらが頭の中でごちゃごちゃになってて理解が追い付いてません
下記のスクリプトのような意味であっているのでしょうか?
GameObjectとgameObjectの違いなど教えて欲しいです

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

該当のソースコード

GameObject cube=GameObject.Find("Cube");//変数cubeにGameObjectクラスの値を入れる
cube.GetComponent<Renderer>().material.color=new Color(1f,0,0,0.5f);//cubeインスタンスのなかのGetComponentメソッドのmaterialのなかのcolorに値を入れる

void OnTriggerExit(Collider collider){//Colliderクラスからcolliderインスタンスを作成
if(collider.gameoObject.tag=""Player"){//colliderインスタンスの中のgameObjectインスタンスのタグがPlayerなら
collider.gameObject.GetComponent<Renderer>().material.color=new Color(1f,0,0,0.5f);//colliderインスタンスのgameObjectインスタンスのGetComponentメソッドのmaterialのなかのcolorに値を入れる
}
}

試したこと

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

C#です

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

Unityのインスタンスを分かりやすく区別する方法が2つあります。
まず1つは「Hierarchy上にあるかないか」です。
Hierarchy上にあるものはすべて再生時にインスタンス化されます。

2つ目は、Hierarchy上からアタッチされているかいないかです。
Hierarchy上からアタッチした画像やPrefabなどは表示されていないくてもインスタンス化されます。

これでUnityが自動的に行うインスタンスの大体を理解できると思います。
それを考慮して該当コードを考えてみるとこんな感じです。

GameObject.Find()はHierarchy上のオブジェクトを参照するメソッドなので参照できるオブジェクトはすべてインスタンス

GameObject cube = GameObject.Find("Cube");

cubeがHierarchy上にあればインスタンス

言葉にすると「cubeオブジェクトにアタッチされているRendererコンポーネントインスタンスをGetComponent<T>()で参照し、materialプロパティ内にあるcolorプロパティにColorインスタンスを代入する。」といった感じです。

cube.GetComponent<Renderer>().material.color = new Color(1f,0,0,0.5f);

インスタン化された時に利用できるイベントです。イベントは大体先頭にOnがついています。

Colliderの衝突はHierarchy上でしかできないので引数のcolliderはインスタンスです。

OnTriggerExit(Collider collider)

上記にあてはまらない例外

例外もあります。代表的なのはResources.loadです。Resourcesというフォルダを用意することでそこから動的にインスタンスを取得できます。

その他には、Hierarchy上からオブジェクトを隠すHideFlags.HideInHierarchyもありますが、1,2を知っていれば「Hierarchy上にあるものを隠しているのでインスタンス」と分かるので簡単ですね。

スクリプトで考えてみる

MonoBehaviourはnewできません。理由はUnityが自動でnew(インスタンス化)するからです。
やってみると分かるのですが、Hierarchy上ではMonoBehaviourを継承したクラス以外アタッチできません。ここからHierarchy上のものはすべてインスタンスということがわかります。

最後に

Unityは自身でnewしなくてもインスタンスが生成されるのでそこが難しく感じたのかなと思い今回の回答を考えました。実は今回1つ大きな間違いがあります。それは、Hierarchy上に無くてもコード上でMonoBehaviourが継承されていたり参照したUnity APIをはすべてインスタンスとういことです。Hierarchy上にあるかないかは関係ないのです。なぜスクリプト上ではなくHierarchy上で考えてほしいかと申しますと、2つ目のHierarchy上からアタッチされているかいないかがあるからです。

「Hierarchy上に存在するまたはアタッチする=newされメモリ上に展開される」ということなので、あまり使わないものをアタッチしていると知らないうちにメモリに大きな影響を与えていることがあります。今回のことを理解していると「よく使うからHierarchy上にアタッチしておこう」や「チュートリアルは1度しか使わないからResources.loadで読み込もう」など前もってメモリに優しい設計ができるからです。

長々とすみません。以上です。

GameObjectとgameObjectの違い

GameObjectはクラスでgameObjectはインスタンスです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

戦士というクラスがあります。
攻撃力が強く打たれ強く近接戦闘に向いたクラスです。

魔法使いというクラスがあります。
直接戦うのは苦手ですが魔法が使えます。

しかしクラスは戦えません。
戦うのはそのクラスに属するキャラクターです。
これがインスタンスです。

クラスは特徴や働きを表すもので、インスタンスはクラスの特徴を備えた実際のオブジェクトです。

インスタンスは他のインスタンスと区別するために名前をつけなければなりません。
しかし一つ一つに願いを込めて名前を考えるのは面倒です。
そういう場合はクラス名を少し変えてインスタンスの名前にします。
例えば GameObject に属する gameObject さんです。

クラスは最初の文字を大文字にするよう推奨されています。
ローカル変数やプライベートフィールドは小文字にするよう推奨されています。
ですから gameObject という名前を見ただけでこれは GameObject クラスに属する変数なんだなとすぐにわかるのです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る

  • C#

    6293questions

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

  • Unity

    3398questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。