こういうやつ。
前回はこんな感じ。

あたカラアセットのインストール
こちらからあたカラアセットをダウンロードしてUnity プロジェクトにインストールしてください。
あたカラアセットのインストール方法が分からない方は下記を確認してください。


※もし、前回と同じプロジェクトで進める場合、更新マークがでるかと思いますが、ここは何も考えずImportボタンを押してください。
BoardGameシーンを開く
ProjectタブでAssets>Atakara>BoardGameに移動して、BoardGameシーンを開きます。

インストールが完了すると「Atakara」フォルダが作成されます。
これをダブルクリック。

「BoardGame」フォルダをダブルクリック。

「BoardGame」をダブルクリック。
何も考えずに起動する
何も考えずに再生ボタンを押してください。

ステージのタイルにカーソルを合わせると色が変わることを確認できればOKです。

遊んでみる

例によって今回も色設定で遊べます。
タイル選択の色を水色にしているので、これを変えて遊んでみましょう。

今回はオレンジ色にしてみました。
(ライディングの関係で黄色っぽいな…)
一歩踏み込んで
今回ももっと知りたい方がいるかもしれないのでスクリプトの解説をしていきます。
Tileクラス
新たにTileコンポーネントをを追加しました。
これをステージ上のマスとなるプレハブ(Tileオブジェクト)にアタッチしました。
こうすることで、ステージ生成と同時にTileコンポーネント付きのオブジェクトが生成されてくれます。

using UnityEngine;
public class Tile : MonoBehaviour
{
public Vector2Int Position; // タイルの位置
[SerializeField]
private Renderer _tileRenderer;
[SerializeField]
private Color _originalColor; // 元の色を保存
void Start()
{
_tileRenderer = GetComponent<Renderer>();
_originalColor = _tileRenderer.material.color; // 元の色を保存
}
public void ChangeColor(Color newColor)
{
_tileRenderer.material.color = newColor;
}
public void ResetColor()
{
_tileRenderer.material.color = _originalColor;
}
}
Tileクラスの中身はこんな感じです。
_tileRenderer = GetComponent<Renderer>();
Startの中でRenderクラスを保持しています。
こうすることで、後のChangeColor、ResetColorメソッドでTileの色にアクセスして変更を加えることができます。
_originalColor = _tileRenderer.material.color; // 元の色を保存
また、元の色を保持することでTileの色に変更を加えた後も戻せるようにしています。
今回は情報量を少なくしていますが、Tileクラスの追加には他にもメリットがあります。
例えば、今後毒沼のマスや氷のマスを実装する際に、毒ダメージの情報や移動量の情報を保持して使用することができます。
これらの情報を後述するTileControllerで取得して、実際のゲームに反映することができます。
TileController
TileControllerクラスの中身はこんな感じです。
using UnityEngine;
public class TileController : MonoBehaviour
{
[SerializeField]
public Color highlightedTileColor = Color.red; // ハイライトされたタイルの色
private Tile currentTile;
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
Tile hitTile = hit.collider.GetComponent<Tile>();
if (hitTile != null && currentTile != hitTile)
{
// 前のタイルの色をリセット
if (currentTile != null)
{
currentTile.ResetColor();
}
// 新しいタイルの色を変更
currentTile = hitTile;
currentTile.ChangeColor(highlightedTileColor);
}
}
else if (currentTile != null) // RayCastがタイルから外れた場合
{
// タイルの色をリセット
currentTile.ResetColor();
currentTile = null;
}
}
}
RayCastとは?
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
このあたりですね。
ここで何をやっているのかというとカメラから光線(Ray)を飛ばして当たった物体の情報を取得しています。
図で描くとだいたいこんな感じです。

①②がCamera.main.ScreenPointToRay(Input.mousePosition)に相当する処理です。
言語化するなら「画面上のマウスの位置に向かってカメラから光線を飛ばす」と言ったところでしょうか。
③④でPhysics.Raycast(ray, out hit)に相当する処理を行っていて、hitには光線が当たったゲームオブジェクトの情報が入っています。(out はパラメーター修飾子というのですが今はそんなに考えなくてもよいです。なるものはなる。)
カメラから光線を飛ばしてゲームオブジェクトを取得するこの辺りは処理はUnityにおいてほぼ定型文と考えていいです。こういう時はこうするんだ程度に覚えておけば問題ないです。
残りの処理について
RayCastの概念さえ理解できれば、あとはそれほど難しくないです。
if (Physics.Raycast(ray, out hit))
{
Tile hitTile = hit.collider.GetComponent<Tile>();
if (hitTile != null && currentTile != hitTile)
{
// 前のタイルの色をリセット
if (currentTile != null)
{
currentTile.ResetColor();
}
// 新しいタイルの色を変更
currentTile = hitTile;
currentTile.ChangeColor(highlightedTileColor);
}
}
else if (currentTile != null) // RayCastがタイルから外れた場合
{
// タイルの色をリセット
currentTile.ResetColor();
currentTile = null;
}
hit.collider.GetComponent()で、RayCastで取得したTileクラスを取得します。
タイルの中身がnullでなければ、タイルの色を変更してます。
この時、currentTileを保持するようにしていますが、これは次に指定したタイルがcurrentTileではない場合、
つまり、タイルの選択が解除されたことを判定するために行っています。
プログラミングって泥臭いんですよ。ほんと。
次回は、駒を置いてなんかやる感じでいきたいと思います。
コメント