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

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

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

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

Unity

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

Q&A

解決済

2回答

1102閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

1グッド

3クリップ

投稿2017/12/18 13:17

###前提・実現したいこと
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#です

zeta1978👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

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

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

C#

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

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

C#

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

###インスタン化された時に利用できるイベントです。イベントは大体先頭にOnがついています。
Colliderの衝突はHierarchy上でしかできないので引数のcolliderはインスタンスです。

C#

1OnTriggerExit(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はインスタンスです。

投稿2017/12/18 17:14

編集2017/12/19 04:23
IShix

総合スコア1724

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

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

0

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

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

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

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

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

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

投稿2017/12/19 00:48

Zuishin

総合スコア28656

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問