//tips
//キャラクターピックしたprefabの生成
今までは一種類のprefabしか生成していなかったが、キャラクターのピックに応じて生成するprefabを取捨選択できるようにしたい。
現在生成コードはphotonCountスクリプトに存在し、キャラクター画像がクリックされた際にBeforeCount()メソッドを通ってlobbyPlayerMaxCount++、カウント数に応じて、id == PhotonNetwork.LocalPlayer.UserIdで独自性を持たせた後に、人間・人狼UI表示とprefab生成指示を行なっている。
キャラクター画像のクリックにより各画像に割り振った数字も一緒に返すようにし、id == PhotonNetwork.LocalPlayer.UserIdの条件分岐の後、その数字をもとにprefab生成コードの分岐を行わせられるようにする。
まずphotonでの生成を読み込むためにResourcesフォルダの中に複数の動物prefabを導入。
なぜかキャラクターの生成ができなかったのでデバッグログを設置して、ボタンのonclickに設定したchara変数が機能しているか確認。
これもRPCで連動させる必要があったので再度コードを修正。仕組みはlobbyPlayerMaxCountと同じものを使用した。
下記のようにスクリプトを変更した。
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;
int chara;
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);
Debug.Log("Charachois" + chara);
if (chara == 1)
{
var v1 = new Vector3(-2, 0.5f, -2);
GameObject Prefab = PhotonNetwork.Instantiate("Rabbit", v1, Quaternion.identity);
}
if (chara == 2)
{
var v2 = new Vector3(2, 0.5f, 2);
GameObject Prefab = PhotonNetwork.Instantiate("Fox", v2, Quaternion.identity);
}
}
//flag = false;
}
if (lobbyPlayerMaxCount == 2)
{
if (id == PhotonNetwork.LocalPlayer.UserId)
{
//numberProp = GameObject.FindWithTag("PlayerNumber").GetComponent<NumberProp>();
numberProp.Faceon();
Debug.Log("Charachois" + chara);
if (chara == 1)
{
var v1 = new Vector3(-2, 0.5f, -2);
GameObject Prefab = PhotonNetwork.Instantiate("Rabbit", v1, Quaternion.identity);
}
if (chara == 2)
{
var v2 = new Vector3(2, 0.5f, 2);
GameObject Prefab = PhotonNetwork.Instantiate("Fox", v2, Quaternion.identity);
}
// マッチング後、ランダムな位置に自分自身のネットワークオブジェクトを生成する
//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;
}
}
public void BeforeChararabbit()
{
photonView.RPC(nameof(Chararabbit), RpcTarget.AllViaServer, PhotonNetwork.LocalPlayer.UserId);
}
// [PunRPC]属性をつけると、RPCでの実行が有効になる
[PunRPC]
public void Chararabbit(string id)
{
if (id == PhotonNetwork.LocalPlayer.UserId)
{
chara = 1;
Debug.Log("rabbit");
}
}
public void BeforeFox()
{
photonView.RPC(nameof(CharaFox), RpcTarget.AllViaServer, PhotonNetwork.LocalPlayer.UserId);
}
// [PunRPC]属性をつけると、RPCでの実行が有効になる
[PunRPC]
public void CharaFox(string id)
{
if (id == PhotonNetwork.LocalPlayer.UserId)
{
chara = 2;
Debug.Log("Fox");
}
}
/*
public void Chararabbit()
{
chara = 1;
Debug.Log("rabbit");
}
public void CharaFox()
{
chara = 2;
Debug.Log("Fox");
}
void Charachois()
{
Debug.Log("Charachois"+chara);
if (chara == 1)
{
var v1 = new Vector3(-2, 0.5f, -2);
GameObject Prefab = PhotonNetwork.Instantiate("Rabbit", v1, Quaternion.identity);
}
if (chara == 2)
{
var v2 = new Vector3(2, 0.5f, 2);
GameObject Prefab = PhotonNetwork.Instantiate("Fox", v2, Quaternion.identity);
}
}
*/
}
ただ、lobbyPlayerMaxCountの処理の方が先に実行されてしまうのでchara == 0となってしまい、生成できない。
キャラクター番号の取得を先に行いたいので、ボタンの上にカーソルが乗ったタイミングでキャラクター番号は取得するように変更する。
ボタンにeventtriggerコンポーネントをアタッチし、ポインターがオブジェクトに乗ったときに処理が実行されるようPointerEnterに各メソッドを格納する。
またprefabにphotonview関連がついているか再度確認しておく。
これにより無事異なるキャラクターを生成することができた。
キャラクターの移動がphoton対応になっていないのでそちらを修正していく。rabbit選択側のシーンでfoxの操作を行なっている。これはphotonismineの問題。
MonoBehaviourPunCallbacksを継承する移動スクリプト に更新する。
using Photon.Pun;
void FixedUpdate()
{
if (photonView.IsMine)
として編集し直した。
これで無事にそれぞれのキャラクターを同期させて動かすことができた。
キャラクターごとに異なるUIを持つが、人間か、人狼かでもUI表示を変化させたいのでその仕組みを考える。
少しUIの表示が複雑になってしまうが、キャラクターピック画面→人間人狼表示画面→背後でキャラクターUI表示しており、時間経過で消滅する人間人狼表示画面の後に残る形である。先にキャラクターの人間用のUI/人狼用のUIを作成しておき、人間人狼表示画面の表示タイミングでうまく自分の役割ではない方のUIを非表示にする設定も加えられるようにする。
PickUI/CharacterpickUIのButtonには、はじめに選択キャラクター情報を取得し、クリック時に、プレイ参加順の取得およびキャラUI表示という役割がある。
プレイ参加順の処理コードにキャラUI表示の人間人狼のうち片方のUIを非表示にする機能を追加すれば良さそうだが、キャラUI表示はコルーチンを使用してわざと遅らせて表示させているので、参加順の処理コードが読み込まれる方が早く、まだ表示されていないので、片方を非表示にすることができなさそうに思われる。
時間差コルーチンをプレイ参加順の処理コードに追加して対処できないか考える。また、非表示処理を行うUIをphotoncountスクリプトが取得しなければならないので、そちらの方法も考える。
CharaUIchange2のスクリプトを参照し、そこでキャラのUIセットを取得しているので、そのセットの子要素かつtagにhuman/wolfの表示がある方をgameobjectとして取得し、非表示にさせる方法で試してみる。
CharaUIchange2のスクリプトにメソッドを追加し、photoncountスクリプトの時間差コルーチン内でそのメソッドを実行する。