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

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

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

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

Q&A

解決済

1回答

681閲覧

ボタンを押したときに別の場所にオブジェクトを表示したい

arukanisu03

総合スコア2

C#

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

0グッド

0クリップ

投稿2023/02/20 12:01

実現したいこと

ボタンを押したときにスクリプタブルオブジェクトのリスト内で設定したオブジェクトを
特定の場所に表示させたい。

前提

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

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; ////////////////////////////////////////////////////// ////どこからでもアクセスできるキャラのデータベース//// ////////////////////////////////////////////////////// [CreateAssetMenu] public class CharaDataBase : ScriptableObject { public List<PocketChara> itemList = new List<PocketChara>(); } [System.Serializable] public class PocketChara { public GameObject charaButtonIcon; //ボタン public GameObject charaSt; //キャラ画像 public int charaId; //キャラ識別番号 public string charaName; //キャラ名 public string explainText; //キャラ説明文 } ---------------------------------------------------------------- using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class SelectGameManager : MonoBehaviour { //スクリプタブルオブジェクト(キャラID、名称等のデータベースList) [SerializeField] CharaDataBase charaDataBase; //////////////////////////////////////// ////キャラセレクトボタンを生成で使用//// //////////////////////////////////////// public GameObject canvas; //CanVasを指定 public GameObject CharaButtonIcon; //ボタンを指定 void Start() { CharaSelectIcon(); } ////////////////////////////////// ////キャラセレクトボタンを生成//// ////////////////////////////////// public void CharaSelectIcon() { for(int i = 0; i <= 2; i++) { //スクリプタブルオブジェクトのボタンを取得 CharaButtonIcon = charaDataBase.itemList[i].charaButtonIcon; //取り出したボタンをインスタンス化 GameObject TubakiButton = (GameObject)Instantiate(CharaButtonIcon);     //キャンバスの子に設定 TubakiButton.transform.SetParent(canvas.transform, false); Debug.Log(charaDataBase.itemList[i].charaName); } } ---------------------------------------------------------------------------------------------- using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class CharaOnClick : MonoBehaviour { //スクリプタブルオブジェクト(キャラID、名称等のList) [SerializeField] CharaDataBase charaDataBase; public GameObject Chara; public GameObject canvas; public void Tubaki() { Chara = charaDataBase.itemList[0].charaSt; GameObject TubakiSt = (GameObject)Instantiate(Chara);    //キャンバスの子に設定 TubakiSt.transform.SetParent(canvas.transform, false); } }

試したこと

キャラ選択画面を製作しています。
CharaDataBaseクラスをキャラのデータベースにしたくて、スクリプタブルオブジェクトのリストを作りました。
表示させたいプレハブのボタンをデータベースにアタッチして、SelectGameManagerクラスで呼び出して配置することはできました。
呼び出したプレハブのボタンを押すと、データベースで設定した画像を別の場所に表示するようにしたいため、ボタンのOnClickを使えばよいのではないかと思い、CharaOnClickというクラスを作りボタンにアタッチしました。クラス内でSelectGameManagerのCharaSelectIconと同じようにスクリプトを作ったのですが、ヒエラルキーのCanvasをアタッチすることができずうまくいきません。
考え方が間違っているのでしょうか。数日悩んでいるので、解決策を教えていただけると幸いです。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

クラス内でSelectGameManagerのCharaSelectIconと同じようにスクリプトを作ったのですが、ヒエラルキーのCanvasをアタッチすることができずうまくいきません。
考え方が間違っているのでしょうか。数日悩んでいるので、解決策を教えていただけると幸いです

はい、ご賢察の通り間違っておられると思います。
CharaOnClick クラスは恐らくボタンPrefabにアタッチされているクラスかと思います
PrefabのSerializefieldからScene内にあるCanvasをアタッチして参照しようとしていると思うのですがそれはできません。

んで、解決方法ですが本来やりたい事はPrefabにCanvasをアタッチすることではなく
Canvasを親としてObjectを動的生成することだと思いますのでそこに立ち返りましょう。
やり方は色々あります(AddressableSystem使ってやるのが私は好きですが・・)

GameObject TubakiButton = (GameObject)Instantiate(CharaButtonIcon);
既にこの時点でCanvasを取得しており参照解決はできていると思うので無理にSerializefieldで投げる必要はないと思います

CharaOnClick クラスに

c#

1private Transform _canvas; 2public Init(Transform canvas){ 3 _canvas = canvas; 4}

みたいなメソッドを追加して

c#

1 GameObject TubakiButton = (GameObject)Instantiate(CharaButtonIcon); 2TubakiButton.GetComponent<CharaOnClick>().Init(canvas.transform);

みたいな感じにすればCanvasを CharaOnClick に渡せると思いますね
あとSampleコードはデバッグしてない脳内Compilerのものなので多少のおかしいところは目をつぶってください

余談

TubakiSt.transform.SetParent(canvas.transform, false); みたく
毎回SetParentしてるみたいですがInstantiate() の第二引数に親のTransformを入れてあげれば自動的に親子関係を指定してInstance化できるのでそっちの方が書くの楽でよいと思いますよ
最も直接この目でhierarchyやプロジェクト構成見てないので頓珍漢なこと言ってたらごめんなさい

投稿2023/02/21 02:51

編集2023/02/21 02:57
UnitySoldier

総合スコア204

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

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

arukanisu03

2023/02/21 22:53

ご指摘の通りボタンプレハブにアタッチしておりました。なんでもSerializefieldを使えばいいというわけではないのですね…。教えていただいた考え方とソースコードを参考にして書き換えてみようと思います。 プログラミングもUnityも勉強し始めたばかりで、もしかして変なことを質問してしまったのではないかと不安だったのですが、知りたかったことを的確に教えていただけたので助かりました!本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問