🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

1回答

1623閲覧

Unity 弾の移動 Rigidbody2D を使った移動

Koma2000

総合スコア3

C#

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

0グッド

0クリップ

投稿2021/02/05 06:56

編集2021/02/05 08:50

前提・実現したいこと

[実現したい事]
Unity にてプレハブにて生成した弾を動かしたい

[前提]
2Dゲームです
弾の生成は「Player」というオブジェクトで行っており
生成した後に関数を使いVector3を計算
それを弾の「Rigidbody2D」に代入しています

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

[追記・修正]
全く動かないです

下記の試した事で追加で色々と調べてみた結果
今までInitで「Debug.Log」してたのですが
「Update」のほうでしてみると値が初期化されている事が分かりました

m_velocity = shotForward * Speed;
m_velocity = new Vector3(0, 0, 0)

という処理になってしまうようです
これらはどうすれば初期化後「m_velocity = shotForward * Speed;」を行えるように出来るのか現状わかりません
どうすればよろしいでしょうか?

該当のソースコード

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class Bullet : MonoBehaviour 7{ 8 // プレイヤーのRigidbody2D 9 private Rigidbody2D rb; 10 11 // 座標 12 private Vector3 m_velocity; 13 14  // 速度 15 private float Speed = 3.0f; 16 17 // Start is called before the first frame update 18 void Start() 19 { 20 Speed = 3; 21 rb = GetComponent<Rigidbody2D>(); 22 } 23 void FixedUpdate() 24 { 25 rb.velocity = m_velocity; 26 } 27 28 // 弾の速度をセットする関数 29 public void Init(Vector3 shotForward) 30 { 31 m_velocity = shotForward * Speed; 32 } 33 34} 35 36追記:弾を生成しているプログラム 37public void Shot(Vector3 mouseWorldPos) 38 { 39 var pos = transform.localPosition; // プレイヤーの位置 40 var rot = transform.localRotation; // プレイヤーの向き 41 42 // 向きの生成(Z成分の除去と正規化) 43 Vector3 shotForward = Vector3.Scale((mouseWorldPos - transform.position), new Vector3(1, 1, 0)).normalized; 44 45 // 発射する弾を生成する 46 var shot = Instantiate(bulletPrefab, pos, rot); 47 48 shot.GetComponent<Bullet>().Init(shotForward); 49 } 50

試したこと

1.どこかでErrorはいてUpdateまで到達出来てない?
「Debug.Log」で確認 
結果:動いてました

2.値が弾に正確に届いていない 
色々とScriptを跨いでやり取りしてるのでどこかで計算・代入を間違っている?
「Debug.Log」で確認
結果:こちらも問題なし

3.「rb.velocity = m_velocity;」この部分に不具合がある?
「rb.velocity = new Vector3(1, 1, 0)」に変更
結果:動きました

オマケ
「rb.velocity = new Vector2(1, 1)」に変更
結果:動きました

追加
4.今までInitで「Debug.Log」してたのですが
「Update」のほうでしてみると値が初期化されている事が分かりました

m_velocity = shotForward * Speed;
m_velocity = new Vector3(0, 0, 0)

という感じの処理になってしまうようです。

正直色々な所から見よう見まねでやっているのでもしかすると
何か根本的なものが間違っているのかもしれません。

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

Unity 2019.3.15f Personal

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

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

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

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

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

ozwk

2021/02/05 07:38

Initを呼んでいる部分のソースをください
Koma2000

2021/02/05 08:53

追加させて頂きました
guest

回答1

0

ベストアンサー

色々と問題があると思うのですが
弾を発射する所をPlayerController、プレハブ化した弾をPlayerBulletと分けて
弾を発射する所を取得してそこを目掛けて飛ばすと言うのはいかがでしょうか??

まず空のゲームオブジェクトを作成し、インスペクター上でPlayerControllerをアタッチします。
Bulletにプレハブ化した弾を設定
transformのGunとpointにこのPlayerControllerを設定。これによってここから弾が飛び出します。
プレハブ化した弾にPlayerBulletをアタッチ。

これで弾は出ますが、的外れの答えだったらすみません。
それと私自身もまだまだ未熟な為、その他良い方法がありましたら、他の方々もご指示の方よろしくお願いします。

PlayerController

1 2using UnityEngine; 3 4public class PlayerController : MonoBehaviour 5{ 6//弾を飛ばす設定・空のGameObjectにアタッチ 7 8 //弾の設定 9 public GameObject bullet; 10 //弾を飛ばす角度設定 11 public Transform gun; 12 //弾が出る所を設定する 13 public Transform point; 14 15 16 void Update() 17 { 18 19 //発射方向を取得する 20 Vector3 mousePos = Input.mousePosition; 21 Vector3 screenPoint = Camera.main.WorldToScreenPoint(transform.localPosition); 22 Vector2 ofsset = new Vector2(mousePos.x - screenPoint.x, mousePos.y - screenPoint.y); 23 float angel = Mathf.Atan2(ofsset.y, ofsset.x) * Mathf.Rad2Deg; 24 gun.rotation = Quaternion.Euler(0, 0, angel); 25 26 27 //マウスが押されたら弾を飛ばす 28 if (Input.GetMouseButtonDown(0)) 29 { 30 //弾をインスタンス化、設定したpointから発射する 31 Instantiate(bullet, point.position, point.rotation); 32 33 34 } 35 } 36}

PlayerBullet

1 2using UnityEngine; 3 4 5public class PlayerBullet : MonoBehaviour 6{ 7//弾設定・プレハブ化した弾にアタッチ 8 9 //弾のスピード 10 public float speed = 7.5f; 11 12 public Rigidbody2D RB; 13 14 15 16 // Start is called before the first frame update 17 void Start() 18 { 19 20 } 21 22 // Update is called once per frame 23 void Update() 24 { 25 //弾の設定 26 RB.velocity = transform.right * speed; 27 28 } 29 30 31 32 //弾が画面外に出たら消す 33 private void OnBecameInvisible() 34 { 35 Destroy(gameObject); 36 } 37 38} 39

投稿2021/02/05 23:11

編集2021/02/05 23:17
masayuki07

総合スコア51

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問