éçºçšGUIã³ã³ããŒãã³ã
PUN2ã«ã¯ãçŸåšã®ãããã¯ãŒã¯ç¶æ
ãå¯èŠåããPhotonStatsGui
ã³ã³ããŒãã³ããåç·ãäžå®å®ãªãã¬ã€ã€ãŒã®åäœããã¹ããããããPhotonLagSimulationGui
ã³ã³ããŒãã³ãããããããçšæãããŠããŸããStatsïŒã¬ã³ããªã³ã°çµ±èšïŒããããã¡ã€ã©ãŒã§ã¯ç¢ºèªã§ããªããããªããããã¯ãŒã¯ã«èµ·å ããåé¡ã®ãããã°ãæé©åã«åœ¹ç«ã€ã§ãããã
ãã©ãŠã¶ã®ã¿ãã®éã¢ã¯ãã£ãæ€åºïŒWebGLãã«ãæïŒ
WebGLãã«ããå®è¡ããŠãããã©ãŠã¶ã®ã¿ããéã¢ã¯ãã£ãã«ãªããšãã²ãŒã ã®ãã¬ãŒã ã¬ãŒãã¯èããäœäžããŸããããããªã³ã©ã€ã³ã²ãŒã ã ã£ãå Žåã«ã¯ãä»ãã¬ã€ã€ãŒåŽã§èŽåœçãªåæãºã¬ãçºçããŠããŸããªã©ã®æªåœ±é¿ãåãŒãå¯èœæ§ããããŸãã
ãã®åé¡ãåé¿ãããæè»œãªæ¹æ³ã¯ããã¬ãŒã ã¬ãŒãã®äœäžãæ€åºããŠã«ãŒã ããéåºããããŸãã¯ãµãŒããŒããåæããåŠçãè¡ãããšã§ãããã¬ãŒã ã¬ãŒãã¯Time.deltaTime
ããèšç®ã§ããŸãããäžç¬ã ãè² è·ãé«ãåŠçãçºçããå Žåãªã©ã«èª€æ€åºããŠããŸãããšããããããTime.deltaTime
ãæ»ããã«è£æ£ãããŠããTime.smoothDeltaTime
ã䜿ããŸãããã
using Photon.Pun;
using UnityEngine;
public class LeaveRoomWhenInactive : MonoBehaviour
{
private void Update() {
// ã«ãŒã ã«åå ããŠããéãå¹³åãã¬ãŒã ã¬ãŒããèããäœäžããããã«ãŒã ããéåºãã
if (PhotonNetwork.InRoom) {
if (Time.smoothDeltaTime > 0.4f) {
PhotonNetwork.LeaveRoom();
}
}
}
}
å ¬åŒããã¥ã¡ã³ãã§ããäžèšä»¥å€ã®æ§ã ãªæ¹æ³ã玹ä»ãããŠããã®ã§åèã«ãããšè¯ãã§ãããã
ãããã¯ãŒã¯ã«ãªã³ã°
åºæ¬çã«ãªããžã§ã¯ãåæãRPCã¯åãã«ãŒã ãžåå ããŠãããã¬ã€ã€ãŒå šå¡ãšåæãè¡ããããããå¿ ãããå šå¡ã«éä¿¡ããå¿ èŠããªãããŒã¿ãåæããå Žåã«ã¯ãç¡é§ãªéä¿¡ãçºçããŠããŸãããšã«ãªããŸããããã¯ããµãŒããŒåŽã®ããžãã¯ã§é©åãªãã¬ã€ã€ãŒã®ã¿ã«éä¿¡ã§ããã°çæ³ã§ãããPhoton Cloudã䜿ãå Žåã«ã¯ããµãŒããŒåŽã®åŠçãå ¥ããããšãã§ããªãã®ã§ããã®ç°¡æçãªä»£æ¿ãšããŠã€ã³ã¿ã¬ã¹ãã°ã«ãŒãïŒInterest GroupsïŒãšããæ©èœãå©çšã§ããŸãã
ã€ã³ã¿ã¬ã¹ãã°ã«ãŒãã®åä¿¡èšå®
ãã¬ã€ã€ãŒã¯PhotonNetwork.SetInterestGroups()
ã§ãå信察象ã®ã°ã«ãŒãã®è¿œå ãšåé€ãè¡ãããšãã§ããŸããã°ã«ãŒãIDã¯byte
åã®å€ã§ã1ïœ255ã®ç¯å²ã§è€æ°éžæã§ããŸããã°ã«ãŒãID0ã¯ãã«ãŒã ãžåå ããŠãããã¬ã€ã€ãŒå
šå¡ãèªåçã«å信察象ãšããŠè¿œå ãããããã©ã«ãã®ã°ã«ãŒãã§ãèšå®ã倿ŽïŒåé€ïŒããããšã¯ã§ããŸããã
PhotonNetwork.SetInterestGroups(
new byte[] { 1, 2, 3 }, // ã°ã«ãŒãID1ïœ3ãå信察象ããåé€ãã
new byte[] { 4, 5, 6 } // ã°ã«ãŒãID4ïœ6ãå信察象ã«è¿œå ãã
);
åŒæ°ãnull
ã«ãããšãã°ã«ãŒãæå®ç¡ãããArray.Empty<byte>()
ã«ãããšãå
šãŠã®ã°ã«ãŒããæå®ãã«ãªããŸããå
éšçã«åŒæ°ã®ã°ã«ãŒãIDã®é
åã¯ãHashSet<byte>
åã³ã¬ã¯ã·ã§ã³ã§æŽçãããŠããéä¿¡ãããã®ã§ãä»®ã«ã°ã«ãŒãIDãéè€ããŠãåé¡ã¯ãããŸããã远å ãšåé€ã®é
åã®éã§ã°ã«ãŒãIDãéè€ããå Žåã¯ã远å ãåªå
ãããŸãã
// å
šãŠã®ã°ã«ãŒããå信察象ããåé€ãã
PhotonNetwork.SetInterestGroups(Array.Empty<byte>(), null);
// ã°ã«ãŒãID1ïœ3ãå信察象ã«è¿œå ãããã以å€ã®å
šãŠã®ã°ã«ãŒããå信察象ããåé€ãã
PhotonNetwork.SetInterestGroups(Array.Empty<byte>(), new byte[] { 1, 2, 3 });
// ã°ã«ãŒãID4ïœ6ãå信察象ã«è¿œå ããã°ã«ãŒãID1ïœ3ãå信察象ããåé€ãã
PhotonNetwork.SetInterestGroups(new byte[] { 1, 2, 3, 4, 5 }, new byte[] { 4, 5, 6, 4, 5, 6 });
ã€ã³ã¿ã¬ã¹ãã°ã«ãŒãã®éä¿¡èšå®
ãªããžã§ã¯ãåæãRPCã¯ãéä¿¡ãããïŒéä¿¡ããŒã¿ãäœæãããïŒæã«PhotonView.Group
ã§æå®ãããŠããã°ã«ãŒãIDãé信察象ã«èšå®ãããŸããã°ã«ãŒãID0ãæå®ãããšãã«ãŒã ãžåå ããŠãããã¬ã€ã€ãŒå
šå¡ã«éä¿¡ããããšã«ãªããŸããïŒPhotonView.Group
ã¯ãéä¿¡æã«ã°ã«ãŒãIDãèšå®ããããã ãã®å€ã§ã倿Žããããšã§éä¿¡ã¯çºçããŸããïŒ
// ã°ã«ãŒãID1ãå信察象ã«è¿œå ããŠãããã¬ã€ã€ãŒã®ã¿ã§ããªããžã§ã¯ãåæãè¡ããã
void IPunObservable.OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) {
if (stream.IsWriting) {
photonView.Group = 1;
stream.SendNext(transform.position);
} else {
transform.position = (Vector3)stream.ReceiveNext();
}
}
// ã°ã«ãŒãID1ãå信察象ã«è¿œå ããŠãããã¬ã€ã€ãŒã®ã¿ã§ãRPCãå®è¡ããã
public void FireProjectile(float angle) {
photonView.Group = 1;
photonView.RPC(nameof(RPCFireProjectile), RpcTarget.All, angle);
}
ãããã¯ãŒã¯ãªããžã§ã¯ããçæããéã«ã°ã«ãŒãIDãæå®ããããšãã§ããŸããã°ã«ãŒãIDãæå®ããŠçæãããã€ã³ã¹ã¿ã³ã¹ã¯ãåŸããã€ã³ã¿ã¬ã¹ãã°ã«ãŒãã®åä¿¡èšå®ã倿ŽããŠããèªåçã«çæã»åé€ãããããšã¯ãããŸããã
// ã°ã«ãŒãID1ãå信察象ã«è¿œå ããŠãããã¬ã€ã€ãŒã®ã¿ã§ããããã¯ãŒã¯ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãçæããã
PhotonNetwork.Instantiate("NetworkedObject", Vector3.zero, Quaternion.identity, 1);
å®è£ äŸ
1kmåæ¹ã®ããããã100måæ¹ã®ãšãªã¢ã«åå²ããŠãããããã«ã°ã«ãŒãID1ïœ100ãå²ãåœãŠãŸãããã¬ã€ã€ãŒã¯åº§æšãæŽæ°ãããã³ã«ãèªèº«ããããšãªã¢ã®ã°ã«ãŒãIDãèšç®ããŠã倿Žãããã°æŽæ°ããããã«ããŸããããã§ãåããšãªã¢ã«ãããã¬ã€ã€ãŒå士ã®ã¿ã座æšã®æŽæ°ãåæããããã«ãªããŸãã
using Photon.Pun;
using UnityEngine;
public class GamePlayer : MonoBehaviourPunCallbacks
{
private void Update() {
if (photonView.IsMine) {
var direction = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")).normalized;
var dv = 6f * Time.deltaTime * direction;
transform.Translate(dv);
var areaPosition = new Vector2Int(
Mathf.Clamp(Mathf.FloorToInt((transform.position.x + 500f) / 100f), 0, 9),
Mathf.Clamp(Mathf.FloorToInt((transform.position.y + 500f) / 100f), 0, 9)
);
byte currentGroup = (byte)(areaPosition.x + 10 * areaPosition.y + 1);
if (currentGroup != photonView.Group) {
PhotonNetwork.SetInterestGroups(
new byte[] { photonView.Group },
new byte[] { currentGroup }
);
photonView.Group = currentGroup;
}
}
}
}
ããã¯ãµã³ãã«çšã®åçŽãªäŸã§ããå®çšçã«ã¯ããšãªã¢ã®å¢çã§æ¥ã«åæãéåããªãããã«åšå²ã®ãšãªã¢ã®ã°ã«ãŒãIDãå信察象ã«å«ãããããã£ãšã¡ãããšãã空éåå²ã§ã°ã«ãŒãIDãå²ãåœãŠããããå¿ èŠãããã§ããããããã«ãã®å Žåã«ã¯ãæå€§255ã°ã«ãŒããšããæ°ãå¶éã«ãªã£ãŠããŸãããšããããããããªã倧å€ãªå®è£ ã«ãªãããšãäºæ³ãããŸãã