Unity

【Unity】オンラインFPSゲームの作り方#7【ゲームオーバー&リスタートの実装】

本記事内には、アフィリエイトリンクを含む場合があります

さて、相手に撃たれて、HPが0になったらどうしましょう?

ここでは、”誰に倒されたか”を表示し、
5秒のカウントダウンとともに、自動で再スタートを実装したいと思います。

1.ゲームオーバーの実装

1-1.3つのText作成

・他プレイヤーに自分がゲーム―オーバーになったことを示すText(DeadText)
・自分が誰に倒されたかを示すText(KillText)
・リスタートまでのカウントダウンを表示するText(RespawnText)
をそれぞれ作成します。

PlayerPrefabの
WorldCanvasの配下にDeadTextを、
ScreenCanvasの配下にKillTextRespawnTextを作成します。

Inspectorは次のようにします。

DeadText
PosY:-0.2
Scale:XYを0.02
Text:DEAD
Font Size:20
Color:赤

KillText
PosY:300
Text: (空白にする)
Font Size:60
Alignment:中央
Horizontal Overflow,Vertical Overflow:Overflow
Color:赤

RespawnTextは、PosYを150として他は同じ

 

1-2.Textの制御(TakingDamage.csの追記)

後は、TakingDamage.csに追記するだけです!^^

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;

public class TakingDamage : MonoBehaviourPunCallbacks
{
    [SerializeField] Image hpBar; 
    [SerializeField] GameObject deadText; //Inspectorから紐づけ
    [SerializeField] Text killText; //Inspectorから紐づけ
    [SerializeField] Text respawnText; //Inspectorから紐づけ

    private float hp;
    public float startHp = 100;

    // Start is called before the first frame update
    void Start()
    {
        hp = startHp;
        hpBar.fillAmount = hp / startHp;
    }

    [PunRPC]
    public void TakeDamage(float _damage, PhotonMessageInfo info) //Photonのもつinfoも渡す
    {
        hp -= _damage;
        hpBar.fillAmount = hp / startHp;

        if(hp <= 0f)
        {
            deadText.SetActive (true);
            Die();
            if(photonView.IsMine)
            {
                killText.GetComponent<Text>().text = "You were killed by " + info.Sender.NickName; //自分の画面にやられたことを表示
            }
        }
    }

    void Die()
    {
        if(photonView.IsMine)
        {            
            StartCoroutine(Respawn()); 
        }
    }

    IEnumerator Respawn()
    {
        float respawnTime = 5.0f;  
        while(respawnTime > 0F) //0になるまで繰り返す
        {
           yield return new WaitForSeconds(1f);
           respawnTime -= 1.0f;
           transform.GetComponent<MovementController>().enabled = false; //動けない状態
           transform.GetComponent<Shoot>().enabled = false; //撃てない状態
           respawnText.GetComponent<Text>().text = "Respawning at: " + respawnTime.ToString();
        }
        killText.GetComponent<Text>().text ="";
        respawnText.GetComponent<Text>().text ="";
        int randomPoint = Random.Range(-20,20);
        transform.position = new Vector3(randomPoint, 0, randomPoint); //ランダムな場所へ移動
        transform.GetComponent<MovementController>().enabled = true; //動ける状態
        transform.GetComponent<Shoot>().enabled = true; //撃てる状態
        photonView.RPC("RegainHP", RpcTarget.AllBuffered); //RPCでメソッドを呼ぶ
    }

    [PunRPC]
    public void RegainHP()
    {
        hp = startHp; //回復
        hpBar.fillAmount = hp / startHp; //HPBarに反映
        deadText.SetActive (false); //死亡非表示
    }
}

Inspectorより、TakingDamageの3つの項目に、
作成していたTextオブジェクトを紐づけて、PlayerPrefabを保存します。

シーンからPlayerPrefabを削除して、LauncherSceneからゲームを実行して動作に問題ないか確認しましょう。
Hpの増減、Respawnなど確認する場合は、
相手が必要なので「Build&Run」して、2プレイヤーで打ち合う必要があります。

ゲームオーバーを実装し、勝ち負けをつけられたということで
これでオンラインゲームは完成した!と言ってよいでしょう^^

ただ、このままでは物足りないので、
次の記事では、サウンドつけてみましょう^^

【Unity】オンラインFPSゲームの作り方#8【サウンドの実装】ゲームには、サウンドがとても重要です。 シューティングゲームなら、 銃声が加わると、緊張感と爽快感を味わえるようになります。 ...
ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA