using UnityEngine; using UniRx; using UniRx.Triggers; public class AvoidBulletExample : MonoBehaviour { [SerializeField] private Collider2D avoidCollider; // 対象となるコライダーのアサイン private void OnTriggerStay2D(Collider2D other) { // 壁や床に対して侵入しているコライダーにアタッチされているクラスを確認して弾であるかを判定する if(other.gameObject.TryGetComponent(out Bullet bullet)) { // OnTriggerStay2Dイベントが発生した際の処理 Debug.Log($"OnTriggerStay2D event triggered with collider: { bullet.gameObject.name }"); // ここで弾を消す Destroy(bullet.gameObject); } } }
using UnityEngine; using UniRx; using UniRx.Triggers; public class AvoidBulletExample : MonoBehaviour { [SerializeField] private Collider2D avoidCollider; // 対象となるコライダーのアサイン void Start() { // OnTriggerStay2DのイベントをUniRxで購読 avoidCollider .OnTriggerStay2DAsObservable() .Where(otherCollider => otherCollider.gameObject.TryGetComponent(out Bullet bullet)) .Subscribe(otherCollider => { // OnTriggerStay2Dイベントが発生した際の処理 Debug.Log($"OnTriggerStay2D event triggered with collider: { otherCollider.name }"); // ここで弾を消す(otherCollider を利用する) if(otherCollider.gameObject.TryGetComponent(out Bullet bullet)){ Destroy(bullet.gameObject); } }) .AddTo(this); // サブスクリプションを破棄するために、このコンポーネントが破棄された時に自動的に破棄するように登録 } }
public LayerMask obstacleLayer; // 壁や障害物のレイヤーマスク private float radius = 0.1f; // コライダー判定用の円の半径 // コライダーの有無を判定するメソッド private bool CheckColliderAtPosition(Vector2 position) { Collider2D hitCollider = Physics2D.OverlapCircle(position, radius, obstacleLayer); return hitCollider != null; }
// 弾の生成 // コライダーの有無を判定して結果を取得 bool hasCollider = CheckColliderAtPosition([弾の生成位置]); if (hasCollider) { // コライダーがある場合は弾をすぐに破壊。+ 演出 Destroy(bullet); return; } // コライダーがない場合は通常の処理を続行
using UnityEngine; public class BulletController : MonoBehaviour { public LayerMask obstacleLayer; // 壁や障害物のレイヤーマスク // 弾の生成メソッド public void SpawnBullet(Vector2 spawnPosition) { // 弾の生成 GameObject bullet = Instantiate(gameObject, spawnPosition, Quaternion.identity); // コライダーの有無を判定して結果を取得 bool hasCollider = CheckColliderAtPosition(spawnPosition); if (hasCollider) { // コライダーがある場合は弾をすぐに破壊 Destroy(bullet); } else { // コライダーがない場合は通常の処理を続行 // ここで弾の速度や移動方向などの設定を行うことができます } } // コライダーの有無を判定するメソッド private bool CheckColliderAtPosition(Vector2 position) { Collider2D hitCollider = Physics2D.OverlapCircle(position, 0.1f, obstacleLayer); return hitCollider != null; } }
public Tilemap obstacleTilemap; // 壁や障害物のTilemap // タイルマップを利用してコライダーの有無を判定するメソッド private bool CheckColliderAtPosition(Vector2 position) { // タイル座標に変換 Vector3Int cellPosition = obstacleTilemap.WorldToCell(position); // タイルの取得 TileBase tile = obstacleTilemap.GetTile(cellPosition); // タイルが存在し、TileColliderがある場合はコライダーがあると判定 return tile != null && tile.GetComponent<TilemapCollider2D>() != null; }
public Tilemap[] obstacleTilemaps; // 壁や障害物のTilemapの配列 // 複数のタイルマップを利用してコライダーの有無を判定するメソッド private bool CheckColliderAtPosition(Vector2 position) { foreach (var tilemap in obstacleTilemaps) { // タイル座標に変換 Vector3Int cellPosition = tilemap.WorldToCell(position); // タイルの取得 TileBase tile = tilemap.GetTile(cellPosition); // タイルが存在し、TileColliderがある場合はコライダーがあると判定 if (tile != null && tile.GetComponent<TileCollider>() != null) { return true; // コライダーが見つかれば即座にtrueを返して終了 } } return false; // 複数のタイルマップをチェックしてもコライダーが見つからない場合はfalseを返す }
using UnityEngine; using UnityEngine.Tilemaps; public class BulletController : MonoBehaviour { public Tilemap[] obstacleTilemaps; // 壁や障害物のTilemapの配列 // 弾の生成メソッド public void SpawnBullet(Vector2 spawnPosition) { // 弾の生成 GameObject bullet = Instantiate(gameObject, spawnPosition, Quaternion.identity); // コライダーの有無を判定して結果を取得 bool hasCollider = CheckColliderAtPosition(spawnPosition); if (hasCollider) { // コライダーがある場合は弾をすぐに破壊 Destroy(bullet); } else { // コライダーがない場合は通常の処理を続行 // ここで弾の速度や移動方向などの設定を行うことができます } } // 複数のタイルマップを利用してコライダーの有無を判定するメソッド private bool CheckColliderAtPosition(Vector2 position) { foreach (var tilemap in obstacleTilemaps) { // タイル座標に変換 Vector3Int cellPosition = tilemap.WorldToCell(position); // タイルの取得 TileBase tile = tilemap.GetTile(cellPosition); // タイルが存在し、TileColliderがある場合はコライダーがあると判定 if (tile != null && tile.GetComponent<TileCollider>() != null) { return true; // コライダーが見つかれば即座にtrueを返して終了 } } return false; // 複数のタイルマップをチェックしてもコライダーが見つからない場合はfalseを返す } }