ウィンナスのプログラミング忘備録

アプリケーション制作をしている最中に発見したテクニックを忘備録としてまとめていきます。

【開発日記:ブロック崩し】第4回 ボールの衝突処理を実装しました!

第4回目となりました!

とりあえずこれで最後って感じです。

今回やる内容は以下の通りです。

  • ブロックをプレハブ化する
  • 上下左右に衝突したときブロックを生成する
  • ボールが衝突したときにブロックを削除する

こんな感じです!

 

 ブロックをプレハブ化する

ブロックを汎用的に使えるようにプレハブ化します。

プレハブについては以下の記事を参考にしてください!

それぞれのブロックに「Box Collider」とスクリプト「BlockActivity.cs」を設定していきます。

 

上下左右に衝突したときブロックを生成する

ボールがプレイヤーに衝突したときにブロックが生成されるようにします。

ボールに設定されているスクリプト「ballActivity.cs」を下のように編集します。

 
//ブロックプレハブ
public GameObject block_red;
public GameObject block_blue;

//ベクトル
float speed_x = 0.5f;
float speed_y = 0.5f;

Vector2 vec;

// Use this for initialization
void Start () {
  //乱数で初期方向を決める
  if (Random.Range (1, 100) > 50) {
    speed_x *= -1;
  }
  if(Random.Range(1, 100) < 50){
    speed_y *= -1;
  }

  vec.x = speed_x * Time.deltaTime;
  vec.y = speed_y * Time.deltaTime;
  GetComponent().AddForce (vec, ForceMode2D.Force);
}
	
// Update is called once per frame
void Update () {
}

//衝突処理
void OnCollisionEnter2D(Collision2D col){
  //衝突したオブジェクトごとに処理をする
  switch (col.gameObject.tag) {
  //左右にぶつかった時に青いブロックを生成する
  case "player_left":
    createBlock ("blue");
    break;
  case "player_right":
    createBlock ("blue");
    break;
  //上下にぶつかった時に赤いブロックを生成する
  case "player_top":
    createBlock ("red");
    break;
  case "player_bottom":
    createBlock ("red");
    break;
  }
}

//ブロックの生成
private void createBlock(string color){
  Vector2 vec = transform.position;
  //乱数で生成する位置を決める
  vec.x = Random.Range (-5, 5);
  vec.y = Random.Range (-3, 3);

  //赤いブロックを生成する
  if (color.Equals ("red")) {
    GameObject go = (GameObject)Instantiate (block_red, vec, transform.rotation);
  }
  //青いブロックを生成する
  else if (color.Equals ("blue")) {
    GameObject go = (GameObject)Instantiate (block_blue, vec, transform.rotation);
  }
}

衝突する処理と生成処理になります。

 

ボールが衝突したときにブロックを削除する

今度は先ほど作成したブロックに設定したブロックのスクリプト「BlockActivity.cs」に以下を記述していきます。

void OnCollisionEnter2D(Collision2D col){
  if (col.gameObject.tag.Equals("ball")) {
    Invoke ("del", 0.05f);
  }
}
void del(){
  Destroy (this.gameObject);
}

 

ぶつかったゲームオブジェクトのタグがボールだったときに削除します。

delメソッドでブロックを削除します。

削除の処理については以下の記事を参考にしてください!

winnassmemo.hatenablog.jp

「Invoke」を設定していますが、これを設定しないとボールが反射しないで素通りしてしまいますww

というのも設定しない場合、反射する前にオブジェクトが消滅してしまうんですよね^^;

まぁ0.05秒がちょうどいい感じでした!

 

これで一通りのブロック崩しが出来上がりました!