Unity - ブロック崩しチュートリアルで学んだこと
はじめに
本記事は自分の理解のために雑にまとめたもの。
参考 URL
http://tutorial.unity3d.jp/archive/my-first-unity/
http://baba-s.hatenablog.com/entry/2018/01/16/212800
http://baba-s.hatenablog.com/entry/2018/01/16/212900
http://baba-s.hatenablog.com/entry/2018/01/16/213000
第一回
まずは、各オブジェクトの大きさや配置などの設定。
パドルの操作とボールの制御を行う。
壁
Cube
を使って豆腐を「直方体」にして壁を作るGameObject > 3D Object > Cube
- インスペクタビューの
Transform
を使って位置や大きさの調整- Position, Rotation, Scales
カメラ
- シーンビューのカメラの向きを変更する
- シーンビューのカメラだけだとゲームビューは変わらない
Cube
と同じようにTransform
する
自機
- 壁と同じく
Cube
を使って自機となる「直方体」を作成&配置
パドルを操作できるようにする
C# Script
を追加するAssets > Create > C# Script
public class PaddleController : MonoBehaviour { public float accel = 1000; private void Update() { var force = transform.right * Input.GetAxisRaw("Horizontal") * accel; GetComponent<Rigidbody>().AddForce(force, ForceMode.Impulse); } } // Input.GetAxisRaw("Horizontal") により、 // 水平方向 (Horizontal) のユーザー入力を -1 ~ 1 の正規化された範囲で取得している // ユーザー入力はキーボードでもジョイスティックでも OK // ForceMode.Impulse は質量を考慮して動作に反映される
C# Script
をドラッグ&ドロップでPaddle
に設定するAdd Component
した状態と同じになる。
パドルに物理特性を追加する
- インスペクタビューから
Add Component
を押下してRigidbody
を追加するボール(Sphere)
にRegidbody
という機能を追加した感じ
Regidbody
のパラメータを設定する
ボール
- ボールも同じノリで
Sphere
を選択して作成&配置GameObject > 3D Object > Sphere
ボールに物理特性を追加する
- インスペクタビューから
Add Component
を押下してRigidbody
を追加するボール(Sphere)
にRegidbody
という機能を追加した感じ
Regidbody
のパラメータを設定する
ボールに初速度を与える
C# Script
を追加するAssets > Create > C# Script
- GameObject 起動時に速度を与える
public class BallController : MonoBehaviour { public float speed = 10; private void Start() { var force = (transform.forward + transform.right) * speed; GetComponent<Rigidbody>().AddForce(force, ForceMode.VelocityChange); } } // transform.forward はボールの正面 (Z方向) を示す単位ベクトル // transform.right はボールの右方向 (X方向) を示す単位ベクトル // これらを足して Speed を掛け合わせることで右斜めのベクトルを得ている
C# Script
をドラッグ&ドロップでSphere
に設定するAdd Component
した状態と同じになる
ボールをバウンドさせる
今のままだとボールが跳ね返らない
Physic Material
をボールに設定するAssets > Create > Physic Material
Physic Material
は物理パラメータを管理するもの
第二回
ターゲットとなるブロックを作成する
ブロックの作成と配置
- 壁と同じノリで
Cube
を追加してBlock
という名前にする C# Script
をBlock
に追加する
public class BlockController : MonoBehaviour { private void OnCollisionEnter(Collision collision) { Destroy(gameObject); } } // OnCollisionEnter は、Rigidbody で動作しているオブジェクトが接触したときに呼ばれる処理 // 引数の collision には接触対象オブジェクトが入っている // Destroy メソッドで gameObject、 // つまりコンポーネントを実行したオブジェクトつまり接触したブロックを削除している
Block を複製する
Empty
なゲームオブジェクトを作成してBlocks
という名前にするGameObject > Create Empty
- 今回は、ディレクトリ的(グループ化)な扱いに利用する
Blocks
にBlock
をドラッグ&ドロップするBlock
を選択してCtrl + D
で複製- 複製した
Block
それぞれにX座標を設定する Blocks
には Z座標を設定して全てのBlock
を制御する
Blocks を複製する
- 更に
Blocks
を複製して5行6列なブロック群を作る- 複製した
Blocks
にはそれぞれZ座標を設定する
- 複製した
ゲームオーバーの実装
- 下側の壁に
C# Script
を追加する
public class BottomWallController : MonoBehaviour { private void OnCollisionEnter(Collision collision) { Destroy(collision.gameObject); } } // ブロックの時とは異なり、接触対象の gameObject をデストロイしている // つまり、ボールをデストロイしている
第三回
サウンドを付ける
チュートリアル用の *.unitypackage をインポートする
ダウンロードした sound.unitypackage
には、BGM や SE が格納されているので、
Custom Package
としてインポートする。
SE の実装
C# Script
を追加する
public class HitPlaySound : MonoBehaviour { public AudioClip sound; private void OnCollisionEnter( Collision collision ) { AudioSource.PlayClipAtPoint( sound, transform.position ); } } // AudioClip は音を登録する変数 // AudioSource.PlayClipAtPoint にて音を再生 // 音の発生源は第二引数で指定
SE を設定する
壁
- 壁の
GameObject
を選択して、上記で追加したスクリプトをインスペクタビューのAdd Component
へドラッグ&ドロップ - 先ほどインポートした壁の音となる SE ファイルを
C# Script
のAudio Clip
へドラッグ&ドロップ
ブロック
- ブロック全ての
GameObject
を選択して、同様にスクリプトをインスペクタビューのAdd Component
へドラッグ&ドロップ - 先ほどインポートした壁の音となる SE ファイルを
C# Script
のAudio Clip
へドラッグ&ドロップ
パドル
- 上記に同じ
下側の壁
- 4つの壁のうち下側の壁にはゲームオーバー用の SE を設定する
BGM の設定
Main Camera
に BGM を設定する- 選択状態にして
Add Component
でAudio Source
を追加する Audio Clip
に BGM もドラッグ&ドロップ- 音がデカイ場合は
Volume
で調整
- 選択状態にして
ブロックの色を変更
Material
を作成するAssets > Create > Material
Mterial
のカラーを設定する- 全てのブロックを選択して上記で作成した
Material
をインスペクタビューへドラッグ&ドロップ