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

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

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

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

Unity

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

Q&A

解決済

2回答

2597閲覧

Unity クラスのインスタンス化・継承について

Haruhi

総合スコア12

C#

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

Unity

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

1グッド

0クリップ

投稿2019/02/28 08:48

プログラム初心者なので、間違ったことを書いてしまっていたらすみません。

ゲームづくりで必ず行うと言ってもいい「クラスのインスタンス化」と「継承」ですが、
この2つに関して、自分の中での疑問に思ったことがあるので投稿させていただきました。

<クラスのインスタンス化>
・現場によって様々だったのですが、
メインとなるクラス以外は基本的にすべてインスタンス化を行い、
Initialize(初期化)やUpdate(ただのメソッド)をメインクラスで回す場合と、
Unityのオブジェクトから各クラスをGetCompornentして、
回すプロジェクトがありました。

この場合、Getcompornentしている方が処理的には重たいと思うのですが、
自分の開発していた現場で、サウンドマネージャーを使いたい場合は、
各クラスでインスタンス化(シングルトン)を行い利用していました。
やり方として絶対に正しいというのはないとは思うのですが、
行ったほうが良いべき手法はどちらなのでしょうか。

<継承>
同じ名前や意味を持つ変数の複数回定義を減らしたり、
実装漏れをなくしたりすることができたりと、利用するといろいろ便利になると思いますが、
かなりの頻度で、一つの派生クラスでしか使用していないのに基本と派生で分けているクラスを見かけます。
これには意味があるのでしょうか。(コードは大して長くない)

ご意見をいただけると助かります。

bochan2👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

<クラスのインスタンス化>

GetComponentが絶対的に悪いということはないです。
例えばスタート時に一度だけGetComponentする程度であれば普通に使って問題無いと思います。

事例がよく分からないので何とも言えませんが……
「インスタンス化」がInstantiateするって意味なら、GetComponentと大差無いか、下手するとInstantiateの方が負荷高いかもです。
そうではなくnew クラス名()するという意味なら、それで賄えるクラスであるならそうした方がいいです。GameObjectに依存しなくていいということなので。

GetComponent出来るコンポーネント=MonoBehaviourを継承している
new出来るコンポーネント=MonoBehaviourを継承していない
となるので、まず「MonoBehaviourの継承が必要か?」を考え、必要なクラスについては「GetComponentかInstantiateか?」となるかと思います。

(なお、Unityにおいてはstatic以外のほぼ全てのクラスはインスタンス化されます。GameObjectにコンポーネントを付与した時点でインスタンス化されたことになるので。インスタンス化とシングルトンも厳密にイコールではないですし、質問者さんの諸々の認識(各単語とそれが示すコード)が正しいかちょっと不安になるので、具体例を挙げてもらった方が確実かもしれません)

まぁプログラムにおいて「正しさ」があるとしたら「バグが起きない・運用しやすい・処理が軽い」の3点だけなので、これを満たしているならぶっちゃけた話、何でもいいとは思います。(要は「プロジェクトによる」)

###<継承>
意味があるとしたら「派生が増えた時に前のコードに触らなくていいので安心」ですかね。
本当は最初にきっちり設計して派生クラスが必要・不必要を決めるべきだとは思いますが、
そうもいかない理由がある(特にゲームの場合は「後のバージョンアップでバリエーションが増えるかもしれない」とかが考えうる)と思います。
実際のところは、それを書いた人に確認を取るのが一番確実かとは思います。

投稿2019/03/01 12:35

sakura_hana

総合スコア11427

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

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

Haruhi

2019/03/04 05:29

回答ありがとうございます! インスタンス化は「new クラス名」という意味で書きました。 なるべくオブジェクトにはアタッチしない方向で考えたいと思います。
guest

0

これには意味があるのでしょうか。

これは難しいですね...
使うと予想してたけど結局使わなかったパターンが大半ですね...

サウンド等のデータは読み込みに時間が掛かったりするため、いちいちクラスを生成して読み込みを行っていれば時間的にデメリットなのですよ...

投稿2019/02/28 09:26

stdio

総合スコア3307

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

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

Haruhi

2019/03/04 05:30

回答ありがとうございました! そのパターンも存在するのですね・・ 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問