プレイヤーに弾を発射させる設定をしており、プレイヤーと弾自体につけるスクリプトが出来た時点で動作確認をしたところ、弾がプレイヤーの後ろで生成され、プレイヤーが押されてしまいました。
弾をプレイヤーの前方から発射するには、どこを変えたら良いでしょうか?
※座標は弾が生成された座標で、x座標がプレイヤーの初期位置である「StartPos」のものと同じになっている様です。
また、弾とプレイヤーが衝突しない様にProjectSettingsで設定したのにプレイヤーが押されるのも、よく分かりません。
↓参考サイト
https://yokubari.online/unity/how-to-prefab-and-layer/
※弾はプレイヤーの子オブジェクトにしたり、Hierarchyに設置したりせず、プレイヤーにつけたスクリプトからProjectにあるプレハブのBulletを選択している状態です。
↓弾のスクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Bullet : MonoBehaviour { // 弾オブジェクト(Inspectorでオブジェクトを指定) [SerializeField] // Inspectorで操作できるように属性を追加します private GameObject bullet; // 弾オブジェクトのRigidbody2Dの入れ物 private Rigidbody2D rb2d; // 弾オブジェクトの移動係数(速度調整用) float bulletSpeed; void Start() { // オブジェクトのRigidbody2Dを取得 rb2d = GetComponent<Rigidbody2D>(); // 弾オブジェクトの移動係数を初期化 bulletSpeed = 10.0f; // 出現から3秒後に弾オブジェクトを消滅させる(メモリの節約) Destroy(gameObject, 3.0f); } void Update() { // 弾オブジェクトの移動関数 BulletMove(); } // 弾オブジェクトの移動関数 void BulletMove() { // 弾オブジェクトの移動量ベクトルを作成(数値情報) Vector2 bulletMovement = new Vector2(1, 0).normalized; // Rigidbody2D に移動量を加算する rb2d.velocity = bulletMovement * bulletSpeed; } // ENEMYと接触したときの関数 void OnCollisionEnter2D(Collision2D collision) { // ENEMYに弾が接触したら弾は消滅する if (collision.gameObject.tag == "Enemy") { Destroy(gameObject); } } }
↓プレイヤー側のスクリプト
(字数制限で、「Player」のコードが貼れず、画像も反映されなくなったため省略しましたが、解決に必要とあれば、後で追記します。すみません。)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerBullet : MonoBehaviour { #pragma warning disable 0649 // InspectorでPrefab化したBulletを指定する [SerializeField] private GameObject bullet; void Update() { // 弾オブジェクトを生成して飛ばす関数を呼び出す ShotAction(); } // 弾オブジェクトを生成して飛ばす関数 void ShotAction() { if (Input.GetButtonDown("Fire1")) { Instantiate(bullet, transform.position, transform.rotation); Debug.Log(transform.position); } } }
Unityバージョン:Unity 2019.2.15f1 (64-bit)
追記:5/13に教えて頂いたスクリプトについて
スクリプトを教えて頂いたものに変更したところ、弾がプレイヤーの後ろに飛んで行く様になりました。
やはりプレイヤーの向きが変わっても、弾の方向は変わっていません。
足りていないと思って、私が自分で足した部分が原因でしょうか?
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Bullet : MonoBehaviour { // 弾オブジェクト(Inspectorでオブジェクトを指定) [SerializeField] // Inspectorで操作できるように属性を追加します private GameObject bullet; // 弾オブジェクトのRigidbody2Dの入れ物 private Rigidbody2D rb2d; // 弾オブジェクトの移動係数(速度調整用) float bulletSpeed; private Vector2 direction = Vector2.right; void Start() { // オブジェクトのRigidbody2Dを取得 rb2d = GetComponent<Rigidbody2D>(); // 弾オブジェクトの移動係数を初期化 bulletSpeed = 10.0f; // 出現から3秒後に弾オブジェクトを消滅させる(メモリの節約) Destroy(gameObject, 3.0f); } void Update() { // 弾オブジェクトの移動関数 BulletMove(); } public void SetDirection(bool isLeft) { // 左方向なら(-1.0, 0.0)方向に、右方向なら(1.0, 0.0)方向に進む direction = isLeft ? Vector2.left : Vector2.right; // スプライト画像の反転処理(画像のデフォルトが右方向の向いているもの前提) var sprite = GetComponent<SpriteRenderer>(); if (sprite != null) { sprite.flipY = isLeft; } } void BulletMove() { // Rigidbody2D に移動量を加算する rb2d.velocity = direction * bulletSpeed; } // ENEMYと接触したときの関数 void OnCollisionEnter2D(Collision2D collision) { // ENEMYに弾が接触したら弾は消滅する if (collision.gameObject.tag == "Enemy") { Destroy(gameObject); } if (collision.gameObject.tag == "Ground") { Destroy(gameObject); } if (collision.gameObject.tag == "MoveFloor") { Destroy(gameObject); } if (collision.gameObject.tag == "JumpStep") { Destroy(gameObject); } if (collision.gameObject.tag == "GroundPlatform") { Destroy(gameObject); } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerBullet : MonoBehaviour { #pragma warning disable 0649 // InspectorでPrefab化したBulletを指定する [SerializeField] private GameObject bullet; // ユーザーがどちらを向いているか private bool isLeft = true; void Update() { // 弾オブジェクトを生成して飛ばす関数を呼び出す ShotAction(); } void ShotAction() { Vector3 offset = new Vector3(1.0f, 0.0f, 0.0f); // isLeft は仮の変数です。現在向いている方向を判定するフラグなどを用意してみてください。 // 向いている方向が反対ならx座標を反転する if (isLeft) { offset.x = -offset.x; } if (Input.GetButtonDown("Fire1")) { // Bulletコンポーネントがアタッチしている前提 var bulletObj = Instantiate(bullet, transform.position + offset, transform.rotation); bulletObj.GetComponent<Bullet>().SetDirection(isLeft); } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/10 13:07
2020/05/12 08:44
2020/05/13 00:56
2020/05/13 02:45
2020/05/13 10:02
2020/05/16 08:50
2020/05/16 12:39
2020/05/16 16:48