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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

917閲覧

弾を発射する処理が上手くできない

kosho206

総合スコア41

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/06/04 01:12

3DのTPS系ゲームです。
プレイヤーが弾を発射するコードを書いているのですが、上手くいきません。
弾が飛んでいく方向が変です。
一回目は狙った方向に飛んでいくのですが、2回目以降は狙った場所に関係なく、必ず決まった方向に飛んでしまいます。
弾を発射する仕組みは、以下です。
・Instantiateなどは使わず、SetActiveを使って弾の発射をする。
・プレイヤーから弾を出すのではなく、弾を発射する用のプレイヤーの空の子オブジェクトから弾を発射する。
・カメラのアングルで発射の縦の向き(x軸の向き)を決めて、発射のy軸の向きはプレイヤーのy軸の向きと同じにする。
・弾の発射の挙動はPUBGの手榴弾を投げる時と似たような感じにしたい。

弾の発射用のコードは以下です。

using System.Collections; using System.Collections.Generic; using UnityEngine; namespace CSharpScript { public class UnkoBon : MonoBehaviour { [SerializeField, Tooltip("砲身のオブジェクト")] private GameObject barrelObject; // 弾を生成する位置情報 private Vector3 instantiatePosition; // 弾の生成座標(読み取り専用) public Vector3 InstantiatePosition { get { return instantiatePosition; } private set { instantiatePosition = value; } } [SerializeField, Range(10f, 150f), Tooltip("弾の射出する速さ")] private float speed = 1.0F; // 弾の初速度 private Vector3 shootVelocity; // 弾の初速度(読み取り専用) public Vector3 ShootVelocity { get { return shootVelocity; } private set { shootVelocity = value; } } Camera MainCamera; Vector3 CameraAngle; Vector3 UnkoManAngle; Vector3 UnkoBonAngle; Animator Anim; [SerializeField] GameObject Unko; Rigidbody rid; private bool UnkoSet; public bool unkoSet { get { return UnkoSet; } private set { UnkoSet = value; } } void Start() { MainCamera = Camera.main; UnkoSet = false; Anim = barrelObject.GetComponent<Animator>(); Unko.SetActive(false); rid = Unko.GetComponent<Rigidbody>(); } void Update() { CameraAngle = MainCamera.transform.eulerAngles; UnkoManAngle = barrelObject.transform.eulerAngles; // 弾の生成座標を更新 instantiatePosition = this.transform.position; this.transform.rotation = Quaternion.Euler(CameraAngle.x - 15f, UnkoManAngle.y, 0f); UnkoBonAngle = this.transform.forward; // 弾の初速度を更新 shootVelocity = UnkoBonAngle * speed;//2回目以降必ず決まった方向に飛ぶ。UnkoBonの向きは正常。 Debug.Log(shootVelocity); if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Untiburi")) { UnkoSet = true; } if (UnkoSet == true) { if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Untiburi")) { Unko.transform.position = instantiatePosition; if (Input.GetMouseButtonUp(0)) { Unko.SetActive(true); rid.AddForce(shootVelocity, ForceMode.Impulse);//二回目以降は必ず決まった方向に飛ぶ UnkoSet = false; } } } } } }

これは弾の発射用オブジェクトであるプレイヤーの子オブジェクトにアタッチするものです。
発射した弾を非アクティブにするコードは弾のスクリプトに書いています。弾がcolliderに接触したら非アクティブにするようにしています。
このコードは、最初に書いた通り、弾が発射される方向が上手くいかないです。
もう一度書くと、
一回目は狙った場所にしっかり飛ぶのですが、二回目以降は狙った場所に関係なく毎回同じ方向に飛んでしまいます。
こうなってしまう原因とその対処法がわかる方がいましたら教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

環境無いので、確認できませんが、弾の発射用オブジェクトを使いまわしてるとしたら、
大体はforceを初期化してないために前回のforceを引き継いでる関係でおかしくなるときがあります。
初期化してみたらどうでしょう

How can I reset a rigidbody?
ここらへんが参考になるかと

投稿2020/06/04 03:29

rururu3

総合スコア5545

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

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

kosho206

2020/06/05 05:41

ありがとうございます。 弾のobjを非アクティブにする時に、Rigidbody.velocityを0にしたら問題なく狙った方向に弾が飛んでいくようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問