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

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

ただいまの
回答率

87.49%

プレハブからボタンを作る方法

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 462

前提・実現したいこと

4つのいずれかのボタンを押すと、それらを消して、次の新たな4つのボタンを生成する仕組みを実現したいです。

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

下のコードで、スタートの中でProduceFirst関数を呼び出して、プレハブから生成することはできました。これらのプレハブにはFirstのタグが付いており、OnclickによってVanish関数を呼び出し、消すことにも成功しました。しかし、ProduceSecondを呼び出した際にエラーメッセージが出てしまいます。

エラーメッセージ
UnassignedReferenceException: The variable AttackButton of FirstCommand has not been assigned.
You probably need to assign the AttackButton variable of the FirstCommand script in the inspector.

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class FirstCommand : MonoBehaviour
{

public GameObject canvas;//キャンバス

public GameObject FightButton;
public GameObject ConversationButton;
public GameObject FeedButton;
public GameObject EscapeButton;
public GameObject AttackButton;
public GameObject WeaponButton;
public GameObject BackButton;
public GameObject DefenceButton;

// Start is called before the first frame update
void Start()
{
ProduceFirst();
}

// Update is called once per frame
void Update()
{

}

public void OnClick()
{
switch (transform.name)
{

case "Fight":
Debug.Log("tatakau");
Vanish();
ProduceSecond();

break;

case "Conversation":
Debug.Log("kaiwa");
Vanish();
ProduceSecond();
break;

case "Feed":
Debug.Log("esa")             
Vanish();
ProduceSecond();
;
break;

case "Escape":
Debug.Log("逃げる");
Vanish();
ProduceSecond();
break;
default:
break;
}

}

void Vanish()
{
GameObject[] Firsts = GameObject.FindGameObjectsWithTag("First");
foreach (GameObject First in Firsts)
{
Destroy(First);

}

}

void ProduceFirst()

GameObject prefab1 = (GameObject)Instantiate(FightButton);
prefab1.name = "Fight";
prefab1.transform.SetParent(canvas.transform, false);

GameObject prefab2 = (GameObject)Instantiate(ConversationButton);
prefab2.name = "Conversation";
prefab2.transform.SetParent(canvas.transform, false);

GameObject prefab3 = (GameObject)Instantiate(FeedButton);
prefab3.name = "Feed";
prefab3.transform.SetParent(canvas.transform, false);

GameObject prefab4 = (GameObject)Instantiate(EscapeButton);
prefab4.name = "Escape";
prefab4.transform.SetParent(canvas.transform, false);
}

void ProduceSecond()
{
GameObject prefab5 = (GameObject)Instantiate(AttackButton);//この文章にエラーがでる
prefab5.name = "Attack";
prefab5.transform.SetParent(canvas.transform, false);

GameObject prefab6 = (GameObject)Instantiate(WeaponButton);
prefab6.name = "Weapon";
prefab6.transform.SetParent(canvas.transform, false);

GameObject prefab7 = (GameObject)Instantiate(DefenceButton);
prefab7.name = "Defence";
prefab7.transform.SetParent(canvas.transform, false);

GameObject prefab8 = (GameObject)Instantiate(BackButton);
prefab8.name = "Back";
prefab8.transform.SetParent(canvas.transform, false);

}
}

 言語

Cシャープ

試したこと

下のコードで、スタートの中でProduceFirst関数を呼び出して、プレハブから生成することはできました。これらのプレハブにはFirstのタグが付いており、OnclickによってVanish関数を呼び出し、消すことにも成功しました。しかし、ProduceSecondを呼び出した際にエラーメッセージが出てしまいます。有効になっているスクリプトについてはInspectorでプレハブの指定は行っています。

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

unity2018.3.12.f1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • sakura_hana

    2019/11/15 15:24

    エラーが出ている箇所、多分`WeaponButton`ではなく`AttackButton`ですよね。

    AttackButtonにセットしてあるオブジェクト、シーン上に元々存在していて、Firstタグが付いていませんか?
    もしそうならVanishの際、このオブジェクト(元となるプレハブ)も一緒に消えてしまっているので、それを元に生成出来ずエラーとなっている気がします。

    キャンセル

  • biginerofunity

    2019/11/15 17:06

    返信いただきありがとうございます。
    すいません、おっしゃる通りAttackButtonです💦
    これにセットしてるオブジェクトはプレハブ化されたボタンで、Firstタグは付いております。しかし、初めの段階でHierarchyウィンドウには存在していません。Startでプレハブから作られていると思われます。また、Vanish後もプレハブ化したボタンはプロジェクトウィンドウのPrefabsホルダに存在しています。
    引き続き教えていただけると嬉しいです。

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る