開ける本の設置
今更ですがこのゲームには操作説明がないので、ガイドブックの様なものを設置したいと思います。とはいってもassetstoreから拝借したものですのでコードの詳細説明は致しません。
何個か試しましたがフリーではこれが一番使いやすかった様な気がします。キャンパスの子としなければならないので別空間に配置してカメラを切り替え表示する必要があるのですが、Inspector>BookPages のElementを増やして画像を配置するのみで本を開くギミックの完成です。
モグラ撃ちゲームの外観
あるサイトで見たのですが、モグラ叩きゲームはゲーム作成初心者の登竜門らしいですね。ちょうど拳銃を手に入れたのでモグラ撃ちゲームとして作ってみたいと思います。
まずは外観ですが大きいセットなので空いている壁全面に配置するようにしましょう。上の黒帯部分はスコアボードにしますので細長のcanvasを設置→子として黒帯imageを設置します。下はProbuilderで三つ丸い穴を開けた長方形のPlaneを配置→誤差の範囲でその後ろに黒のPlaneを配置することで黒丸三つを作ります。この黒丸からランダムにモグラを出現させようと考えてますがそれは次回にします。右上にはスイッチとして切:赤色、入:青色のカプセルを配置し青色はfalseにしておきます。
文字の自動スクロール
スコアボードを電光掲示板風にしたいと思います。まずプレイ中以外は現在のハイスコアを自動スクロールで表示させたいと思います。この様な単純なアニメーションはDOTweenがおすすめです。
インストール後インポートが完了するとウィンドウが表示されますので OpenDOTweenUtilityPanel
>SetupDOTween の選択まで行いましょう。スコアボードimageの子としてハイスコア表示用Textを追加したら準備完了なのでGunGameManagerクラスとして新規スクリプトを作成します。セットの親にアタッチすると良いでしょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;//DOTween使用
public class GunGameManager : MonoBehaviour
{
public GameObject ht;//ハイスコアオブジェクト
public Text highText;//ハイスコアテキスト
void Start()
{
if (PowerBox.flag){ ht.SetActive(true); }//部屋の電源ONでスコアボード有効
RectTransform st = ht.GetComponent<RectTransform>();
st.DOAnchorPos(new Vector3(-20f, 0, 0), 6f)//RectTransform用dotween
.SetEase(Ease.Linear)//一定速度
.SetLoops(-1, LoopType.Restart);//最初の状態に戻ってループ
}
}
usingDOTweenは忘れずに(new Vector3(x, y, z), time)で自由に移動設定できます。textはuiでcanvas=黒帯の範囲に表示されるので見切れ位置から反対側の見切れ位置まで移動するように調整しましょう。ここから .Set で以下のように細かい設定を継ぎ足しました。ちなみに今回はRectTransform用ですがtransform.positionやその他用でも設定可能です。
・SetEase:到達までの挙動(設定なしならEase.OutQuad_初動大でその後緩やか)
・SetLoops:移動の繰り返し設定でRestartやYoyo(行って戻る)などがあり−1でループする
DOTweenとてもわかりやすいですよね。画像やモデルを変化させる場合には向きませんが、移動はもちろん回転・拡大縮小・色の変化まで以外となんでもできるのが利点です。コードはラムダ式というので書くともっとスッキリするらしいのですが、無理に習得する必要は感じませんでした。
スコアボードの完成
モグラ撃ちゲームとの連携は次回にするとして、先にスコアボードを完成させたいと思います。スコアボードimageの子として残り時間表示用とスコア表示用Textを追加後GunGameManagerクラスを更新しましょう。
//GunGameManagerクラス_追加のみ記載
public GameObject blueCapsule;//入状態
public GameObject redCapsule;//切状態
public GameObject ltt;//残り時間オブジェクト
public GameObject st;//スコアオブジェクト
public Text leftTimeText;//残り時間テキスト
public Text ScoreText;//スコアテキスト
float leftTime;//残り時間
public static bool timerStart;//モグラ撃ちゲームプレイ中フラグ
public static int Score;
public static int HighScore;
void Start()
{
leftTime = 31;
Score = 0;
highText.text = "HighScore:" + HighScore.ToString();//シーン切替でも保持
}
void Update()
{
if (timerStart)
{
ht.SetActive(false);
ltt.SetActive(true);
st.SetActive(true);
leftTime -= Time.deltaTime;//1秒に1秒ずつ減らしていく
leftTimeText.text = "LT:" + leftTime.ToString();//残り時間テキスト更新
ScoreText.text = "SC:" + Score.ToString();//スコアテキスト更新
if(Score > HighScore)
{
HighScore = Score;
highText.text = "HighScore:" + HighScore.ToString();
}
if (leftTime <= 0)//タイム切れ処理
{
timerStart = !timerStart;//フラグ反転
blueCapsule.SetActive(false);
redCapsule.SetActive(true);
ht.SetActive(true);
ltt.SetActive(false);
st.SetActive(false);
leftTime = 31;
Score = 0;
if (!timerStart){ return;//Updateから離脱 }
}
}
}
プレイ中はハイスコア表示をオフにして代わりに制限時間とリアルタイムのスコアを表示しています。
UpdateメソッドではTime.deltaTimeを用いて秒間をカウントする事ができます。制限時間は31秒としてますが表示されると同時に1秒マイナスされるのでプレイヤー側は30秒に感じ、0秒になると同時にプレイ中から離脱。このfloat型の秒数をタイマーとしてスコアボードに表示させる為にToString()を用いて型変換しました。
又加点される度にスコア表示を更新するようにしています。プレイ中からの離脱でリセットされるのですが、ハイスコア>スコアならハイスコアを更新して記録も保存可能です。
コメント