前回作りかけのモグラ撃ちゲームを完成させたいと思います。
ターゲットを配置
まだ未配置のターゲットは2種類でモグラとラッコを準備しました。これらはSpriteRendererとしてBoxColiter(タグ付き)をつけた上で、長方形Planeと黒のPlaneの中間に挟まる空間に黒丸から少し下の位置に置きましょう。上に移動させると黒丸からひょっこり顔を出すようになります。
プレイ状態への切り替え
切:赤色、入:青色のカプセルは判別用になりますが、これ自体を切り替えスイッチにしたいと思います。赤色カプセルに以下新規スクリプトを設定しましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class redCapsule : MonoBehaviour
{
public GameObject blueCapsule;
void OnCollisionEnter(Collision col)//OnClickと異なりEventTrigger要らず
{
if (col.gameObject.tag == "Bullets")//弾に接触
{
blueCapsule.SetActive(true);
gameObject.SetActive(false);
GunGameManager.timerStart = true;
}
}
}
拳銃から発射された弾を赤色カプセルに当てたらそのままプレイ状態に突入です。
ターゲットをランダム移動
今回もDOTweenを活用してゆきます。GunGameManagerクラスを以下の通り更新します。
//GunGameManagerクラス_追加のみ記載
float RoutineTime;//ターゲット出現間隔
float vecXM;//モグラx座標用
float vecXR;//モグラx座標用
public GameObject Mogura;
public GameObject Rakko;
bool moguraup;
bool rakkoup;
void Start()
{
RoutineTime = 2;
}
void Update()
{
RoutineTime -= Time.deltaTime;//1秒に1秒ずつ減らしていく
if (RoutineTime <= 0)//ターゲット操作
{
if (!moguraup && !rakkoup)
{
moguraup = true;
rakkoup = true;
vecXM = Mathf.Floor(Random.Range(-1.0f, 1.5f));//-1から1でランダム_小数切捨
Mogura.transform.position = new Vector3(vecXM * 4.0f, 3.0f, 9.8f);
vecXR = Mathf.Floor(Random.Range(-1.0f, 1.5f));//-1から1でランダム_小数切捨
Rakko.transform.position = new Vector3(vecXR * 4.0f, 3.0f, 9.8f);
StartCoroutine("moguraUp");
StartCoroutine("rakkoUp");
RoutineTime = 2.0f;
}
}
}
IEnumerator moguraUp()
{
Mogura.transform.DOMoveY(5.0f, 0.5f);
yield return new WaitForSeconds(1.0f);
Mogura.transform.DOMoveY(3.0f, 0.5f);
moguraup = false;
}
IEnumerator rakkoUp()
{
if(vecXM != vecXR)//モグラとラッコが重なったらモグラ優先
{
Rakko.transform.DOMoveY(5.0f, 0.5f);
yield return new WaitForSeconds(1.0f);
Rakko.transform.DOMoveY(3.0f, 0.5f);
}
rakkoup = false;
}
2秒間隔でプレイ中は31秒なので、単純計算で1プレイにつき15回モグラとラッコそれぞれが姿を表します。Random.Range(最小, 最大)でランダム選択した値を横(X)移動に割り当てているのですが、黒丸があるx座標は−4or0or4の3箇所になるので小数点切り捨てで-1or0or1_その値を4の倍数に換算する処理を行なっています。上下移動はコルーチンでそれぞれ行なっているのですが2つのx座標ランダムが重なる可能性もあるのでその場合モグラの方を優先しています。コルーチンとTime.deltaTimeの時間概念のズレを考慮して移動中フラグを立てているのですが、もしかしたら必要ないかもしれませんね。
衝突検知で加点
せっかく的に当たっても加点されないと意味ないので銃弾Prefabに以下新規スクリプトを設定しましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletAttack : MonoBehaviour
{
void OnCollisionEnter(Collision col)
{
if (col.gameObject.tag == "Mogura"){ GunGameManager.Score += 5; }
if (col.gameObject.tag == "Rakko"){ GunGameManager.Score += 10; }
}
}
モグラよりもラッコの方が加点を多くしました。以下前回からの通しデモ。
落とし球ゲームの様に衝突マテリアルはつけてないですが特に違和感はなかったように思います。
コメント