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

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

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

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

Q&A

解決済

1回答

807閲覧

Unity2D C# シューティングゲームの当たり判定を軽くする

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2020/02/20 14:50

記事を参考にピタゴラスの定理を使って当たり判定を実装しました。今は敵の弾からプレイヤーに当たったかを判定しています。

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当たり判定のチェックの呼び出し元

今はコルーチンで呼び出しているの出すが、敵の弾一つ一つが毎フレーム呼び出しているのでかなり重たいです。何か良い方法はありますでしょうか。

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

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

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

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

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

nskydiving

2020/02/21 02:03

「かなり重たいです。」だけでは情報不足ですので、まずはどの部分が重いのかご確認ください。 ・1フレームに表示される弾の数 ・1フレームに各メソッド(OnEnable(), Serialize(), Collision_hit_check())が呼ばれる回数 ・各メソッド(OnEnable(), Serialize(), Collision_hit_check())が 1 回呼ばれるのにかかる時間(ミリ秒) また、「Circle Collider 2D」を使っていないのは、何か理由がありますか?
退会済みユーザー

退会済みユーザー

2020/03/03 07:32

確認したところ自分で解決できました。完全に見落としていました。 Circle Collider 2D のRadiusを使っています。
guest

回答1

0

ベストアンサー

非表示になっているオブジェクトも対象の当たり判定を取っていたため重たくなっていました。非表示の場合は処理を実行しないようにすることで解決できました。

投稿2020/03/03 07:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問