Unity初心者です。「プレイヤーの弾が後ろに飛んで行く」、「プレイヤーの向きが変わっても、弾の向きが変わらない」のを修正したいです。
字数制限のため、プレイヤーのスクリプトは画像になります。分かり辛くてすみません。
プレイヤーについている弾発射用スクリプト
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); } } }
弾のスクリプト
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); } } }
弾はプレイヤーの子オブジェクトにせず、Project上にあるPrefabをInspectorから指定しています。
追記(5/17)
PlayerBulletのprivate bool isLeft の = true; を消したところ、弾が前方(左方向)に飛んで行く様になりました。当然かも知れませんが、プレイヤーの向きが変わっても左に飛んで行きます。
追記(5/18)
PlayerBulletとBulletのコードは、以前投稿した「プレイヤー弾がプレイヤーの後ろから出て、プレイヤーが押される」で、回答として頂いたコードをもとにしています。「isLeft は仮の変数です」といった所々の書き込みもそのまま残してあります。
追記_2
頂いたアドバイスをもとに下記まで進みました。
private float GetXSpeed() { float horizontalKey = Input.GetAxis("Horizontal"); float xSpeed = 0.0f; if (horizontalKey > 0) { transform.localScale = new Vector3(1, 1, 1); isRun = true; dashTime += Time.deltaTime; xSpeed = speed; isLeft = true; //New } else if (horizontalKey < 0) { transform.localScale = new Vector3(-1, 1, 1); isRun = true; dashTime += Time.deltaTime; xSpeed = -speed; isLeft = false; //New } else { isRun = false; xSpeed = 0.0f; dashTime = 0.0f; }
※プライベート変数をまとめてある部分に「public bool isLeft = false;」も追加してあります。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerBullet : MonoBehaviour { // InspectorでPrefab化したBulletを指定する [SerializeField] public GameObject bullet; public GameObject player; //New private bool isLeft; // ユーザーがどちらを向いているか void Start() { isLeft = player.GetComponent<Player>().isLeft; } void Update() { // 弾オブジェクトを生成して飛ばす関数を呼び出す ShotAction(); } void ShotAction() { Vector3 offset = new Vector3(1.0f, 0.0f, 0.0f); //New if(isLeft == true) { } if(isLeft == false) { } if (Input.GetButtonDown("Fire1")) { // Bulletコンポーネントがアタッチしている前提 var bulletObj = Instantiate(bullet, transform.position + offset, transform.rotation); bulletObj.GetComponent<Bullet>().SetDirection(isLeft); } } }
あと少しだと思うのですが、PlayerBulletのコードで ==trueと==false の中身をどう書いたら良いのかで悩んでいます。
回答2件
あなたの回答
tips
プレビュー