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

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

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

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

Unity

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

Q&A

解決済

1回答

577閲覧

prefabがscriptで呼び出せない

Soma0303

総合スコア12

C#

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

Unity

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

0グッド

0クリップ

投稿2021/05/31 21:49

編集2021/05/31 21:51

ユニティーで音ゲーを作ろうとしていて、こんなコードを作ったんですが、

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

public class 選曲 : MonoBehaviour{

public GameObject obj2; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if (Input.GetKey(KeyCode.RightArrow)){ Destroy(gameObject); GameObject obj = (GameObject)Resources.Load("Cube"); GameObject instance = (GameObject)Instantiate(obj, new Vector3(0.0f, 0.0f, 0.0f), Quaternion.identity); } if (Input.GetKey(KeyCode.LeftArrow)){ Destroy(gameObject); } }

}

ArgumentException: The Object you want to instantiate is null.
というエラーが出て困っています!!
どこをどのようにすればいいのかわかりません!!
助けてください!!

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

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

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

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

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

fiveHundred

2021/05/31 22:24

「(GameObject)Resources.Load("Cube");」とありますが、ResourcesディレクトリにCube.prefabは存在するのでしょうか? あと気になった点として - コードはそれ用の書式があるので、それを使ってください。 - エラーは省略しないでください。また、可能であれば、スタックトレースも記載してください。 - クラス名に日本語を使わないでください。この場合、ファイル名も日本語にしなければならなくなり、Unityでは日本語が含まれるパスは予期せぬ不具合を起こすことがあるため、避けるべきです。
guest

回答1

0

ベストアンサー

エラーはインスタンス生成のためのオブジェクトが無いと言っています。

何がやりたいことなのか記載されていないので以下と想定して回答します。
(1)キーボードの右方向キーを押すと原点座標にインスタンスオブジェクトを発生させる。
(2)キーボードの左方向キーを押すと(1)で生成したインスタンスオブジェクトを削除する。

まず、

public GameObject obj2;

を記載して宣言しているにも関わらず、それ以下の行では使用していません。
これが生成させたい Instanceオブジェクトのもととなる Prefab ですので、以下のResource.Loadの行は必要ありません。削除してください。

GameObject obj = (GameObject)Resources.Load("Cube");

次に

GameObject instance = (GameObject)Instantiate(obj,new Vector3(0.0f, 0.0f, 0.0f),Quaternion.identity);

この行の obj を obj2 に書き換え、Inspector でprefabのオブジェクトを指定されていれば一応、生成に関しては動作します。
しかし、ここで GameObject instance と新たに変数として宣言してしまっているため、その次のif 文で実行されるDestoryはスコープ範囲外となりますので削除は機能しません。
変数宣言としてのGameObject instance文をカッコの外に記載した上で使用してください。

複数のインスタンスが生成されないように 生成前にインスタンスが生成済みであることを想定してDestoryしているようですが、これはあまりよくない記述です。
インスタンス生成済みかどうかを判別してからInstantiateを実行すべきです。
判別するには、flag を用意しておこなうか、if(!instance){}を用います。

Input.GetKeyはキーを押し続けている間ずっと実行されます。これだと無駄な実行が多くなってしまいますので、Input.GetKeyDownを使用するのが良いでしょう。
GetKeyDownはキーを押したときだけ動作する関数です。

これらを踏まえ書き直したサンプルが以下のコードとなります。
※変数名も分かりやすいものに書き換えています。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class 選曲 : MonoBehaviour { public GameObject PrefabObj; private GameObject InstanceObj; void Update() { if (Input.GetKeyDown(KeyCode.RightArrow)) { if(!InstanceObj) { InstanceObj = Instantiate(PrefabObj, new Vector3(0f, 0f, 0f), Quaternion.identity); } } if (Input.GetKeyDown(KeyCode.LeftArrow)) { Destroy(InstanceObj); } } }

補足ですが、日本語のクラス名「選曲」はお勧めできません。
一応仕様では日本語を含むUNICODE文字も使えるようですが、Unityではクラス名がファイル名と関連付けされていますので、パス名に日本語が含まれてしまうことになります。
これによっていくつかトラブルが報告されていますので、クラス名にはできるだけアルファベット(正確にはASCII文字)を用いてください。

投稿2021/06/01 01:00

monmoko

総合スコア202

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

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

Soma0303

2021/06/01 10:32

ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問