設置台を作る
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 5/18。
プレイヤーは、道の脇にある灰色の四角形、BuildPadをクリックしてタワーを建てます。クリックは画面上のピクセル単位で発生しますが、BuildPadは3Dワールドにあるため、クリックはレイに変換されます。Camera.main.ScreenPointToRay(point)は、カメラから始まり、画面上のその点を通ってシーン内へ進むレイを返し、Physics.Raycastはそのレイをたどって、最初に当たったコライダー、つまりプレイヤーがマウスの下に見ているものを報告します。クリックしたブロックに色を塗るペイントツールです。
void Update()
{
if (!Mouse.current.leftButton.wasPressedThisFrame)
{
return;
}
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.TryGetComponent(out Paintable block))
{
block.Paint(brushColor);
}
}&&の後半はレイが何かに当たった場合にだけ実行されるため、hitには値が設定されています。続いてTryGetComponentは、当たったものが対象かどうかを調べます。レイは地面や道、木にも当たりますが、これらにはPaintableが付いていないため、クリックしても何も起こりません。
ここで扱うすべてのシーンはUnity 6のInput Systemのみを使うため、Mouse.currentでマウスを読み取ります。その位置は画面上のピクセル単位であり、ScreenPointToRayが必要とする形式です。
チャレンジ
中級パッドにはBuildPadスクリプトがあり、GameオブジェクトにはtowerPrefabがArrowTowerプレハブであるBuildManagerがあります。
BuildPad.csに、型がTowerのパブリックフィールドtowerを追加します。このパッドに建てられたタワーを保持し、タワーがない場合はnullになります。BuildManagerに、シリアライズされたプライベートフィールドtowerPrefab(Tower型)を追加します。Updateでは、このフレームにマウスの左ボタンが押されたとき、カメラからマウスを通るレイを飛ばします。- レイがBuildPadを持つコライダーに当たり、そのパッドにまだタワーがない場合は、パッドの位置に
towerPrefabをインスタンス化し、新しいタワーをパッドのtowerに格納します。タワーがあるパッドや、パッド以外のものには何も起こりません。
Playを押していくつかのパッドをクリックし、それからCheckを押します。
自分で試してみよう
using UnityEngine;
// 後で実装:建設パッドをクリックしてタワーを配置する機能、ショップ、タワーパネル。
public class BuildManager : MonoBehaviour
{
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。