みそ味です。初めてのゲーム制作5日目です。
最近、教授に怒られてでも残りの貴重な学生期間は研究よりやりたいことを優先すべきなのではと思っております。
4日目の記事は下記から↓
本日実装したことはゲーム開始前に「3・2・1・START」と表示させることです。
………ええ。これだけです。
これだけでもかなり大変でした。
テキストの用意
こちらの画像を用意しました。ゲームロゴ同様MediBang Paintで作成しました。
これらを順に表示させていきます。
コードの作成
以下のコードを書きました。とりあえず文章の量を見てほしいです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StartText_TextPosition : MonoBehaviour
{
[Header("テキスト表示する時間")] public float TimetoDisplay;
[Header("テキストが拡大する時間")] public float Timebyex;
[Header("dontlookを表示する時間")] public float TimetoDisplayDonotlook;
[Header("dontlookをフェードする時間")] public float TimetoFade;
[Header("テキストサイズ倍率(dotlook)")] public float Sizedontlook = 1.0f;
[Header("テキストサイズ倍率")] public float Sizetext = 1.0f;
[Header("startを表示する時間の追加分")] public float StartExtratime;
[Header("3")] public GameObject Text3;
[Header("2")] public GameObject Text2;
[Header("1")] public GameObject Text1;
[Header("キーボード見ないで")] public GameObject TextDonotlook;
[Header("start")] public GameObject TextStart;
[Header("dontlookを下す位置")] public GameObject HeightDonotlook;
[Header("フェード")] public Fade_SpriteMask fade;
private Transform tf;
private SpriteRenderer DontlookSp;
private Color fullcolor = new Color(1, 1, 1, 1);
private int CowntdownIndex = 1;
private float time = 0.0f;
private float tempX;
private float tempY;
private bool compStart = false;
private bool firsttime = true;
void Start()
{
TextDisplaySet();
}
void Update()
{
if(fade.IsFadeInComplete() && !compStart)
{
StartDisplay();
}
}
///<summary>
///最初の設定
/// </summary>
public void TextDisplaySet()
{
compStart = false;
firsttime = true;
tf = transform;
DontlookSp = TextDonotlook.GetComponent<SpriteRenderer>();
Text1.transform.position = new Vector3(10.0f, 0.0f, 50f);
Text2.transform.position = new Vector3(10.0f, 0.0f, 50f);
Text3.transform.position = new Vector3(10.0f, 0.0f, 50f);
TextDonotlook.transform.position = HeightDonotlook.transform.position;
TextStart.transform.position = new Vector3(10.0f, 0.0f, 1.0f);
Text1.transform.localScale = new Vector3(0.0f, 0.0f, 1.0f);
Text2.transform.localScale = new Vector3(0.0f, 0.0f, 1.0f);
Text3.transform.localScale = new Vector3(0.0f, 0.0f, 1.0f);
TextDonotlook.transform.localScale = new Vector3(Sizedontlook, Sizedontlook, Sizedontlook);
TextStart.transform.localScale = new Vector3(0.0f, 0.0f, 0.0f);
DontlookSp.color = new Color(1, 1, 1, 0);
CowntdownIndex = 1;
}
///<summary>
///staetテキストの表示を終えたか
/// </summary>
public bool IsStartComplete()
{
return compStart;
}
///<summary>
///startテキストの表示の管理
/// </summary>
private void StartDisplay()
{
if(CowntdownIndex == 1)
{
DonotlookDisplay();
}
else if (CowntdownIndex== 2)
{
Number3Display();
}
else if (CowntdownIndex == 3)
{
Number2Display();
}
else if (CowntdownIndex == 4)
{
Number1Display();
}
else
{
StartTextDisplay();
}
}
///<summary>
///donotlookの表示
/// </summary>
private void DonotlookDisplay()
{
if(Vector2.Distance(TextDonotlook.transform.position, tf.position) > 0.01f)
{
tempX = TextDonotlook.transform.position.x + ( tf.position.x - TextDonotlook.transform.position.x)*Time.deltaTime/TimetoFade;
tempY = TextDonotlook.transform.position.y + ( tf.position.y - HeightDonotlook.transform.position.y)*Time.deltaTime/TimetoFade;
TextDonotlook.transform.position = new Vector3(tempX, tempY,50f);
DontlookSp.color = new Color(1, 1, 1, time/ TimetoFade);
}
time += Time.deltaTime;
if(time > TimetoDisplayDonotlook)
{
CowntdownIndex = 2;
time = 0.0f;
TextDonotlook.transform.position = new Vector3(10.0f, 0.0f, 0.0f);
}
}
///<summary>
///3の表示
/// </summary>
private void Number3Display()
{
if(firsttime)
{
Text3.transform.position = tf.position;
firsttime = false;
}
if(time < Timebyex)
{
Text3.transform.localScale = new Vector3(Sizetext*time/Timebyex, Sizetext*time/Timebyex, 1.0f);
}
time += Time.deltaTime;
if(time > TimetoDisplay)
{
CowntdownIndex = 3;
time = 0.0f;
Text3.transform.position = new Vector3(10.0f, 0.0f, 0.0f);
firsttime = true;
}
}
///<summary>
///2の表示
/// </summary>
private void Number2Display()
{
if (firsttime)
{
Text2.transform.position = tf.position;
firsttime = false;
}
if (time < Timebyex)
{
Text2.transform.localScale = new Vector3(Sizetext*time/Timebyex, Sizetext*time/Timebyex, 1.0f);
}
time += Time.deltaTime;
if (time > TimetoDisplay)
{
CowntdownIndex = 4;
time = 0.0f;
Text2.transform.position = new Vector3(10.0f, 0.0f, 0.0f);
firsttime = true;
}
}
///<summary>
///1の表示
/// </summary>
private void Number1Display()
{
if (firsttime)
{
Text1.transform.position = tf.position;
firsttime = false;
}
if (time < Timebyex)
{
Text1.transform.localScale = new Vector3(Sizetext*time/Timebyex, Sizetext*time/Timebyex, 1.0f);
}
time += Time.deltaTime;
if (time > TimetoDisplay)
{
CowntdownIndex = 5;
time = 0.0f;
Text1.transform.position = new Vector3(10.0f, 0.0f, 0.0f);
firsttime = true;
}
}
///<summary>
///startの表示
/// </summary>
private void StartTextDisplay()
{
if (firsttime)
{
TextStart.transform.position = tf.position;
firsttime = false;
}
if (time < Timebyex)
{
TextStart.transform.localScale = new Vector3(Sizetext*time/Timebyex, Sizetext*time/Timebyex, 1.0f);
}
time += Time.deltaTime;
if (time > TimetoDisplay + StartExtratime)
{
time = 0.0f;
TextStart.transform.position = new Vector3(10.0f, 0.0f, 0.0f);
firsttime = true;
compStart = true;
}
}
}
もちろんプログラミング初心者なのでかなり非効率なコードを書いてしまっているのでしょう。
(特に3,2,1の表示を1つにまとめられそうな気がします)
今思えば、3,2,1のテキストの座標をいちいち移動する必要はなかったですね。
ですが、カウントダウンを、するだけで、このコードの量は、人間を舐めているとしか思えません。
長々と書いていますが、難しいことは何もしてないです。
最後に各種パラメーターをインスペクターから指定してやれば実装完了です。
完成したカウントダウン
ページを移行したら自動で始まります。
今回行ったことは以上です。
次こそはメインのタイピングゲーム部分に着手しようと思います。
コメント