← 記事一覧に戻る

ブロック崩し1

手順

1)四隅を囲う
2)ボールを配置する
3)PhysicsMaterial2Dを作成する
→ボールと四角に設定
4)ボールのスクリプトを作る
(当たり判定以外)
5)ブロック配置、Ballで削除
6)クリアUI作成
7)Managerを作成し終了判定

PhysicsMaterial2D

BounceMaterial:Bounciness=1, Friction=0
対象:上左右の壁、ボール

FloorMaterial:Bounciness=0, Friction=0
対象:床

スクリプト

BallState.cs

csharp
1public enum BallState 2{ 3 Idle, 4 Flying 5}

Ball.cs
csharp
1using UnityEngine; 2using UnityEngine.InputSystem; 3 4public class Ball : MonoBehaviour 5{ 6 [SerializeField] private float launchSpeed = 8f; 7 [SerializeField] private GameManager gameManager; 8 private BallState state = BallState.Idle; 9 private Rigidbody2D rigidbody2d; 10 private Camera mainCamera; 11 12 void Awake() 13 { 14 rigidbody2d = GetComponent<Rigidbody2D>(); 15 rigidbody2d.gravityScale = 0f; 16 mainCamera = Camera.main; 17 } 18 19 void Update() 20 { 21 if (state != BallState.Idle) return; 22 23 Pointer pointer = Pointer.current; 24 if (pointer == null || !pointer.press.wasPressedThisFrame) return; 25 26 Vector2 screenPos = pointer.position.ReadValue(); 27 Vector3 worldPos = mainCamera.ScreenToWorldPoint( 28 new Vector3(screenPos.x, screenPos.y, -mainCamera.transform.position.z)); 29 30 Vector2 dir = ((Vector2)worldPos - (Vector2)transform.position).normalized; 31 rigidbody2d.linearVelocity = dir * launchSpeed; 32 state = BallState.Flying; 33 } 34 35 void OnCollisionEnter2D(Collision2D collision) 36 { 37 if (collision.collider.CompareTag("Block")) 38 { 39 Destroy(collision.gameObject); 40 gameManager.NotifyBlockDestroyed(); 41 return; 42 } 43 44 if (state == BallState.Flying && collision.collider.CompareTag("Floor")) 45 { 46 rigidbody2d.linearVelocity = Vector2.zero; 47 state = BallState.Idle; 48 } 49 } 50}

GameManager
csharp
1using UnityEngine; 2 3public class GameManager : MonoBehaviour 4{ 5 [SerializeField] private GameObject clearUIPanel; 6 7 private int remainingBlocks; 8 9 void Start() 10 { 11 clearUIPanel.SetActive(false); 12 remainingBlocks = GameObject.FindGameObjectsWithTag("Block").Length; 13 } 14 15 public void NotifyBlockDestroyed() 16 { 17 remainingBlocks--; 18 if (remainingBlocks <= 0) 19 { 20 clearUIPanel.SetActive(true); 21 } 22 } 23} 24