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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

2回答

1017閲覧

個々のオブジェクトから同じインスタンスにアクセスしたい

rimokonTenko_mo

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

1クリップ

投稿2020/02/17 14:51

編集2020/02/17 15:23

Javaでゲームを制作しているときに困ったので質問させていただきました。

#質問に関係があるクラス
GameController(ObjectsManagerの全GameObjectのUpdate()を呼ぶ。ObjectsManagerとScoreManagerのインスタンスを格納してある)
ObjectsManager(GameObjectをリストにまとめ、追加したり削除したり検索したりする)
ScoreManager(スコア、コイン、ライフなどのデータを管理する)
GameObject(全ゲームオブジェクトの抽象クラス。Update()をオーバーライドできるようになっている)

※ゲームは、GameControllerが繰り返しUpdate()を呼ぶことで進められます。

#質問
Unityを参考にして、Update()が繰り返し呼ばれることでゲームが更新されるようにしたのですが、オブジェクトを追加・削除したいときにどうやってObjectsManagerやScoreManagerにアクセスすればよいかわかりません。いくつか方法が思いうかんだのですが、あまりいい方法ではないと思ったので、質問させていただきました。なにかアドバイスをお願いします。

#思いついた方法

1.GameObject(正確にはGameObjectを継承したもの)インスタンス生成時に、ObjectsManagerとScoreManagerのインスタンスを格納しておく。

この方法を思いついたのですが、同じインスタンスを全オブジェクトに格納しておくのは、オブジェクト指向に反する上、無駄なメモリも食ってしまうと思いましたので、良くないと思います。

2.GameControllerのObjectsManagerとScoreManagerをstaticにする。

この方法は、メモリを食わず、Unityもこんな感じでGameObjectを検索していたと思うので、いいかなと思ったのですが、全部で唯一にしたいのではなく、GameControllerにつき一つにしたいので、また、staticにして、どこからでもアクセスできるのは違うかなと思いましたので良くないと思います。

3.上の2を改善(むしろ劣化かもしれない)して、GameControllerの数だけ、staticのObjectsManagerとScoreManagerの配列(orリスト)を用意する。

この方法は、メモリも食わないし、一応動きはすると思うが、オブジェクト指向に反していると思うので良くないと思います。

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

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

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

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

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

kei344

2020/02/17 14:54

質問タグに「Java」を追加されてはいかがでしょう。
rimokonTenko_mo

2020/02/17 15:01

わかりました。追加しておきます。しかし、Javaじゃなくても通用する考え方かなと思いましてので、つけようか迷ったのですが、、、
LouiS0616

2020/02/17 15:06

シングルトンについては調べてみましたか?
rimokonTenko_mo

2020/02/17 15:29

はい、2がそれだと思います。しかし、それだと、全体で唯一になってしまいます。staticをやめて、一つのGameControllerにつき、一つのObjectsManagerとしても、GameObjectからGameControllerにアクセスできないので、解決できません。
hoshi-takanori

2020/02/17 18:46

そのゲームはどのOSで動かしますか?
rimokonTenko_mo

2020/02/18 09:33

Macで動かします。 (でも、めったに無いと思いますが、Windowsでも動かしたいです)。
guest

回答2

0

ベストアンサー

個人的な意見ではありますがやりたいことをやるだけであれば
個人的には1番+αが一番いいのではと思います
提案するのはObjectManagerやScoreManagerにそれぞれInterfaceを作成,実装し
全てのGameObjectにそのInterfaceを持たせる方法です.
それでしたらオブジェクト指向的な考え方も維持できるのではと思います
メモリ問題に関してはJavaは参照の値渡しなので事実上メモリの肥大は起こらないと思います

投稿2020/02/18 01:22

Sepi

総合スコア36

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

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

rimokonTenko_mo

2020/02/18 09:27

回答ありがとうございました。 ところで「GameObjectにそのInterfaceをもたせる」とは具体的にどういうことでしょうか。GameObjectにそのinterfaceの変数をもたせるとObjectManagerかScoreManagerのどちらか一方しかもてないと思ったのですが、間違って捉えてしまったでしょうか。
Sepi

2020/02/18 09:35

例えば ObjectManagerInterfaceとScoreManagerInterfaceを作成し GameObject内にそれぞれの変数を作成すれば両方を実装することができます 面倒でしたらInterfaceを作らずにそのままでいいと思いますが... ただ考え直したところ ObjectManagerのインスタンスをGameObjectに格納する必要はないのかなと...
rimokonTenko_mo

2020/02/18 10:11

わかりました。GameObjectに2つのManagerを格納してみます。 ちなみにObjectsManagerは、GameObjectから新たなGameObjectを生み出したいときに使います。(マリオのハテナブロックがきのこをだす感じで)
guest

0

update で進行するのでしたら, GameController が GameObject.update を呼ぶ際に自身をパラメータとして渡すようにしては如何でしょうか.

投稿2020/02/17 18:06

jimbe

総合スコア13209

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

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

rimokonTenko_mo

2020/02/18 09:31

質問に書いてなくてすみませんでしたが、キーイベントやGameObject同士が衝突したときに呼ばれる関数(GameObject内の)もObjectsManagerやScoreManagerを使いたいので、難しいです。
jimbe

2020/02/18 10:37

必要なメソッドに必要なオブジェクトを渡すという点ではどのメソッドでも同じです. そして, 必要なのにオブジェクトの関係上渡せないのであれば, 先にどこかで渡しておいて(結局)保存しておくしかないということになります.
rimokonTenko_mo

2020/02/18 12:08

言われてみればそうですね。使いたいときにどこからともなく参照できるはずがありませんよね。他の意見がないかなと思って質問させていただきました。プロの意見が聞けてよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問