さて、相手に撃たれて、HPが0になったらどうしましょう?
ここでは、”誰に倒されたか”を表示し、
5秒のカウントダウンとともに、自動で再スタートを実装したいと思います。
1.ゲームオーバーの実装
1-1.3つのText作成
・他プレイヤーに自分がゲーム―オーバーになったことを示すText(DeadText)
・自分が誰に倒されたかを示すText(KillText)
・リスタートまでのカウントダウンを表示するText(RespawnText)
をそれぞれ作成します。
PlayerPrefabの
WorldCanvasの配下にDeadTextを、
ScreenCanvasの配下にKillTextとRespawnTextを作成します。
Inspectorは次のようにします。
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プレイヤーで打ち合う必要があります。
ゲームオーバーを実装し、勝ち負けをつけられたということで
これでオンラインゲームは完成した!と言ってよいでしょう^^
ただ、このままでは物足りないので、
次の記事では、サウンドつけてみましょう^^

