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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

2291閲覧

前方に球を発射したい

Ken04

総合スコア11

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/03/26 01:48

編集2020/03/26 02:20

前提・実現したいこと

Fpsゲームでプレイヤーの向いている方向に球を発射したいと思っています。

発生している問題

当たり判定が機能しない。
発射した後プレイヤーの体の向きを変えると発射した玉も動いてしまう。(発射後に体の向きを変えると発射された球も右に動く)

該当のソースコード

このジェネレーターで球を作る

c#

1public class bulletGaneretor : MonoBehaviour 2{ 3 [SerializeField] GameObject bullet; 4 GameObject player; 5 // Start is called before the first frame update 6 void Start() 7 { 8 player = GameObject.Find("Player"); 9 } 10 11 // Update is called once per frame 12 void Update() 13 { 14 if (Input.GetMouseButtonDown(1)) 15 { 16 if(ItemManager.right == true) 17 { 18 GameObject bullet_Instance = Instantiate(bullet) as GameObject; 19 bullet_Instance.transform.parent = player.transform; 20 bullet_Instance.transform.localPosition = new Vector3(0, 0, 2); 21 } 22 } 23 } 24}

このscriptで球を動かす

c#

1public class bulletController : MonoBehaviour 2{ 3 GameObject player; 4 float z; 5 Rigidbody rb; 6 // Start is called before the first frame update 7 void Start() 8 { 9 rb = GetComponent<Rigidbody>(); 10 player = GameObject.Find("Player"); 11 z = 0; 12 } 13 14 // Update is called once per frame 15 void Update() 16 { 17 z++; 18 transform.localPosition = new Vector3(0, 0, z); 19 } 20 21//追記 22  private void OnCollisionEnter(Collision collision) 23 { 24 Destroy(this.gameObject); 25 } 26}

補足

ItemManagerのright変数には武器を持ているかが入る
全てのゲームオブジェクトにコライダーはついています
弾をplayerから出したいのでplayerの子要素にしてローカル座標で場所を指定するために子にしています。

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

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

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

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

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

Y0241-N

2020/03/26 02:19 編集

生成する弾と敵側の情報が無いとなぜ当たり判定が作用していないかが分かりかねます。 生成する弾にコライダーが付いているか、IsTrigger等の設定はどうなっているの情報を追記願います。
sakura_hana

2020/03/26 01:54

bullet_Instance.transform.parent = player.transform; ここで弾をプレイヤーの子にしてるので追従するのは当然ですね。 子にしないといけない理由があるのでしょうか?
Ken04

2020/03/26 02:19

弾をplayerから出したいのでplayerの子要素にしてローカル座標で場所を指定するためです。
guest

回答1

0

ベストアンサー

弾がプレイヤーの子オブジェクトになっているのが原因です。

弾をplayerから出したいのでplayerの子要素にしてローカル座標で場所を指定するためです。

それなら目的の位置は以下で求めてセット出来るので、わざわざ子にする必要は無いです。
bullet_Instance.transform.position = player.transform.position + player.transform.forward * 2.0f;

player.transform.forwardは「プレイヤーの正面方向のベクトル(ローカル座標で言うVector3(0, 0, 1))」なのでそれの2倍と、プレイヤーのワールド座標を足し、弾のワールド位置としています。

投稿2020/03/26 04:56

sakura_hana

総合スコア11427

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

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

Ken04

2020/03/26 07:53

その場合、どのようにして球を動かすのですか?
sakura_hana

2020/03/26 09:51

そのままで動きませんか?
Ken04

2020/03/27 23:28 編集

返信遅れて申し訳ありません。これだと、上や下を向いたとき向いた方向にとんでいきません。 bullet_Instance.transform.rotation = player.transform.rotation; はやってみましたが他に方法が思いつきません。
sakura_hana

2020/03/28 05:14

そりゃZ軸方向にしか動かしてないからそうなりますね。 rotationでプレイヤーに向きを合わせた後、「前進」すればいいので transform.localPosition += transform.forward * Time.deltaTime; とでもすればいいかと思います。(速度調整したい場合は更に適当な数字を掛け算してください) ただしこれだと一瞬ごとのワープになるので、物理演算が正しく動作しない(=弾が物体に衝突せず貫通する)可能性があります。 衝突しない原因は他にも色々あるので、まずは自分で調べたり試したりしてください。こちら→https://teratail.com/help/question-tips も参考に、「unity 物理演算 当たらない」などでググるとよいかと。 (positionとforward等も同様に、これらの意味を理解して、なぜこうすると動くのか把握すると今後の開発に役立ちます)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問