//tips
//photonプレイヤー生成でのスポーン地点の指定
ロビーシーンからの遷移後のスポーン位置調整は現在SampleSceneスクリプトで実行している。
private void Start()
{
// PhotonServerSettingsに設定した内容を使ってマスターサーバーへ接続する
PhotonNetwork.ConnectUsingSettings();
// マッチング後、ランダムな位置に自分自身のネットワークオブジェクトを生成する
var v = new Vector3(Random.Range(-3f, 3f), 0.5f,Random.Range(1f, 2f));
GameObject Prefab = PhotonNetwork.Instantiate("GamePlayer1", v, Quaternion.identity);
}
PhotonNetwork.ConnectUsingSettings();までをStartメソッドで実行させ、場所の設定とInstantiateはphotoncountを参照させながらできないか考える。
まずはInstantiateコードそのものをphotoncountの方へ移動させた。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class photonCount : MonoBehaviourPunCallbacks
{
[SerializeField]
NumberProp numberProp;
int lobbyPlayerMaxCount;
SampleScene0126 sampleScene0126;
/*
public void BeforeCount()
{
photonView.RPC(nameof(LobbyCount), RpcTarget.AllViaServer, PhotonNetwork.LocalPlayer.UserId);
}
*/
private void Start()
{
photonView.RPC(nameof(LobbyCount), RpcTarget.AllViaServer, PhotonNetwork.LocalPlayer.UserId);
}
// [PunRPC]属性をつけると、RPCでの実行が有効になる
[PunRPC]
public void LobbyCount(string id)
{
lobbyPlayerMaxCount++;
Debug.Log(lobbyPlayerMaxCount);
Onflag(id);
}
public void Onflag(string id)
{
if (lobbyPlayerMaxCount == 1)
{
if (id == PhotonNetwork.LocalPlayer.UserId)
{
//numberProp = GameObject.FindWithTag("PlayerNumber").GetComponent<NumberProp>();
numberProp.Humanon();
// マッチング後、ランダムな位置に自分自身のネットワークオブジェクトを生成する
var v1 = new Vector3(-2, 0.5f,-2);
GameObject Prefab = PhotonNetwork.Instantiate("GamePlayer1", v1, Quaternion.identity);
}
//flag = false;
}
if (lobbyPlayerMaxCount == 2)
{
if (id == PhotonNetwork.LocalPlayer.UserId)
{
//numberProp = GameObject.FindWithTag("PlayerNumber").GetComponent<NumberProp>();
numberProp.Faceon();
// マッチング後、ランダムな位置に自分自身のネットワークオブジェクトを生成する
var v2 = new Vector3(2, 0.5f, 2);
GameObject Prefab = PhotonNetwork.Instantiate("GamePlayer1", v2, Quaternion.identity);
}
//flag = false;
}
if (lobbyPlayerMaxCount == 3)
{
if (id == PhotonNetwork.LocalPlayer.UserId)
{
//numberProp = GameObject.FindWithTag("PlayerNumber").GetComponent<NumberProp>();
numberProp.Humanon();
// マッチング後、ランダムな位置に自分自身のネットワークオブジェクトを生成する
var v3 = new Vector3(-2, 0.5f, 2);
GameObject Prefab = PhotonNetwork.Instantiate("GamePlayer1", v3, Quaternion.identity);
}
//flag = false;
}
if (lobbyPlayerMaxCount == 4)
{
if (id == PhotonNetwork.LocalPlayer.UserId)
{
//numberProp = GameObject.FindWithTag("PlayerNumber").GetComponent<NumberProp>();
numberProp.Humanon();
var v4 = new Vector3(2, 0.5f, -2);
GameObject Prefab = PhotonNetwork.Instantiate("GamePlayer1", v4, Quaternion.identity);
}
//flag = false;
}
}
}
こちらでスポーン地点の指定がきちんと機能した。
//キャラクターの指定とキャラクターに準拠したUIの表示
各種キャラクターの一つを選択し、そのキャラクターの個性が反映されたUIを取得・表示する。これはキャラクター選択シーンとプレイシーンに分割し、ロビー入室→キャラクター選択シーン→プレイシーンと遷移していく流れが自然。
まずはキャラクター選択シーン→プレイシーンとなる簡単な例から作成してみる。
Imageにbuttonコンポーネントをアタッチしたものをクリックすると、次のシーンに遷移して、クリックの際に受け取った値をもとに表示UIを選択し、表示させるようにしたい。
だが、以前確認したようにシーン移動の際に値は消失してしまうので、キャラクター選択シーンは時間制限付きUI表示として、プレイシーン内で表示させることにする。
さらに選択時間制限も追加し、時間内に選ばなかった場合は初期設定が選ばれる。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CharaUIchange : MonoBehaviour
{
[SerializeField]
GameObject baseui;
[SerializeField]
GameObject ui1;
[SerializeField]
GameObject ui2;
[SerializeField]
private float seconds;
// 前のUpdateの時の秒数
private float oldSeconds;
[SerializeField]
GameObject timerText;
Text timer;
void Start()
{
seconds = 0f;
oldSeconds = 0f;
timer = timerText.GetComponent<Text>();
}
void Update()
{
seconds += Time.deltaTime;
if (seconds >= 10f)
{
OpenUi1();
}
// 値が変わった時だけテキストUIを更新
if ((int)seconds != (int)oldSeconds)
{
timer.text = (10-seconds).ToString("f0");
}
oldSeconds = seconds;
}
public void OpenUi1()
{
ui1.SetActive(true);
StartCoroutine("thisHide");
}
public void OpenUi2()
{
ui2.SetActive(true);
StartCoroutine("thisHide");
}
IEnumerator thisHide()
{
yield return new WaitForSeconds(1);
baseui.SetActive(false);
}
}
この機能と先日作成したphotoncountの機能を組み合わせていく。
ロビー遷移後のSampleScene3でまずキャラクター選択UIを表示し、キャラクター画像クリック時にlobbyPlayerMaxCountを加算していく形にする。photonCountのpublic void BeforeCount()を復活させ、void Startを削除する。
人間・人狼表示がうまく最前面にこなかったのでcanvasのsort orderの値を大きくした。
characterUIの表示がcharacterpick時のクリック画像と異なっているので下記の仕組みをうまく利用しながら個別表示を行わせられるように考えていく。
if (lobbyPlayerMaxCount == )
{
if (id == PhotonNetwork.LocalPlayer.UserId)