「Unity/photon/pun2/位置同期」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→位置同期しながらRPCのやり取りをする) |
|||
(同じ利用者による、間の16版が非表示) | |||
行1: | 行1: | ||
==アバター風にしてみる== | ==アバター風にしてみる== | ||
− | #Cube作成。ここでは"Avatar" | + | #Cube作成。ここでは"Avatar"という名前に変更した。 |
− | # | + | #AvatarにBoxColliderが追加されていることを確認 |
− | # | + | #AvatarのAddComponentにPhotonAvatarとPhotonViewとPhotonTransformViewを追加 |
− | # | + | #PhotonTransformViewに、PositionとRotationが、追加されてることを確認。 |
− | # | + | #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 | + | using Photon.Pun; |
− | + | ||
− | public class | + | public class PhotonAvatar : MonoBehaviourPunCallbacks, IPunInstantiateMagicCallback |
− | + | { | |
− | void Awake() { | + | void Awake() |
− | this.name = " | + | { |
− | if (GetComponent<PhotonView>().IsMine) { | + | this.name = "Avatar" + GetComponent<PhotonView>().InstantiationId; |
+ | if (GetComponent<PhotonView>().IsMine) | ||
+ | { | ||
GetComponent<Renderer>().material.color = Color.red; | 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; | ||
+ | } | ||
} | } | ||
</pre> | </pre> | ||
公式:https://doc.photonengine.com/ja-jp/pun/v2/gameplay/instantiation | 公式:https://doc.photonengine.com/ja-jp/pun/v2/gameplay/instantiation | ||
+ | |||
+ | ==既に接続してるプレイヤーのPhotonNetwork.Instantiateが表示されない時== | ||
+ | シーンをまたぐ場合は、部屋に入ったときは、以下のようにして、相手プレイヤーの受信を控える | ||
+ | PhotonNetwork.IsMessageQueueRunning = false; | ||
+ | シーン移動後に、以下のように再開する | ||
+ | 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日 (火) 13: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; } }