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

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

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

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

Unity

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

Q&A

解決済

1回答

3703閲覧

Instantiateで生成したprefabの複製が表示されない。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2017/08/26 09:47

###前提・実現したいこと
現在、アクションゲームを作成中です。マリオで言うところのパックンフラワーの様な敵キャラクター(以下、パックン)を作成しようと思いっています。prefabにした弾をInstantiateで複製して出現させ、後は弾自身で飛んでいくというものを作りたいです。
パックンの子階層にCircle Collider(Triggerモード)で索敵範囲を作り、ここに触れるとパックンがランダムで弾を0~3個生成します。
###発生している問題・エラーメッセージ

Instantiateで複製した物が表示されない。 このときに、生成までは上手くいっているようなのですが、描画されません。 現在、弾にスクリプトは付けていませんが、Sprite Renderer,Rigitbody2D,Capsule Colider2Dを付けました。SpriteRendererに画像を入れたくらいで、他の設定はどれもいじっていません。

###該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class houdai : MonoBehaviour { 6 public static bool In; //索敵範囲内かどうか(子階層で判断するので、staticにしてあります) 7 bool bp1 = false, bp2 = false, bp3 = false, utu = true; //弾が何個でたか、また初弾は撃ったか 8 int spd; //弾の移動速度 9 Vector3 position; //パックンの位置 10 public GameObject danmaku; //複製したい弾 11 static Vector2 p1; //移動位置その1 12 static Vector2 p2; //移動位置その2 13 static Vector2 p3; //移動位置その3 14 GameObject a, b, c; //f複製した弾のスペース 15 // Use this for initialization 16 void Start () { 17 spd = 1; 18 position = transform.position; 19 p1 = new Vector2(position.x, position.y + 1f); 20 p2 = new Vector2(position.x - 0.7f, position.y + 0.65f); 21 p3 = new Vector2(position.x + 0.7f, position.y + 0.65f); 22 } 23 24 // Update is called once per frame 25 void Update () { 26 //playerが索敵範囲内に入ってきてから、まだ1発も撃ってないときHassyaをよぶ 27 if(In&&utu) 28 { 29 StartCoroutine(Hassya()); 30 } 31 //弾が生成されたかどうか調べて、生成されていたら、それぞれ移動させる。 32 if (a !=null&&bp1) 33 { 34 a.transform.Translate(p1 * spd * Time.deltaTime); 35 StartCoroutine(Stop());//止めるための関数 36 } 37 if (a != null && b != null && bp2) 38 { 39 a.transform.Translate(p2 * spd * Time.deltaTime); 40 b.transform.Translate(p3 * spd * Time.deltaTime); 41 StartCoroutine(Stop()); 42 } 43 if (a != null && b != null && c != null && bp3) 44 { 45 a.transform.Translate(p1 * spd * Time.deltaTime); 46 c.transform.Translate(p2 * spd * Time.deltaTime); 47 b.transform.Translate(p3 * spd * Time.deltaTime); 48 StartCoroutine(Stop()); 49 } 50 } 51 IEnumerator Hassya() 52 { //これから初段を打つのでutuをfalseにする。 53 if (utu) 54 { 55 utu = false; 56 } 57 //移動に1秒かかるので1秒たったらGOサインを出す。(Go関数は弾に付けるスクリプトに記述:弾自体にスクリプトはまだ付けてない) 58 if (Random.Range(0, 10) >=5)//1発 59 { 60 61 spd = 1; 62 a=Instantiate(danmaku,position,Quaternion.Euler(0,0,0)); 63 a.transform.LookAt(p1); 64 bp1 = true; 65 yield return new WaitForSeconds(1f); 66 a.SendMessage("Go"); 67 yield return new WaitForSeconds(5f); 68 Hassya(); 69 } 70 else if(Random.Range(0, 10) >= 3)//2発 71 { 72 spd = 1; 73 a= Instantiate(danmaku, position, Quaternion.Euler(0, 0, 0)); 74 b= Instantiate(danmaku, position, Quaternion.Euler(0, 0, 0)); 75 a.transform.LookAt(p2); 76 b.transform.LookAt(p3); 77 bp2 = true; 78 yield return new WaitForSeconds(1f); 79 a.SendMessage("Go"); 80 b.SendMessage("Go"); 81 yield return new WaitForSeconds(5f); 82 Hassya(); 83 84 } 85 else if(Random.Range(0, 10) >= 2)//3発 86 { 87 88 spd = 1; 89 a = Instantiate(danmaku, position, Quaternion.Euler(0, 0, 0)); 90 b=Instantiate(danmaku,position, Quaternion.Euler(0, 0, 0)); 91 c=Instantiate(danmaku,position, Quaternion.Euler(0, 0, 0)); 92 a.transform.LookAt(p1); 93 c.transform.LookAt(p2); 94 b.transform.LookAt(p3); 95 bp3 = true; 96 yield return new WaitForSeconds(1f); 97 a.SendMessage("Go"); 98 b.SendMessage("Go"); 99 c.SendMessage("Go"); 100 yield return new WaitForSeconds(5f); 101 Hassya(); 102 } 103 else//0発 104 { 105 yield return new WaitForSeconds(3f); 106 Hassya(); 107 } 108 109 } 110 IEnumerator Stop() 111 { 112 yield return new WaitForSeconds(1f);//移動に1秒かかるので、1秒待つ 113 spd = 0;//止める 114 //撃ったかどうかをfalseにする。 115 bp1 = false; 116 bp2 = false; 117 bp3 = false; 118 } 119 120}

###試したこと
他のサイトなどで調べた結果、非アクティブにした物を、精製時にアクティブにすると上手くいくと書いてあったのですが、試した結果ダメでした。

###補足情報(言語/FW/ツール等のバージョンなど)
言語:C#
ツール:Unity5 (プロじゃない方)
Windows10
そのほかに、何か無駄な記述があったり、こういう記述の方が処理が軽くなるなどございましたら、教えていただけるとありがたいです。
どうかお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

##はじめに
自己解決することができました。閲覧してくださった皆さんありがとうございます。
それと、お詫びを一つ。
今回の間違いは、LookAtによる物でした。
勘違いしてしまって、申し訳ありませんでした。

##原因
LookAtはz軸を指定したマスに向ける物だったようで、ちょうどカメラに描画されない形となってしまっていました。

##対処法
ひとまず、LookAtを消して、以下のスクリプトを追記して、その関数を使用しました。

C#

1void LookAt2D(GameObject d, Vector2 point) 2 { 3 float dx = point.x; 4 float dy = point.y; 5 float rad = (Mathf.Atan2(dy, dx) * 180 / Mathf.PI)-90;//ラジアンで算出されるので打ち消す 6 d.transform.rotation = Quaternion.Euler(0, 0,rad); 7 8 }

今回の場合、パックンのy軸を0度にとりたかったのでradから90度引いています。

投稿2017/08/26 16:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問