Unityでカーリングゲームを作る #7 勝敗を表示して次のシーンまでカウントダウンする

投稿者: | 2019-12-28



勝敗をテキスト表示して、次のシーンを読み込むまでカウントダウンしてみます。

8個目のストーンが投げられた後、そのストーンの速度が0になるとスコアを計算するためのコライダーとスクリプトが付いたオブジェクトがアクティブになります。

if (StoneScript.num == 8 && StoneScript.gameState == 3)//Input.GetKeyDown(KeyCode.Space)
{
    StoneScript.gameState = 4;
    house.SetActive(!house.activeSelf);

}

アクティブになるとコライダーの中にあるストーンを調べて、中心からの距離が近い順にソートし、スコアを計算します。それと同時にカウントダウンも始まります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
using UnityEngine.SceneManagement;


public class HouseScript : MonoBehaviour
{
    bool secondLap;
    List<int> stoneNumbers;
    Dictionary<GameObject, float> stonesInHouse;
    public Transform center;
    bool winner;
    int score;


    public Text scoreText;
    public Text restartText;

    // Start is called before the first frame update
    void Start()
    {

        secondLap = false;
        score = 0;

        stoneNumbers = new List<int>();
        stonesInHouse = new Dictionary<GameObject, float>();

        scoreText.text = "Draw";

        StartCoroutine("CountDown");
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void OnTriggerStay(Collider other)
    {
        
        // ストーンの番号が一巡していないとき
        if (!secondLap && other.CompareTag("Stone"))
        {
            // ストーンの番号がリストにあるとき
            if (stoneNumbers.Count != 0 && stoneNumbers.Contains(other.gameObject.GetComponent<StoneScript>().stoneNumber))
            {
                secondLap = true;
                Score();
            }
            else
            {// ストーンの番号がリストに無いとき
                Debug.Log(other.gameObject.GetComponent<StoneScript>().stoneNumber);
                stoneNumbers.Add(other.gameObject.GetComponent<StoneScript>().stoneNumber); // 番号をリストに追加する
                stonesInHouse.Add(other.gameObject, Vector3.Distance(other.gameObject.transform.position, center.position)); // オブジェクトと中心までの距離をディクショナリーに追加する
            }

        }

    }

    void Score()
    {
        
        var stoneDic = stonesInHouse.OrderBy((x) => x.Value); // ディクショナリーの値をソートする
        int n = 0;
        foreach (KeyValuePair<GameObject, float> stone in stoneDic)
        {
            StoneScript sc_stone = stone.Key.GetComponent<StoneScript>();

            //Debug.Log(stone.Key.transform.position.ToString() + " " + stone.Value.ToString() + " " + stone.Key.GetComponent<StoneScript>().stoneNumber);


            if (n == 0)
            {
                winner = sc_stone.player; // 中心に一番近いストーンの手番を勝者にする
                score++; // スコアに1を足す
            }
            else if (sc_stone.player == winner)
            {

                score++; // 続くストーンの手番が勝者と同じであればスコアに1追加
            }
            else if (sc_stone.player != winner)
            {
                break; // 勝者と同じでなければスコアの計算を終える
            }

            n++;

        }

        Debug.Log("winner:" + winner + " score:" + score);

        if (winner)
        {
            scoreText.text = "YOU WIN\nscore:" + score;
        }
        else {

            scoreText.text = "YOU LOSE\nscore:" + -score;
        }
    }

    private IEnumerator CountDown()
    {
        yield return new WaitForSeconds(0.4f);
        int second = 5;

        while (second > 0)
        {

            restartText.text = second+"秒後に再読み込みします";

            yield return new WaitForSeconds(1.0f);
            second--;
        }

        SceneManager.LoadScene("curling");
    }

}

OnTriggerStayでストーンがあるか調べます。ストーンが無いときはDrawと表示したいですが、ストーンが無いとOnTriggerStayの処理が実行されません。
なので、スタート時にDrawと表示して、ストーンがある場合は、勝敗の表示に差し替えるようにしました。

カウントダウンにはコルーチンを使います。

private IEnumerator CountDown()
{
    yield return new WaitForSeconds(0.4f);
    int second = 5;

    while (second > 0)
    {

        restartText.text = second+"秒後に再読み込みします";

        yield return new WaitForSeconds(1.0f);
        second--;
    }

    SceneManager.LoadScene("curling");
}

while文の繰り返し処理を1秒おきにやります。それが終わるとシーンを再読み込みします。

コメントを残す

メールアドレスが公開されることはありません。