「Unity/photon/pun2/位置同期」の版間の差分
ナビゲーションに移動
検索に移動
| (同じ利用者による、間の10版が非表示) | |||
| 2行目: | 2行目: | ||
#Cube作成。ここでは"Avatar"という名前に変更した。 | #Cube作成。ここでは"Avatar"という名前に変更した。 | ||
#AvatarにBoxColliderが追加されていることを確認 | #AvatarにBoxColliderが追加されていることを確認 | ||
# | #AvatarのAddComponentにPhotonAvatarとPhotonViewとPhotonTransformViewを追加 | ||
#PhotonTransformViewに、PositionとRotationが、追加されてることを確認。 | #PhotonTransformViewに、PositionとRotationが、追加されてることを確認。 | ||
#Assets下に、Resourcesディレクトリを追加して、AvatarをResourcesに追加 | #Assets下に、Resourcesディレクトリを追加して、AvatarをResourcesに追加 | ||
# | #以下スクリプトでPrefabのAvatarをロードする。 | ||
*PhotonManager.cs | *PhotonManager.cs | ||
GameObject | GameObject avatar = PhotonNetwork.Instantiate("Avatar", Vector3.zero, Quaternion.Euler(Vector3.zero),0); | ||
* | これを使うと、相手が接続時に、インスタンスがロード&表示される。 | ||
*PhotonAvatar.sc | |||
<pre> | <pre> | ||
using UnityEngine; | using UnityEngine; | ||
using Photon.Pun; | using Photon.Pun; | ||
public class | public class PhotonAvatar : MonoBehaviourPunCallbacks, IPunInstantiateMagicCallback | ||
{ | { | ||
void Awake() | void Awake() | ||
{ | { | ||
this.name = " | this.name = "Avatar" + GetComponent<PhotonView>().InstantiationId; | ||
if (GetComponent<PhotonView>().IsMine) | if (GetComponent<PhotonView>().IsMine) | ||
{ | { | ||
GetComponent<Renderer>().material.color = Color.red; | GetComponent<Renderer>().material.color = Color.red; | ||
} else { | } else { | ||
// もし操作するクラスをaddしてた場合は、自分以外のときは無効とする | |||
GetComponent<CharacterControl>().enabled = false; | |||
} | |||
} | } | ||
void IPunInstantiateMagicCallback.OnPhotonInstantiate(PhotonMessageInfo info) | void IPunInstantiateMagicCallback.OnPhotonInstantiate(PhotonMessageInfo info) | ||
| 51行目: | 52行目: | ||
シーン移動後に、以下のように再開する | シーン移動後に、以下のように再開する | ||
PhotonNetwork.IsMessageQueueRunning = true; | PhotonNetwork.IsMessageQueueRunning = true; | ||
==位置同期しながらRPCのやり取りをする== | |||
以下を空いたスペースに追加する。 | |||
[PunRPC]は、PhotonViewを実装してるところでのみ使えるっぽい。 | |||
<pre> | |||
public class PhotonAvatar : MonoBehaviourPunCallbacks, IPunInstantiateMagicCallback | |||
{ | |||
public string userName = "guest"; | |||
void Awake() | |||
{ | |||
// ・・省略・・ | |||
if (GetComponent<PhotonView>().IsMine) | |||
{ | |||
PhotonNetwork.LocalPlayer.NickName = "Guest" + GetComponent<PhotonView>().InstantiationId; | |||
GetComponent<PhotonView>().RPC("SetUserName", RpcTarget.AllBuffered, PhotonNetwork.LocalPlayer.NickName); | |||
} | |||
} | |||
} | |||
// ・・省略・・ | |||
[PunRPC] | |||
void SetUserName(string value) | |||
{ | |||
transform.Find("UserNameText").GetComponent<TextMesh>().text = value; | |||
} | |||
} | |||
</pre> | |||
2022年12月13日 (火) 04:33時点における最新版
アバター風にしてみる
- Cube作成。ここでは"Avatar"という名前に変更した。
- AvatarにBoxColliderが追加されていることを確認
- AvatarのAddComponentにPhotonAvatarとPhotonViewとPhotonTransformViewを追加
- PhotonTransformViewに、PositionとRotationが、追加されてることを確認。
- Assets下に、Resourcesディレクトリを追加して、AvatarをResourcesに追加
- 以下スクリプトでPrefabのAvatarをロードする。
- PhotonManager.cs
GameObject avatar = PhotonNetwork.Instantiate("Avatar", Vector3.zero, Quaternion.Euler(Vector3.zero),0);
これを使うと、相手が接続時に、インスタンスがロード&表示される。
- PhotonAvatar.sc
using UnityEngine;
using Photon.Pun;
public class PhotonAvatar : MonoBehaviourPunCallbacks, IPunInstantiateMagicCallback
{
void Awake()
{
this.name = "Avatar" + GetComponent<PhotonView>().InstantiationId;
if (GetComponent<PhotonView>().IsMine)
{
GetComponent<Renderer>().material.color = Color.red;
} else {
// もし操作するクラスをaddしてた場合は、自分以外のときは無効とする
GetComponent<CharacterControl>().enabled = false;
}
}
void IPunInstantiateMagicCallback.OnPhotonInstantiate(PhotonMessageInfo info)
{
if (info.Sender.IsLocal)
{
Debug.Log("自身が生成");
}
else
{
Debug.Log("他人が生成");
}
info.Sender.TagObject = this.gameObject;
}
}
公式:https://doc.photonengine.com/ja-jp/pun/v2/gameplay/instantiation
既に接続してるプレイヤーのPhotonNetwork.Instantiateが表示されない時
シーンをまたぐ場合は、部屋に入ったときは、以下のようにして、相手プレイヤーの受信を控える
PhotonNetwork.IsMessageQueueRunning = false;
シーン移動後に、以下のように再開する
PhotonNetwork.IsMessageQueueRunning = true;
位置同期しながらRPCのやり取りをする
以下を空いたスペースに追加する。 [PunRPC]は、PhotonViewを実装してるところでのみ使えるっぽい。
public class PhotonAvatar : MonoBehaviourPunCallbacks, IPunInstantiateMagicCallback
{
public string userName = "guest";
void Awake()
{
// ・・省略・・
if (GetComponent<PhotonView>().IsMine)
{
PhotonNetwork.LocalPlayer.NickName = "Guest" + GetComponent<PhotonView>().InstantiationId;
GetComponent<PhotonView>().RPC("SetUserName", RpcTarget.AllBuffered, PhotonNetwork.LocalPlayer.NickName);
}
}
}
// ・・省略・・
[PunRPC]
void SetUserName(string value)
{
transform.Find("UserNameText").GetComponent<TextMesh>().text = value;
}
}