【Unity】スイカ風マージパズルゲームの作り方 その3 ~ くっついて進化・消す処理を作る ~【2024年最新】
Unityを使ってスイカ風のマージパズルゲームを作成する方法を解説します。
前回までの記事はこちらです。
【Unity】スイカ風マージパズルゲームの作り方 その1【2024年最新】 - なぎなぎブログ
【Unity】スイカ風マージパズルゲームの作り方 その2 ~ スポナーを作る ~【2024年最新】 - なぎなぎブログ
今回は、駒(ボール)をくっついたときに進化・消す処理を作っていきます。
目次
くっついた(マージした)ときに駒(ボール)消す処理の作成
駒がくっついたときに進化・消す処理を作成します。
駒がくっついたときに進化する条件は下記の通りです。
- 同じ種類の駒がぶつかったとき
- 駒が進化可能なとき
駒がくっついたときに消す条件は下記の通りです。
- 同じ種類の駒がぶつかったとき
- 駒が進化できないとき
駒が進化できないときというのは、最大まで進化して次の進化がないときです。
つまり今回の将棋をモチーフにしたゲームの場合は、王将と王将がぶつかったときに消えるということです。
駒のスクリプトの修正
先程の条件で、駒を進化または消す処理をスクリプトに記述していきます。
Assets/Scripts/Koma.cs を修正します。
using UnityEngine;
public class Koma : MonoBehaviour
{
// 駒の種類
public int Type { get; set; }
// マージ済みフラグ
public bool IsMerge { get; set; }
// 進化可能かどうか
public bool CanPromote { get; set; }
// 衝突したときの処理
private void OnCollisionEnter2D(Collision2D other)
{
// 衝突先が駒でない場合は処理を行わない
var otherKoma = other.gameObject.GetComponent<Koma>();
if (!otherKoma)
{
return;
}
// マージ済みの場合は処理を行わない
if (IsMerge || otherKoma.IsMerge)
{
return;
}
// 同じタイプの駒出ない場合は処理を行わない
if (Type != otherKoma.Type)
{
return;
}
// 衝突元と衝突先で複数回マージ処理が動かないように、マージ済みフラグを立てる
IsMerge = true;
otherKoma.IsMerge = true;
// 2つの駒の中間地点を取得
var position = Vector2.Lerp(transform.position, other.transform.position, 0.5f);
// 進化先があれば新しい駒を生成
if (CanPromote)
{
// 2つの駒の中間地点に新しい駒を生成
KomaFactory.Instance.CreateKoma(position, Type + 1);
}
// 衝突した駒を削除
Destroy(gameObject);
Destroy(other.gameObject);
}
}
ソースコードにコメントを書いているので、処理の流れはわかると思います。
1点分かりづらそうな部分の補足として、Vector2.Lerp というメソッドを使って、2つのオブジェクトの中間地点を取得しています。
public static Vector2 Lerp(Vector2 a, Vector2 b, float t);
と宣言されていて、
Vector2.Lerpは、ベクトルaとベクトルbの間のtで線形に補間します。
tが0のときはa、tが1のときはb、tが0.5のときはaとbの中間地点を返します。
今回は中点を取得するため、tを0.5にしています。
スクリプトを修正後はの動作は次のような動画のようになります。
まとめ
今回は、駒がくっついたときに進化・消す処理を作成しました。
ゲームのコア部分の動きとしてはほとんど完成しているように思いますね。
次回は、スコアの保持や、ゲームオーバーの処理を作成してきます。