Cou氏の徒然日記(2021)

ほのぼの日記ブログです。

Unityで遊ぼう [ブロック崩し編 その1:オブジェクト準備]

以前、Unityを触ってみようということで、簡単なボール転がしのゲームや、ML-Agentsを用いた機械学習を作成してみました。

 

 

それからかなり期間が空いてしまい、またかなり忘れてしまいました(笑)

思い出しがてら何か作ってみようかなということで、ちょっと作ってみたいと思っていたブロック崩しを作ってみようと思います。

 

ブロック崩しで必要となるオブジェクトとしては・・・

  • プレイヤー用のバーオブジェクト
  • ボール
  • ブロック
  • 外側の枠

の4つになります。

 

ということで、まずはオブジェクトを適当に作成。

f:id:coublood:20210116011514p:plain

外側の枠は、100×100の大きさ。

そこに、壁用のCubeを4つ(厚さ1)をくっつけ、あとはブロックとボールとバーを配置。

あとはここから順に設定していくだけです。

 

(1) Ridigbodyの追加

まずはオブジェクトに物理運動の判定が必要なものにはその設定を追加。

coublood.hatenablog.com

Add ComponentでRegidbodyを追加。

これで物理運動が可能になります。

本当に簡単ですよね。

 

(2) スクリプト追加 (プレイヤー用バーオブジェクト)

そして次は、プレイヤー用バーオブジェクトのスクリプトから。

これは、左右に動けばいいので、

  • 左を押したときに左に
  • 右を押したときに右に

オブジェクトが動けばOKです。

(それ以外のキーが押されたときの実装は不要)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed = 50.0f;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            if (this.transform.position.x > -45){
                this.transform.position += Vector3.left * speed * Time.deltaTime;
            }
        }

        if (Input.GetKey(KeyCode.RightArrow))
        {
            if (this.transform.position.x < 45){
                this.transform.position += Vector3.right * speed * Time.deltaTime;
            }
        }          
    }
}

(*) Time.deltaTimeについては色々とややこしいので詳細は割愛します。

実際、Update関数はフレーム単位で呼ばれる関数。そのため、そのフレーム間で押した時間をかけないと、フレームの処理単位によって、動作が変わってしまいます。

(同じ時間だけキー入力したとしても、1フレーム当たりの間隔が短ければ、呼び出し回数が増え、その分移動が速くなる。逆に間隔が長ければ、呼び出し回数が減り、その分移動が遅くなってしまいます。

 

ということでお試し。


ブロック崩し テスト1

 

うん、動きましたが、壁の厚みの分を計算していないのでめり込みますね(苦笑)

-50~50の端に厚さ1で壁を付けているので、左端の座標は-49、右端の座標は49になります。

プレイヤーオブジェクトは大きさ10。

オブジェクトの左端は(中心点-5)、右端は(中心点+5)で計算しないといけないので、判定は「-44」と「44」でやらないとダメでした。

 

いやー、このあたりの座標計算は本当に苦手です・・・(苦笑)

 

続きます。