ãã®ãã£ãã¿ãŒã§ã¯ãå ·äœçãªåææ¹æ³ã®è§£èª¬ãå§ããåã«ãåæãè¡ãããã®éèŠãªèŠçŽ ãšãªããã¬ã€ã€ãŒãšããããã¯ãŒã¯ãªããžã§ã¯ãïŒNetworked ObjectïŒã«ã€ããŠè©³ãã説æããŸãã
ãã¬ã€ã€ãŒ
ããŒã«ã«ãã¬ã€ã€ãŒã®ååŸ
ãã¬ã€ã€ãŒã®æ
å ±ã¯Player
ã¯ã©ã¹ã®ãªããžã§ã¯ãã§è¡šçŸãããŠããŸããèªèº«ã®ãã¬ã€ã€ãŒãªããžã§ã¯ãã¯ãããŒã«ã«ãã¬ã€ã€ãŒãšããŠPhotonNetwork
ãããã€ã§ãååŸããããšãã§ããŸãã
// ããŒã«ã«ãã¬ã€ã€ãŒãªããžã§ã¯ããååŸãã
var localPlayer = PhotonNetwork.LocalPlayer;
ãã¬ã€ã€ãŒã®ãªã¹ãã®ååŸ
ã«ãŒã ã«åå ããŠããéã¯ãåãã«ãŒã ã«åå ããŠãããã¬ã€ã€ãŒãªããžã§ã¯ãã®é
åãååŸã§ããŸãããã¬ã€ã€ãŒãªããžã§ã¯ãã®é
åã¯ãããŒã«ã«ãã¬ã€ã€ãŒãå«ããã®ãšå«ãŸãªããã®ã®2ã€ãPhotonNetwork
ã«çšæãããŠããŸãã
// ã«ãŒã å
ã®ãã¬ã€ã€ãŒãªããžã§ã¯ãã®é
åïŒããŒã«ã«ãã¬ã€ã€ãŒãå«ãïŒãååŸãã
var players = PhotonNetwork.PlayerList;
// ã«ãŒã å
ã®ãã¬ã€ã€ãŒãªããžã§ã¯ãã®é
åïŒããŒã«ã«ãã¬ã€ã€ãŒãå«ãŸãªãïŒãååŸãã
var others = PhotonNetwork.PlayerListOthers;
ãã䜿ããã£ãŒã«ããšããããã£
ãã¬ã€ã€ãŒãªããžã§ã¯ãã®ãã£ãŒã«ããšããããã£ã®äžã§ããã䜿ããã®ã以äžã®è¡šã«ç€ºããŸãã
åå | 説æ |
---|---|
player.ActorNumber |
ãã¬ã€ã€ãŒã®ID |
player.NickName |
ãã¬ã€ã€ãŒå |
player.IsLocal |
ããŒã«ã«ãã¬ã€ã€ãŒãã©ãã |
player.IsMasterClient |
ãã¹ã¿ãŒã¯ã©ã€ã¢ã³ããã©ãã |
// ã«ãŒã å
ã®ãã¬ã€ã€ãŒå
šå¡ã®ãã¬ã€ã€ãŒåãšIDãã³ã³ãœãŒã«ã«åºåãã
foreach (var player in PhotonNetwork.PlayerList) {
Debug.Log($"{player.NickName}({player.ActorNumber})");
}
ããŒã«ã«ãã¬ã€ã€ãŒã®äžéšã®ããããã£ã¯ãPhotonNetwork
ã®ã·ã§ãŒãã«ãããããå©çšã§ããŸãã
åå | 説æ |
---|---|
PhotonNetwork.NickName |
ããŒã«ã«ãã¬ã€ã€ãŒã®åå |
PhotonNetwork.IsMasterClient |
ããŒã«ã«ãã¬ã€ã€ãŒããã¹ã¿ãŒã¯ã©ã€ã¢ã³ããã©ãã |
// ããŒã«ã«ãã¬ã€ã€ãŒã®ååãèšå®ãã
PhotonNetwork.NickName = "Player";
// ããŒã«ã«ãã¬ã€ã€ãŒããã¹ã¿ãŒã¯ã©ã€ã¢ã³ããã©ãããå€å®ãã
if (PhotonNetwork.IsMasterClient) {
Debug.Log("èªèº«ããã¹ã¿ãŒã¯ã©ã€ã¢ã³ãã§ã");
}
ãã¬ã€ã€ãŒåå ã»éåºã®ã³ãŒã«ããã¯
MonoBehaviourPunCallbacks
ãç¶æ¿ããŠããã¹ã¯ãªããã¯ãä»ãã¬ã€ã€ãŒãåãã«ãŒã ã«åå ã»éåºããæã®ã³ãŒã«ããã¯ãåãåãããšãã§ããŸããä»ãã¬ã€ã€ãŒã®ãªããžã§ã¯ãã¯ãã³ãŒã«ããã¯ã®åŒæ°ãšããŠæž¡ãããŸãã
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
public class PlayerCallbacksSample : MonoBehaviourPunCallbacks
{
// ä»ãã¬ã€ã€ãŒãã«ãŒã ãžåå ããæã«åŒã°ããã³ãŒã«ããã¯
public override void OnPlayerEnteredRoom(Player newPlayer) {
Debug.Log($"{newPlayer.NickName}ãåå ããŸãã");
}
// ä»ãã¬ã€ã€ãŒãã«ãŒã ããéåºããæã«åŒã°ããã³ãŒã«ããã¯
public override void OnPlayerLeftRoom(Player otherPlayer) {
Debug.Log($"{otherPlayer.NickName}ãéåºããŸãã");
}
}
ãããã¯ãŒã¯ãªããžã§ã¯ã
ã€ã³ã¹ã¿ã³ã¹ã®çæ
ãããã¯ãŒã¯äžã§åæãããã²ãŒã ãªããžã§ã¯ãã¯ããããã¯ãŒã¯ãªããžã§ã¯ããšåŒã°ããŸãããããã¯ãŒã¯ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãçæããã«ã¯ãã²ãŒã ãªããžã§ã¯ãã«PhotonView
ã³ã³ããŒãã³ãã远å ããŠããã®ãã¬ããããResoucesãã«å
¥ããPhotonNetwork.Instantiate()
ããçæåŠçãè¡ããŸãã
-
ã²ãŒã ãªããžã§ã¯ãã«
PhotonView
ã³ã³ããŒãã³ãã远å ãã
-
ã²ãŒã ãªããžã§ã¯ãã®ãã¬ããããResourcesããã©ã«ããŒã®äžã«å ¥ãã
-
PhotonNetwork.Instantiate()
ããã€ã³ã¹ã¿ã³ã¹ãçæãã
// "NetworkedObject"ãã¬ãããããããã¯ãŒã¯ãªããžã§ã¯ããçæãã
PhotonNetwork.Instantiate("NetworkedObject", Vector3.zero, Quaternion.identity);
æææš©
ãããã¯ãŒã¯ãªããžã§ã¯ãã¯æææš©ïŒOwnershipïŒã«ãã£ãŠãã¬ã€ã€ãŒãšçŽã¥ããŸãããã¬ã€ã€ãŒããããã¯ãŒã¯ãªããžã§ã¯ããçæãããšããã®ãã¬ã€ã€ãŒã¯ãããã¯ãŒã¯ãªããžã§ã¯ãã®çæè ïŒCreatorïŒãšãªããããã©ã«ãã®ææè ïŒOwnerïŒãã€ç®¡çè ïŒControllerïŒãšãªããŸãã
- ææè : ãããã¯ãŒã¯ãªããžã§ã¯ããææããŠãããã¬ã€ã€ãŒ
- çæè : ãããã¯ãŒã¯ãªããžã§ã¯ããçæãããã¬ã€ã€ãŒ
- 管çè : ãããã¯ãŒã¯ãªããžã§ã¯ããæäœããæš©éãæã€ãã¬ã€ã€ãŒ
Unityã®ãšãã£ã¿ãŒäžã§å®è¡äžã«ãã€ã³ã¹ãã¯ã¿ãŒããæææš©ã確èªã§ãã
MonoBehaviourPunCallbacks
ãç¶æ¿ããŠããã¹ã¯ãªããã¯ãphotonView
ããããã£ãéããŠãæææš©åšãã®æ§ã
ãªæ
å ±ãååŸã§ããŸãã
åå | 説æ |
---|---|
photonView.IsMine |
èªèº«ïŒããŒã«ã«ãã¬ã€ã€ãŒïŒã管çè ãã©ãã |
photonView.Owner |
ææè ã®ãã¬ã€ã€ãŒãªããžã§ã¯ã |
photonView.Controller |
管çè ã®ãã¬ã€ã€ãŒãªããžã§ã¯ã |
photonView.OwnerActorNr |
ææè
ã®IDïŒphotonView.Owner.ActorNumber ã®ã·ã§ãŒãã«ããïŒ |
photonView.CreatorActorNr |
çæè ã®ID |
photonView.ControllerActorNr |
管çè
ã®IDïŒphotonView.Controller.ActorNumber ã®ã·ã§ãŒãã«ããïŒ |
ãããã¯ãŒã¯ãªããžã§ã¯ãã¯ãéåžžã®ã²ãŒã ãªããžã§ã¯ããšåãããã«ã¹ã¯ãªããã远å ããŠèªç±ã«æäœããããšãã§ããŸãããphotonView.IsMine
ã§èªèº«ã管çè
ãã©ãããå€å®ããŠããåŠçããªããšãèªèº«ã®ãªããžã§ã¯ããžã®æäœãä»ãã¬ã€ã€ãŒã®ãªããžã§ã¯ãã«ã圱é¿ããŠããŸãå¯èœæ§ãããã®ã§æ³šæããŸãããã
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
public class OwnershipSample : MonoBehaviourPunCallbacks
{
private void Start() {
// èªèº«ã管çè
ãã©ãããå€å®ãã
if (photonView.IsMine) {
// ææè
ãååŸãã
Player owner = photonView.Owner;
// ææè
ã®ãã¬ã€ã€ãŒåãšIDãã³ã³ãœãŒã«ã«åºåãã
Debug.Log($"{owner.NickName}({photonView.OwnerActorNr})");
}
}
}
ã«ãŒã ãªããžã§ã¯ãã®çæ
ãããã¯ãŒã¯ãªããžã§ã¯ãã®çæè ãã«ãŒã ããéåºãããšãåºæ¬çã«ãã®ãããã¯ãŒã¯ãªããžã§ã¯ãã¯èªåçã«ç Žæ£ãããŸãããããã¯ãŒã¯ãªããžã§ã¯ããã«ãŒã ã§å ±æããŠåæããããå Žåã«ã¯ããã¹ã¿ãŒã¯ã©ã€ã¢ã³ãã«ãã£ãŠãã«ãŒã ãªããžã§ã¯ããšåŒã°ããã«ãŒã ã«çŽã¥ãããããã¯ãŒã¯ãªããžã§ã¯ããçæããŸãã
// "RoomObject"ãã¬ããããã«ãŒã ãªããžã§ã¯ããçæãã
if (PhotonNetwork.IsMasterClient) {
PhotonNetwork.InstantiateRoomObject("RoomObject", Vector3.zero, Quaternion.identity);
}
MonoBehaviourPunCallbacks
ãç¶æ¿ããŠããã¹ã¯ãªããã¯ãphotonView
ããããã£ãéããŠããããã¯ãŒã¯ãªããžã§ã¯ããã«ãŒã ãªããžã§ã¯ããã©ãããå€å®ã§ããŸãã
åå | 説æ |
---|---|
photonView.IsRoomView |
ã«ãŒã ãªããžã§ã¯ããã©ãã |
ã«ãŒã ãªããžã§ã¯ãã¯çæè
ãæããªãã®ã§ããã¬ã€ã€ãŒãã«ãŒã ããéåºããããšã«ãã£ãŠèªåçã«ç Žæ£ãããããšã¯ãããŸããããŸããã«ãŒã ãªããžã§ã¯ãã®ç®¡çè
ã¯ãã¹ã¿ãŒã¯ã©ã€ã¢ã³ãã«ãªãã®ã§ããã¹ã¿ãŒã¯ã©ã€ã¢ã³ãåŽã§ã¯photonView.IsMine
ãtrue
ã«ãªããŸãã
ïŒéåžžã®ïŒãããã¯ãŒã¯ãªããžã§ã¯ã | ã«ãŒã ãªããžã§ã¯ã | |
---|---|---|
ææè | çæè ïŒããã©ã«ãïŒ |
null ïŒããã©ã«ãïŒ |
çæè | çæè | null |
管çè | çæè ïŒããã©ã«ãïŒ | ãã¹ã¿ãŒã¯ã©ã€ã¢ã³ãïŒããã©ã«ãïŒ |
ð¶ ãResourcesãã䜿ããã«ãããã¯ãŒã¯ãªããžã§ã¯ããçæãã
ããã©ã«ãã§ã¯ãããã¯ãŒã¯ãªããžã§ã¯ããçæããã«ã¯ãçæããããããã¯ãŒã¯ãªããžã§ã¯ãã®ãã¬ããããResourcesãã«å
¥ããŠããå¿
èŠããããŸããPUN2ã§ã¯ããã®ãããã¯ãŒã¯ãªããžã§ã¯ãã®çæã»ç Žæ£ãè¡ãåŠçãèªç±ã«å·®ãæ¿ããããããã«ãªã£ãŠããŠããããå©çšãããšãResourcesãã䜿ããã«ãããã¯ãŒã¯ãªããžã§ã¯ããçæã§ããŸããå·®ãæ¿ãã¯ç°¡åã§ãIPunPrefabPool
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããã¯ã©ã¹ãPhotonNetwork.PrefabPool
ã«èšå®ããã ãã§ãã
using Photon.Pun;
using UnityEngine;
// IPunPrefabPoolã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãã
public class GamePlayerPrefabPool : MonoBehaviour, IPunPrefabPool
{
[SerializeField]
private GamePlayer gamePlayerPrefab = default;
private void Start() {
// ãããã¯ãŒã¯ãªããžã§ã¯ãã®çæã»ç Žæ£ãè¡ãåŠçãããã®ã¯ã©ã¹ã®åŠçã«å·®ãæ¿ãã
PhotonNetwork.PrefabPool = this;
}
GameObject IPunPrefabPool.Instantiate(string prefabId, Vector3 position, Quaternion rotation) {
switch (prefabId) {
case "GamePlayer":
var player = Instantiate(gamePlayerPrefab, position, rotation);
// çæããããããã¯ãŒã¯ãªããžã§ã¯ãã¯éã¢ã¯ãã£ãç¶æ
ã§è¿ãå¿
èŠããã
// ïŒãã®åŸãPhotonNetworkã®å
éšã§æ£ããåæåãããŠããèªåçã«ã¢ã¯ãã£ãç¶æ
ã«æ»ãããïŒ
player.gameObject.SetActive(false);
return player.gameObject;
}
return null;
}
void IPunPrefabPool.Destroy(GameObject gameObject) {
Destroy(gameObject);
}
}
ããã«ããããã¯ãŒã¯ãªããžã§ã¯ãã®çæã»ç Žæ£ãè¡ãåŠçå
ã§ãªããžã§ã¯ãããŒã«ã®ä»çµã¿ãå°å
¥ãããšããããã¯ãŒã¯ãªããžã§ã¯ãã䜿ãåããããã«ãªããããæ¯èŒçéãObject.Instantiate()
ã®åŠçã®è² è·ãæããããšãã§ããŸãã
using System.Collections.Generic;
using Photon.Pun;
using UnityEngine;
public class GamePlayerPrefabPool : MonoBehaviour, IPunPrefabPool
{
[SerializeField]
private GamePlayer gamePlayerPrefab = default;
private Stack<GamePlayer> inactiveObjectPool = new Stack<GamePlayer>();
private void Start() {
PhotonNetwork.PrefabPool = this;
}
GameObject IPunPrefabPool.Instantiate(string prefabId, Vector3 position, Quaternion rotation) {
switch (prefabId) {
case "GamePlayer":
GamePlayer player;
if (inactiveObjectPool.Count > 0) {
player = inactiveObjectPool.Pop();
player.transform.SetPositionAndRotation(position, rotation);
} else {
player = Instantiate(gamePlayerPrefab, position, rotation);
player.gameObject.SetActive(false);
}
return player.gameObject;
}
return null;
}
void IPunPrefabPool.Destroy(GameObject gameObject) {
var player = gameObject.GetComponent<GamePlayer>();
// PhotonNetworkã®å
éšã§æ¢ã«éã¢ã¯ãã£ãç¶æ
ã«ãããŠããã®ã§ã以äžã®åŠçã¯äžèŠ
// player.gameObject.SetActive(false);
inactiveObjectPool.Push(player);
}
}
ãã®éã䜿ãåããããããã¯ãŒã¯ãªããžã§ã¯ãã®ã¹ã¯ãªããã§Unityã®ã€ãã³ã颿°ã䜿ã£ãŠããå Žåã«ã¯ãå°ã泚æãå¿
èŠã§ãããªããžã§ã¯ãçæåŸã«äžåºŠããåŒã°ããªãAwake()
ãStart()
ã§äœããã®åæååŠçãè¡ã£ãŠãããšããªããžã§ã¯ãã䜿ãåãããæã«æ£ããåæååŠçãè¡ãããªãå¯èœæ§ãããããã§ãã
public class GamePlayer : MonoBehaviourPunCallbacks
{
private void Awake() {
// Object.Instantiateã®åŸã«äžåºŠã ãå¿
èŠãªåæååŠçãè¡ã
}
private void Start() {
// çæåŸã«äžåºŠã ãïŒOnEnableã®åŸã«ïŒåŒã°ãããããã§åæååŠçãè¡ãå Žåã¯èŠæ³šæ
}
public override void OnEnable() {
base.OnEnable();
// PhotonNetwork.Instantiateã®çæåŠçåŸã«å¿
èŠãªåæååŠçãè¡ã
}
public override void OnDisable() {
base.OnDisable();
// PhotonNetwork.Destroyã®ç Žæ£åŠçåã«å¿
èŠãªçµäºåŠçãè¡ã
}
}
ð¶ ãã¬ã€ã€ãŒãšãããã¯ãŒã¯ãªããžã§ã¯ãã®å¹ççãªç®¡ç
PhotonNetwork.PlayersList
ãPhotonNetwork.PlayerListOthers
ã¯ãã¢ã¯ã»ã¹ãããã³ã«é
åã®ã³ããŒãè¿ããŸããååŸããé
åã®èŠçŽ æ°ãæå³ããã«å€ããããšã¯ãããŸããããé »ç¹ã«ã¢ã¯ã»ã¹ããå Žåã«ã¯ãããã©ãŒãã³ã¹äžã®åé¡ãçºçããå¯èœæ§ããããŸãã
ãŸããPhotonNetwork.PhotonViewCollection
ããã¯ããããã¯ãŒã¯ãªããžã§ã¯ãã®ã€ãã¬ãŒã¿ãŒãååŸã§ããŸãããè€æ°ã®çš®é¡ã®ãããã¯ãŒã¯ãªããžã§ã¯ãã䜿çšããŠããå Žåã¯ããããã¯ãŒã¯ãªããžã§ã¯ããçš®é¡å¥ã«åããåŠçãå¿
èŠã«ãªãããšãããããã䜿ãåæã¯ããŸãè¯ããããŸããã
// ã«ãŒã å
ã®ãããã¯ãŒã¯ãªããžã§ã¯ãã®ååãšIDãã³ã³ãœãŒã«ã«åºåãã
foreach (var photonView in PhotonNetwork.PhotonViewCollection) {
Debug.Log($"{photonView.gameObject.name}({photonView.ViewID})");
}
äžèšã®æ±ãã¥ãããè§£æ¶ããããã«ããããã¯ãŒã¯ãªããžã§ã¯ãã管çããç¬èªã¯ã©ã¹ãäœæããã®ããªã¹ã¹ã¡ã§ãã
ããã§ã¯ããã¥ãŒããªã¢ã«ã§äœæãããµã³ãã«ãããžã§ã¯ãïŒð®ïŒã§ãã¢ãã¿ãŒã®ãããã¯ãŒã¯ãªããžã§ã¯ãã管çããã¯ã©ã¹ãäœæããŠã¿ãŸããããã·ãŒã³äžã®ç©ºã®ã²ãŒã ãªããžã§ã¯ããäœæããŠãã¢ãã¿ãŒã管çããã¹ã¯ãªããïŒAvatarContainer
ïŒã远å ããŸãã
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AvatarContainer : MonoBehaviour, IEnumerable<AvatarContainerChild>
{
private List<AvatarContainerChild> avatarList = new List<AvatarContainerChild>();
public AvatarContainerChild this[int index] => avatarList[index];
public int Count => avatarList.Count;
private void OnTransformChildrenChanged() {
avatarList.Clear();
foreach (Transform child in transform) {
avatarList.Add(child.GetComponent<AvatarContainerChild>());
}
}
public IEnumerator<AvatarContainerChild> GetEnumerator() {
return avatarList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}
ã¢ãã¿ãŒã®ãããã¯ãŒã¯ãªããžã§ã¯ãã«ã¯ãã¢ãã¿ãŒã管çãããªããžã§ã¯ãã®åèŠçŽ ã«ããã¹ã¯ãªããïŒAvatarContainerChild
ïŒã远å ããŸãããããããšãã¢ãã¿ãŒã管çãããªããžã§ã¯ãã§ã¯OnTransformChildrenChanged()
ãåŒã°ããŠãã¢ãã¿ãŒã®ãªã¹ããæŽæ°ãããŸããOwner
ããããã£ãå®çŸ©ããŠããã°ãã¢ãã¿ãŒã®ãªã¹ãã¯ããã¬ã€ã€ãŒã®ãªã¹ããšããŠã䜿ããããã«ãªããŸãã
using Photon.Pun;
using Photon.Realtime;
public class AvatarContainerChild : MonoBehaviourPunCallbacks
{
public Player Owner => photonView.Owner;
public override void OnEnable() {
base.OnEnable();
var container = FindObjectOfType<AvatarContainer>();
if (container != null) {
transform.SetParent(container.transform);
}
}
}
ð¶ ãããã¯ãŒã¯ãªããžã§ã¯ãã®æææš©ã®ç§»è²
ä»ãã¬ã€ã€ãŒãæææš©ãæã€ã€ã³ã¹ã¿ã³ã¹ãããæææš©ãååŸïŒèªåèªèº«ãžæææš©ãç§»è²ïŒã§ããããã«ããã«ã¯ããŸãPhotonView
ã®æææš©ãªãã·ã§ã³ã倿ŽããŠããå¿
èŠããããŸãã
æææš©ãªãã·ã§ã³ | 説æ |
---|---|
Fixed | æææš©ã¯ååŸã§ãããçæè ãåžžã«æææš©ãæã€ïŒããã©ã«ãïŒ |
Takeover | æææš©ãèªç±ã«ååŸã§ãã |
Request | æææš©ãååŸããããã«ã¯ãææè ã®èš±å¯ãå¿ èŠã«ãªã |
æææš©ãååŸãããã€ã³ã¹ã¿ã³ã¹ã®PhotonView
ã§RequestOwnership()
ãåŒã³åºããšããTakeoverããªãã·ã§ã³ãéžæããæã¯ããã«æææš©ãååŸãããRequestããªãã·ã§ã³ãéžæããæã¯æææš©ã®ãªã¯ãšã¹ããè¡ãããŸãã
photonView.RequestOwnership();
IPunOwnershipCallbacks
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŠããã¹ã¯ãªããã¯ãæææš©é¢é£ã®ã³ãŒã«ããã¯ãåãåãããšãã§ããŸããïŒMonoBehaviourPunCallbacks
ãç¶æ¿ããŠãã³ãŒã«ããã¯ã¯åãåããªãã®ã§æ³šæããŠãã ããïŒ
ãRequestããªãã·ã§ã³ãéžæããæã¯ãIPunOwnershipCallbacks.OnOwnershipRequest()
ã«èªèº«ãæææš©ãæã€ã€ã³ã¹ã¿ã³ã¹ã§æææš©ã®ãªã¯ãšã¹ããè¡ãããéã®åŠçïŒèš±å¯/æåŠïŒãå®è£
ããããšã§ãæææš©ãç§»è²ã§ããããã«ãªããŸãã
// æææš©ã®ãªã¯ãšã¹ããè¡ãããæã«åŒã°ããã³ãŒã«ããã¯
void IPunOwnershipCallbacks.OnOwnershipRequest(PhotonView targetView, Player requestingPlayer) {
// èªèº«ãæææš©ãæã€ã€ã³ã¹ã¿ã³ã¹ã§æææš©ã®ãªã¯ãšã¹ããè¡ãããããåžžã«èš±å¯ããŠæææš©ãç§»è²ãã
if (targetView.IsMine && targetView.ViewID == photonView.ViewID) {
bool acceptsRequest = true;
if (acceptsRequest) {
targetView.TransferOwnership(requestingPlayer);
} else {
// ãªã¯ãšã¹ããæåŠããå Žåã¯ãäœãããªã
}
}
}
// æææš©ã®ç§»è²ãè¡ãããæã«åŒã°ããã³ãŒã«ããã¯
void IPunOwnershipCallbacks.OnOwnershipTransfered(PhotonView targetView, Player previousOwner) {
if (targetView.ViewID == photonView.ViewID) {
string id = targetView.ViewID.ToString();
string p1 = previousOwner.NickName;
string p2 = targetView.Owner.NickName;
Debug.Log($"ViewID {id} ã®æææš©ã {p1} ãã {p2} ã«ç§»è²ãããŸãã");
}
}
ã€ã³ã¹ã¿ã³ã¹ã®ææè ãã«ãŒã ããéåºããéã¯ãçæè ã«æææš©ãæ»ããŸãããã€ã³ã¹ã¿ã³ã¹ã®çæè ãã«ãŒã ããéåºããéã¯ããã®æææš©ãç§»è²ãããŠãããã©ããã«ãããããã€ã³ã¹ã¿ã³ã¹ãèªåçã«åé€ãããããæ³šæããŸãããã
ã·ãŒã³ãªããžã§ã¯ãã¯ããã©ã«ãã§ææè
ãæã¡ãŸããããéåžžã®ãããã¯ãŒã¯ãªããžã§ã¯ããšåãããã«ãæææš©ãç§»è²ã§ããŸããææè
ãæããªãéã¯ããã¹ã¿ãŒã¯ã©ã€ã¢ã³ãã管çè
ã«ãªã£ãŠããŠãphotonView.IsMine
ã§å€å¥ãã§ããŸãããã¹ã¿ãŒã¯ã©ã€ã¢ã³ããã«ãŒã ããéåºããéã¯ã次ã«å²ãåœãŠããããã¹ã¿ãŒã¯ã©ã€ã³ãã管çè
ã«ãªããŸããæææš©ãç§»è²ããåŸã«ææè
ãã«ãŒã ããéåºããéã¯ãææè
ãæããªãç¶æ
ã«æ»ããã¹ã¿ãŒã¯ã©ã€ã¢ã³ãã管çè
ã«ãªããŸãã