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

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

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

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

Unity

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

Q&A

1回答

5158閲覧

Unity2D C♯ Quaternionを用いた自機狙いについて

pra

総合スコア17

C#

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

Unity

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

0グッド

0クリップ

投稿2017/03/13 16:41

編集2022/06/22 22:06

前提・実現したいこと

Unityでシューティングゲームを作っており、その中でプレイヤーに向かって直線的に向かってくる弾(所謂自機狙い)を作ろうとしています。

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

以下のソースコードで試してみたのですが、弾が敵から全く出てきません。その以外は正常に動いています。エラーメッセージはありませんでした。

該当のソースコード

(関係ありそうな部分のみ載せています)

敵に関するスクリプト

C#

1public GameObject target,bullet2; 2float frame=0; 3 4 public void Update() 5 { 6 //敵の移動 7 Vector2 direction = new Vector2(5*Mathf.Sin(frame*variable), 0); 8 GetComponent<Rigidbody2D>().velocity = direction * spaceship.speed; 9 10 //自機狙い弾の生成 11 if(frame%50==0 && target!=null) 12 { 13 Quaternion homingRotate = Quaternion.LookRotation(target.transform.position - transform.position); 14 Instantiate(bullet2, transform.position, homingRotate); 15 } 16 17 frame++; 18 }

弾に関するスクリプト

C#

1public class Bullet_rapid : MonoBehaviour { 2 public int speed = 4; 3 public float lifeTime = 5; 4 5 void Start () 6 { 7 GetComponent<Rigidbody2D>().velocity = transform.up.normalized * speed; 8 Destroy(gameObject, lifeTime); 9 }

bullet2には自機狙いの弾を、targetにはプレイヤーをセットしました。

試したこと

ここに書いたソースコード以外にもLookAtを用いたり弾とプレイヤーをむすぶベクトルを用いたりして自機狙いを作ろうとしてみましたが、いずれもエラーはないものの弾が生成されなかったり生成されてもなぜか真上に飛んでしまったりとうまくいきませんでした。

その他

Unityのバージョンは5.5.1です。
弾の生成に関してはInstantiateを使う方法のみ知っています。もし他にもっと良い方法があるよという方がいらっしゃればご教授していただけると嬉しいです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

2Dはちょっと詳しくないですが、Bullet_rapidの計算で使っているtransform.uptransform.forwardじゃないかなーと感じたのですが、違いますかね?
(3Dであればforwardを使うところだと思ったので)

投稿2017/03/14 02:28

edo_m18

総合スコア2283

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

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

pra

2017/03/14 18:28 編集

回答ありがとうございます。 教えていただいた通りtransform.up→transform.forwardで弾が飛ぶようになりました。 しかし2つまだ問題がありました。 1.弾がプレイヤーの初期位置を狙ってしまっている 2.自機狙い弾が縦方向に潰れてしまっている 1について,Updateなので毎回プレイヤーの位置を取得すると思ったのですが、プレイヤーが最初に居た位置に向かって弾が飛んでしまっています。また、プレイヤーがいない時にも発射されていました。 2について、シーンの一時停止で確認したところ発射された自機狙い弾が縦方向に潰れてしまって完全に見えなくなってしまいました。3Dで確認したところ、何故か自機狙い弾がxy平面に垂直になっていました。 1,2ともに色々調べてみましたが何故そうなるかがわかりませんでした。そもそもQuaternionをよく理解していないのでもっと勉強してもう一度よく考えてみます。 ありがとうございました。
edo_m18

2017/03/15 03:03

ちょっと該当のコードからだと原因は分からないですね・・。コードを見る限りは、弾が発射された時点のプレイヤーの位置には飛んでいきそうですが。 それから、プレイヤーがいないとき、というのはそもそもこのコード内には処理が書かれていないので常に発射され続けると思います。 そのあたりについては別途フラグを持つなどして、「撃つべきか否か」を判断するようにする必要があると思います。 弾の見た目に関してはビルボードの扱いかなーとも思いましたが、最初の回答でも書いた通り2Dについてはどういう処理をUnityが行っているのか詳しくないのでちょっと分かりません。(3Dの場合であれば、ビルボードの「前」方向はカメラの位置によって変わるので、それを無視して「前」を設定してしまうとおかしなことになることはあります)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問