記事を参考にピタゴラスの定理を使って当たり判定を実装しました。今は敵の弾からプレイヤーに当たったかを判定しています。
using
1using System.Collections.Generic; 2using UnityEngine; 3 4public class Collision_controller : MonoBehaviour 5{ 6 7 /// <summary> 8 /// 当たり判定をするメソッド、弾に持たせることを想定 9 /// </summary> 10 /// <param name="owncol">弾の半径</param> 11 /// <param name="othercol">対象の半径</param> 12 /// <param name="ownX">弾のx座標</param> 13 /// <param name="ownY">弾のy座標</param> 14 /// <param name="otherX">対象のx座標</param> 15 /// <param name="otherY">対象のy座標</param> 16 /// <returns>true=当たってる,false=当たってない</returns> 17 public bool Collision_hit_check(double owncol, double othercol, double ownX, double ownY, double otherX, double otherY) 18 { 19 double length = owncol + othercol;//二つのオブジェクトの距離 20 double xlength = ownX - otherX;//xの距離 21 double ylength = ownY - otherY;//yの距離 22 23 if (length * length >= xlength * xlength + ylength * ylength) 24 { 25 print("hit"); 26 return true; 27 } 28 else 29 { 30 print("nohit"); 31 return false; 32 } 33 } 34} 35当たり判定のチェック
using
1using System.Collections.Generic; 2using UnityEngine; 3 4public class E_bullet : MonoBehaviour { 5 6 private Collision_controller Collision; 7 private Radius Radius; 8 private GameObject Targetobj; 9 private float Thiscol; 10 private float Targetcol; 11 private float This_pos_x; 12 private float This_pos_y; 13 private float Target_pos_x; 14 private float Target_pos_y; 15 16 private void Awake() 17 { 18 Targetobj = GameObject.FindWithTag("player"); 19 Collision = GameObject.FindWithTag("controller").GetComponent<Collision_controller>(); 20 Radius = this.GetComponent<Radius>(); 21 } 22 23 private void OnEnable() 24 { 25 Thiscol = Radius.ReturnRadius(); 26 Targetcol = Targetobj.GetComponent<Radius>().ReturnRadius(); 27 Serialize(); 28 if (Targetobj.activeSelf) 29 { 30 StartCoroutine("HitCheck"); 31 } 32 else 33 { 34 StopCoroutine("HitCheck"); 35 } 36 } 37 38 private void Serialize() 39 { 40 if (!Targetobj.activeSelf) 41 { 42 StopCoroutine("HitCheck"); 43 } 44 This_pos_x = this.gameObject.transform.position.x; 45 This_pos_y = this.gameObject.transform.position.y; 46 Target_pos_x = Targetobj.transform.position.x; 47 Target_pos_y = Targetobj.transform.position.y; 48 } 49 50 private IEnumerator HitCheck() 51 { 52 while (true) 53 { 54 Serialize(); 55 if (Collision.Collision_hit_check(Thiscol, Targetcol, This_pos_x, This_pos_y, Target_pos_x, Target_pos_y)) 56 { 57 Targetobj.SetActive(false); 58 this.gameObject.SetActive(false); 59 } 60 yield return null; 61 } 62 } 63} 64当たり判定のチェックの呼び出し元
今はコルーチンで呼び出しているの出すが、敵の弾一つ一つが毎フレーム呼び出しているのでかなり重たいです。何か良い方法はありますでしょうか。
「かなり重たいです。」だけでは情報不足ですので、まずはどの部分が重いのかご確認ください。
・1フレームに表示される弾の数
・1フレームに各メソッド(OnEnable(), Serialize(), Collision_hit_check())が呼ばれる回数
・各メソッド(OnEnable(), Serialize(), Collision_hit_check())が 1 回呼ばれるのにかかる時間(ミリ秒)
また、「Circle Collider 2D」を使っていないのは、何か理由がありますか?
確認したところ自分で解決できました。完全に見落としていました。
Circle Collider 2D のRadiusを使っています。
回答1件
あなたの回答
tips
プレビュー