はじめに
初めまして。ゲーム作りに挑戦したくなり、Unityを頑張ってみようと思いました。
しばらく前にチュートリアルを作ったきり放置されていたUnityを起動。
投稿のテストも兼ねて、作成中に調べたこと等のメモを残そうと思います。
基本操作的なところは割愛します。
作ったもの
自分で作るのは初めてなので、めちゃくちゃシンプルなものにしました。
ゲーム作り入門の定番のイメージがあるシューティングです。
……びっくりするくらいシンプルです。
キャラと弾の画像はペイントの図形で、縦幅が短く感じたので矢印をつぶして無理やり距離を稼いでいます。
主な仕様は以下の通りです。
- 左右のキー押下でレーン移動
- スペースキー押下で弾発射
- 一定時間ごとに4レーンのうちランダムで敵機出現
- 弾が敵機に当たると消滅
以下は、作成時に調べたことのメモです。
キー押下
自機移動や弾発射のためにキー押下の判定をしました。
if (Input.GetKeyDown(KeyCode.RightArrow))
{
// キー押下時処理
}
Update内でinputクラスのGetKeyDown
を呼ぶことでキー押下を判定します。
引数のKeyCodeで判定するキーを指定します。
また、GetKey
で押している間、GetKeyUp
でキーを離したときを判定できます。
一定時間ごとに処理
一定時間ごとに敵機を出現させるために時間処理を作成しました。
いろいろ調べたので、今回使った方法をメモ。
public float interval; // 一定間隔
private float delta; // 経過時間
void Update()
{
delta += Time.deltaTime;
if (delta >= interval)
{
// 敵機出現処理
// 経過時間リセット
delta = 0;
}
}
Time.deltaTime
は前フレームからの経過時間らしいです。(もう少し調べます……)
なので、Updateが呼ばれるたびに時間を加算していって、指定した時間分経過したら処理実行という流れです。
プレハブから生成
敵機出現処理のために、プレハブから敵機を生成したら良いと思い調べました。
GameObject prefab = Resources.Load("Prefabs/" + name) as GameObject;
Instantiate(prefab, pos, Quaternion.identity);
上記の1行目のコードでプレハブのオブジェクトを取得できます。
Resources.Load
でResourceフォルダ内のアセットを取得。
その際のフォルダ構成に注意。
……メンバ変数にGameObjectを用意してInspectorからできそうだったけどどっちがいいんでしょう。
2行目のコードでオブジェクトを生成。
Instantiate((生成するオブジェクト), (位置), (回転))
となっています。
Quaternion.identity
はプレハブの回転そのままに生成ということらしいです。(Quaternionがまだ理解できていません)
衝突判定
敵機と弾の衝突判定を敵機オブジェクト内に作成しました。
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Shot"))
{
// 衝突処理
}
}
OnTriggerEnter2D
メソッドで衝突を判定。引数のCollider2Dオブジェクトが、衝突した相手のオブジェクトになっています。
衝突した相手を識別するために弾オブジェクトに"Shot"タグを設定し、判定しています。
この関数を使うために注意することは、RigidBody 2D
とCollider 2D
を衝突するお互いのオブジェクトにアタッチする必要があります。
画面の座標を取得
画面外に出た弾や敵機を消滅させようと画面端の座標を取得しようと思いました。
Camera.main.ViewportToWorldPoint(Vector3.zero)
上記のコードで左下の座標を取得できるようです。
Vector3.zero
の代わりにVector3.one
を渡すと右上の座標を取得できます。
さいごに
これからもぼちぼち作っていきたいと思います。
まずは今回作ったものに得点、ライフ、タイトルとかを付けたいと思います。
その際は、また投稿するかもしれません。