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

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

新規登録して質問してみよう
ただいま回答率
85.46%
継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Unity

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

Q&A

解決済

1回答

1985閲覧

[Unity] Monobehaviourを継承していないクラスにHierarchy上のオブジェクトを格納させる方法

mushipan0929

総合スコア56

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Unity

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

0グッド

0クリップ

投稿2020/12/26 03:31

編集2020/12/26 04:50

前提・実現したいこと

訳あってMonobehaviour未継承のクラスにHierararchyの情報を格納させたいのですが
未継承な以上Inspectorからアタッチさる事もできず困っています。

複数のMonobehaviour未継承のクラス(EditTitleUi, EditStageUi など)を
インスタンス化して所持するUiManagerを作ろうと思ったところで起きた問題です。

試したこと

いろいろ考えてはみました
1.全てUiManagerに保存し、コンストラクタで使用する変数を全て渡す
2.シングルトン化した別のクラスに全て保存し、使うごとに毎回そこから引っ張ってくる
3.GameObject.Findで取得する
4.諦めて全てMonobehaviourを継承させる

### サンプルコード
以下のコードは実際のコードではなくサンプルです。
変数が1つしかないので単純ですが、実際に実装しようとすると何十にもなってしまうので見た目が良くなくなってしまいます。

UiManager(Uiクラスを管理するクラス)

C#

1public class UiManager : Monobehaviour 2{ 3 public EditBattleUi editBattle = new EditBattleUi(); 4 5 void Start() 6 { 7 editBattle.Hoge(); 8 } 9}

EditBattleUi(BattleシーンのUIを管理するクラス、Uiを操作するメソッドが数多く含まれます。)
その他にもEditTitleUi, EditResultUiなどがある

C#

1public class EditBattleUi 2{ 3 // 最初からHierarchy上にあるオブジェクト 4 // このオブジェクトを上に挙げた「試したこと」以外で取得する方法があれば知りたいです。 5 GameObject obj; 6 7 void Hoge() 8 { 9 Debug.Log(obj.name); 10 } 11}

今のところは2番の方式で実装させています。

C#

1public class UiManager : Monobehaviour 2{ 3 publuc GameObject obj; 4 public EditBattleUi editBattle; 5 6 void Start() 7 { 8 editBattle = new EditBattleUi(obj); 9 editBattle.Hoge(); 10 } 11}

C#

1public class EditBattleUi 2{ 3 // 最初からHierarchy上にあるオブジェクト 4 // このオブジェクトを上に挙げた「試したこと」以外で取得する方法があれば知りたいです。 5 GameObject obj; 6 7 public EditBattleUi(GameObject _obj) 8 { 9 obj = _obj; 10 } 11 12 void Hoge() 13 { 14 Debug.Log(obj.name); 15 } 16}

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

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

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

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

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

fiveHundred

2020/12/26 03:59

> 訳あってMonobehaviour未継承のクラスに その訳と、そのクラスをどういうものか分からないと回答しづらいと思います。 クラスのコードもあったほうがいいかもしれません。 MonobehaviourであってもC#の機能は使えるはずなので、これだけだとMonobehaviourで作ってしまえばよいと考えてしまいます。 継承回りかなということも思いまして、その場合は「継承元をインターフェースにしてしまう」「対象のクラスを継承するのではなく、クラスのインスタンスを変数に代入して所持する」という方法で回避できるような気もしますが、そういう状況なのかすら分かりません。
mushipan0929

2020/12/26 04:37 編集

失礼いたしました。 一例としてサンプルコードを掲載しました。 Monobehaviourを避けている理由として、できる限り使わずに実装してほしいと伝えられたので できる限り使わずに制作しています。
fiveHundred

2020/12/26 08:51

> Monobehaviourを避けている理由として、できる限り使わずに実装してほしいと伝えられたので これだと、なぜできるだけ使わずに実装してほしいかが分かりません。 UnityではMonobehaviourは必須レベルですし、Unity以外にも使うという意味であればEditBattleUiに(Unityのクラスである)GameObject型の変数を持たせること自体あまり良くないと思います。 (聞いておきながらすみませんが)私自身いい方法が思いつかないというのもありますし、一度その人に確認してもらったり見てもらったりしたほうがいいような気もしますが、どうでしょうか。
mushipan0929

2020/12/27 03:03

一度聞いてみましたが、重いと聞いているのであまり使いたくないとの事でした。 ただMonobehaviourを継承するしかないようであれば、今一度相談してみようと思います。 ありがとうございました。
guest

回答1

0

自己解決

質問への追記・修正の依頼欄にて解決したためここに記載します。

fiveHundred様より回答を頂きました。
この問題を解決するにはMonobehavoiurの存在が必須となるため
解決は難しいようです。

投稿2021/01/05 23:42

mushipan0929

総合スコア56

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問