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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

1回答

1141閲覧

Unity3D : X軸、Y軸をランダムでオブジェクトを生成したい

idonishi

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

0グッド

0クリップ

投稿2021/04/05 06:57

編集2021/04/05 09:12

### やりたいこと
打ち出す弾丸の弾道にランダム性を持たせたいです。

###現状
BulletPool.instance.GetUavBulletの引数はGetUavBullet(Vector3 pos, Quaternion rotate)です
現状だとまっすぐに射出されるだけなので、弾道をランダムにばらけさせたいです。

C#

1//オブジェクト生成 2if (shotInterval > shotIntervalMax) 3{ 4    BulletPool.instance.GetUavBullet(muzzle.transform.position, Camera.main.transform.rotation); 5    shotInterval = 0; 6} 7 8------------------ 9 10//Bulletの加速 11//弾を前進させる 12BulletR.AddForce(transform.forward * ShotSpeed, ForceMode.Impulse); 13 14------------------ 15 16//UavBulletのプール 17private void Start() 18{ 19 //ヒエラルキーにプールする空オブジェクトを作成 20 UavBullets = new GameObject("UavBullets").transform; 21  //uavbulletのリスト 22 pooledUavBullet = new List<GameObject>(); 23 for (int i = 0; i < UAVBULLET_MAX; i++) 24 { 25 GameObject newBullet = CriateUavBullet(); 26 newBullet.SetActive(false); 27 pooledUavBullet.Add(newBullet); 28 } 29} 30public GameObject GetUavBullet(Vector3 pos, Quaternion rotate) 31{ 32 //リストの中から使えるBulletを探し非アクティブがあればアクティブにして返す 33 foreach (GameObject obj in pooledUavBullet) 34 { 35 if (obj.activeInHierarchy == false) 36 { 37 obj.transform.position = pos; 38 obj.transform.rotation = rotate; 39 obj.SetActive(true); 40 return obj; 41 } 42 } 43 //使用できるものがなかったら新たに作成して追加する 44 GameObject newBullet = CriateUavBullet(); 45 pooledUavBullet.Add(newBullet); 46 return newBullet; 47} 48 49private GameObject CriateUavBullet() 50{ 51 GameObject newBullet = Instantiate(bullet, UavBullets); 52 return newBullet; 53}

###やってみたこと
全然あっているかわからないのですが、やってみた結果どこを向いて射出しても+Z軸方向に固定されて射出され、ランダム性も確認できませんでした。

C#

1public float randomX; 2public float randomY; 3public float nomalZ; 4private Quaternion MainShotAngle; 5private Quaternion ShotAngle; 6 7 8void Start() 9{ 10 ShotAngle = Camera.main.transform.rotation; 11 randomX = ShotAngle.eulerAngles.x; 12 randomY = ShotAngle.eulerAngles.y; 13 nomalZ = ShotAngle.eulerAngles.z; 14 randomX = Random.Range(-5.0f, 5.0f); 15 randomY = Random.Range(-5.0f, 5.0f); 16 17 MainShotAngle = Quaternion.Euler(randomX, randomY, nomalZ); 18} 19 20if (shotInterval > shotIntervalMax) 21{ 22 BulletPool.instance.GetUavBullet(muzzle.transform.position, MainShotAngle); 23 shotInterval = 0; 24} 25 26------------------ 27 28//Bulletの加速 29//弾を前進させる 30BulletR.AddForce(transform.forward * ShotSpeed, ForceMode.Impulse); 31 32------------------ 33 34//UavBulletのプール 35 36private void Start() 37{ 38 //ヒエラルキーにプールする空オブジェクトを作成 39 UavBullets = new GameObject("UavBullets").transform; 40  //uavbulletのリスト 41 pooledUavBullet = new List<GameObject>(); 42 for (int i = 0; i < UAVBULLET_MAX; i++) 43 { 44 GameObject newBullet = CriateUavBullet(); 45 newBullet.SetActive(false); 46 pooledUavBullet.Add(newBullet); 47 } 48} 49public GameObject GetUavBullet(Vector3 pos, Quaternion rotate) 50{ 51 //リストの中から使えるBulletを探し非アクティブがあればアクティブにして返す 52 foreach (GameObject obj in pooledUavBullet) 53 { 54 if (obj.activeInHierarchy == false) 55 { 56 obj.transform.position = pos; 57 obj.transform.rotation = rotate; 58 obj.SetActive(true); 59 return obj; 60 } 61 } 62 //使用できるものがなかったら新たに作成して追加する 63 GameObject newBullet = CriateUavBullet(); 64 pooledUavBullet.Add(newBullet); 65 return newBullet; 66} 67 68private GameObject CriateUavBullet() 69{ 70 GameObject newBullet = Instantiate(bullet, UavBullets); 71 return newBullet; 72}

###わからないこと
引数はQuaternionなのでQuaternion.eulerAnglesでランダムをかけたい軸を指定すればできると思っていましたができなかったので、わからなくなってしまいました。

###環境
Unity 2019.3.0f6

###参考にさせていただいたサイト
https://qiita.com/kaone_e/items/92bb8cf0c1ab01740f85
https://teratail.com/questions/234160
https://spi8823.hatenablog.com/entry/2015/05/31/025903

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

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

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

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

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

IShix

2021/04/05 08:29

飛ばす際はRigidbody.AddForceで飛ばすのでしょうか?
IShix

2021/04/05 08:30

玉を生成して飛ばす部分のコードも掲載してもらえると答えやすいです。
IShix

2021/04/05 08:31

すみません。書いてありました。。。
idonishi

2021/04/05 09:22 編集

書き記しておらず申し訳ございません。 取り急ぎ修正・追加いたしました。 飛ばす際はRigidbodyをAddForce(ForceMode.Impulse)で飛ばしています。 また他のスクリプトも追加いたしました。
guest

回答1

0

Rigidbody.AddForceで飛ばすのであればmuzzle.transform.positionmuzzle.transform.forwardとすると目的の動作になるはずです。

C#

1if (shotInterval > shotIntervalMax) 2{ 3    BulletPool.instance.GetUavBullet(muzzle.transform.forward, MainShotAngle); 4    shotInterval = 0; 5}

投稿2021/04/05 08:34

IShix

総合スコア1729

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

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

idonishi

2021/04/05 09:23

回答ありがとうございます。 回答していただきました方法で試してみたのですが、生成したBulletがmuzzleからでなく、ヒエラルキーに生成したプーリング用空オブジェクトから発射されているようです… すぐさま試してみた状態ですので、プーリングとmuzzleの位置関係を洗い出して見たいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問