Unityで2Dの横スクロールアクションゲームを制作しています。
左方向に弾を発射する敵を設置し、移動しない足場の上にいる敵の弾はちゃんと飛んで行くのですが、
移動する足場の上にいる敵の弾が、出現した位置から飛んで行かずに消えてしまいます。出現した位置に留まるのではなく、消えるまで発射した敵と一緒に移動しています。
弾の位置を他のオブジェクトのコライダーと被らない様にしても、飛んで行く方向を変えても変化はありませんでした。
何処を直せば良いでしょうか?
また、これは移動しない足場にいる敵にも言えるのですが、発射される1発目が飛んで行かずに、出現してすぐに消えてしまいます。その後の2発目はちゃんと飛んで行くのですが。
可能であれば、1つ目の問題と併せてご回答・アドバイス頂きたいです。
↓敵のスクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy_Zako9 : MonoBehaviour { [Header("攻撃オブジェクト")] public GameObject attackObj; [Header("攻撃間隔")] public float interval; [Header("重力")] public float gravity; [Header("やられた時に鳴らすSE")] public AudioClip deadSE; private Rigidbody2D rb = null; private SpriteRenderer sr = null; private ObjectCollision oc = null; private BoxCollider2D col = null; private bool isDead = false; private float deadTimer = 0.0f; private Animator anim; private float timer; // Start is called before the first frame update void Start() { rb = GetComponent<Rigidbody2D>(); sr = GetComponent<SpriteRenderer>(); oc = GetComponent<ObjectCollision>(); col = GetComponent<BoxCollider2D>(); anim = GetComponent<Animator>(); if (anim == null || attackObj == null) { Debug.Log("設定が足りません"); Destroy(this.gameObject); } else { attackObj.SetActive(false); } } // Update is called once per frame void Update() { AnimatorStateInfo currentState = anim.GetCurrentAnimatorStateInfo(0); //通常の状態 if (currentState.IsName("zako-9_idle")) { if (timer > interval) { anim.SetTrigger("attack"); timer = 0.0f; } else { timer += Time.deltaTime; } } } void FixedUpdate() { if (!oc.playerStepOn) { if (sr.isVisible ) { } } else { if (!isDead) { anim.Play("zako-9_dead"); rb.velocity = new Vector2(0, -gravity); isDead = true; col.enabled = false; if (GManager.instance != null) { GManager.instance.PlaySE(deadSE); } } else { if (deadTimer > 1.0f) { Destroy(this.gameObject); } else { deadTimer += Time.deltaTime; } } } } public void Attack() { GameObject g = Instantiate(attackObj); g.transform.SetParent(transform); g.transform.position = attackObj.transform.position; g.SetActive(true); } }
↓敵が発射する弾のスクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyAttack : MonoBehaviour { [Header("スピード")] public float speed = 3.0f; [Header("最大移動距離")] public float maxDistance = 100.0f; private Rigidbody2D rb; private Vector3 defaultPos; // Start is called before the first frame update void Start() { rb = GetComponent<Rigidbody2D>(); if (rb == null) { Debug.Log("設定が足りません"); Destroy(this.gameObject); } defaultPos = transform.position; } // Update is called once per frame void FixedUpdate() { float d = Vector3.Distance(transform.position, defaultPos); //最大移動距離を超えている if (d > maxDistance) { Destroy(this.gameObject); } else { rb.MovePosition(transform.position + Vector3.left * Time.deltaTime * speed); } } private void OnTriggerEnter2D(Collider2D collision) { Destroy(this.gameObject); } }
Unityバージョン:Unity 2019.2.15f1 (64-bit)
<追記>
↓Debug.Logを入れた弾のスクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyAttack : MonoBehaviour { [Header("スピード")] public float speed = 3.0f; [Header("最大移動距離")] public float maxDistance = 100.0f; private Rigidbody2D rb; private Vector3 defaultPos; // Start is called before the first frame update void Start() { rb = GetComponent<Rigidbody2D>(); if (rb == null) { Debug.Log("設定が足りません"); Destroy(this.gameObject); } defaultPos = transform.position; Debug.Log(defaultPos); } // Update is called once per frame void FixedUpdate() { float d = Vector3.Distance(transform.position, defaultPos); Debug.Log(transform.position); //最大移動距離を超えている if (d > maxDistance) { Debug.Log("超えました"); Destroy(this.gameObject); } else { rb.MovePosition(transform.position + Vector3.left * Time.deltaTime * speed); } } private void OnTriggerEnter2D(Collider2D collision) { Debug.Log("ぶつかりました"); Destroy(this.gameObject); } }
↓移動しない足場の敵で確認 (親オブジェクトである敵の座標:(10.9,-2.5,0))
生成されてすぐにぶつかり消滅、
2発目は、y座標の数値が-0.1違う状態で生成され、移動距離の限界まで移動している様です。
↓移動する足場の敵で確認 (親オブジェクトである敵の座標:(22.9,-2.5,0))
同じく、生成されてすぐにぶつかり消滅、
その後、移動する足場の関係で上下に移動している敵から生成され、
しばらくの間、y座標の数値だけ0.1ずつ変化し続け、
再びぶつかり判定で消滅していました。
↓移動する足場のスクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveObject : MonoBehaviour { [Header("移動経路")] public GameObject[] movePoint; [Header("速さ")] public float speed = 1.0f; private Rigidbody2D rb; private int nowPoint = 0; private bool returnPoint = false; private Vector2 oldPos = Vector2.zero; private Vector2 myVelocity = Vector2.zero; private void Start() { rb = GetComponent<Rigidbody2D>(); if (movePoint != null && movePoint.Length > 0 && rb != null) { rb.position = movePoint[0].transform.position; oldPos = rb.position; } } public Vector2 GetVelocity() { return myVelocity; } private void FixedUpdate() { if (movePoint != null && movePoint.Length > 1 && rb != null) { //通常進行 if (!returnPoint) { int nextPoint = nowPoint + 1; //目標ポイントとの誤差がわずかになるまで移動 if (Vector2.Distance(transform.position, movePoint[nextPoint].transform.position) > 0.1f) { //現在地から次のポイントへのベクトルを作成 Vector2 toVector = Vector2.MoveTowards(transform.position, movePoint[nextPoint].transform.position, speed * Time.deltaTime); //次のポイントへ移動 rb.MovePosition(toVector); } //次のポイントを1つ進める else { rb.MovePosition(movePoint[nextPoint].transform.position); ++nowPoint; //現在地が配列の最後だった場合 if (nowPoint + 1 >= movePoint.Length) { returnPoint = true; } } } //折返し進行 else { int nextPoint = nowPoint - 1; //目標ポイントとの誤差がわずかになるまで移動 if (Vector2.Distance(transform.position, movePoint[nextPoint].transform.position) > 0.1f) { //現在地から次のポイントへのベクトルを作成 Vector2 toVector = Vector2.MoveTowards(transform.position, movePoint[nextPoint].transform.position, speed * Time.deltaTime); //次のポイントへ移動 rb.MovePosition(toVector); } //次のポイントを1つ戻す else { rb.MovePosition(movePoint[nextPoint].transform.position); --nowPoint; //現在地が配列の最初だった場合 if (nowPoint <= 0) { returnPoint = false; } } } myVelocity = (rb.position - oldPos) / Time.deltaTime; oldPos = rb.position; } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/04 07:30
2020/05/04 07:35
2020/05/04 17:31
2020/05/05 00:24
2020/05/12 08:37