åæèšå®
ãªã³ã©ã€ã³ã²ãŒã ãéçºããã«ã¯ãµãŒããŒãå¿ èŠã«ãªããŸããããããããèªåã§æºåããããšãããšããµãŒããŒæ§ç¯ïœéçšãªã©ã®ç¥èãã¹ãã«ãèŠæ±ããããµãŒããŒç¶æã®è²»çšãæéããããããšãããããªããªã倧å€ã§ããPhotonã«ã¯Photon CloudãšãããµãŒãã¹ããããã²ãŒã éçºè åŽã§ã¯äžå管çããå¿ èŠã®ãªããµãŒããŒãïŒåææ¥ç¶20人ãŸã§ïŒç¡æã§äœ¿ããã®ã§ããªã³ã©ã€ã³ã²ãŒã éçºãç°¡åã«å§ããããšãã§ããŸãã
ã¢ã«ãŠã³ãã®ç»é²ãšãµã€ã³ã€ã³
Photon Cloudãå©çšããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãç»é²ããŠã¢ããªã±ãŒã·ã§ã³IDãçºè¡ããŠãããå¿ èŠããããŸããæåã«å ¬åŒãµã€ãã§ïŒã¢ã«ãŠã³ãã®ç»é²ãæžãŸããŠïŒãµã€ã³ã€ã³ããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ã®äœæ
ãµã€ã³ã€ã³åŸã®ããã·ã¥ããŒãç»é¢ã§ãæ°ããã¢ããªãäœæããããã¿ã³ãæŒããšãæ°ããã¢ããªã±ãŒã·ã§ã³ã®äœæç»é¢ã«ãªããŸããPhotonã®çš®å¥ããPhoton PUNãã«ããŠã奜ããªã¢ããªã±ãŒã·ã§ã³åãå ¥åããããäœæããããã¿ã³ãæŒããŠãã ããã
æ£ããäœæããããšãããã·ã¥ããŒãç»é¢ããã¢ããªã±ãŒã·ã§ã³IDã確èªã§ããããã«ãªããŸãã
ã¢ã»ããã®ã€ã³ããŒã
Unityã®ãããžã§ã¯ããéããŠã以äžã®ã¢ã»ãããã€ã³ããŒãããŸãããã
ã»ããã¢ãã
ã¢ã»ããã®ã€ã³ããŒããæ£åžžã«çµäºãããšãèªåçã«ãPUN WizardããéããŸããå ã»ã©ååŸããã¢ããªã±ãŒã·ã§ã³IDãå ¥åããŠãSetup ProjectããæŒããŠãã ããã
ã»ããã¢ãããè¡ããããšãPUN2ã®èšå®ãã¡ã€ã«ïŒPhotonServerSettings
ïŒãçæãããŸããããã§åæèšå®ã¯å®äºã§ããèšå®å
容ã¯ããã©ã«ãã®ãŸãŸã§ãåé¡ãããŸãããã以äžã«ãªã¹ã¹ã¡ã®èšå®ãèšèŒããŠããŸãã®ã§åèã«ããŠã¿ãŠãã ããã
ð® ãã¥ãŒããªã¢ã«
ãããããªã³ã©ã€ã³ã²ãŒã éçºã®ãã¥ãŒããªã¢ã«ãšããŠã2Dã®ãµã³ãã«ãããžã§ã¯ããäœã£ãŠã¿ãŸããããPUN2ã®è©³çްãªçšèªãæ©èœã®èª¬æã¯æ¬¡ã®ãã£ãã¿ãŒä»¥éã§è¡ããŸãã®ã§ãããããããªãæããã£ãŠãããã£ããã¯æé ã«åŸã£ãŠã¡ãããšåäœããã確èªããŠã¿ãŠãã ããã
ãã¬ã€ã€ãŒèªèº«ã®ã¢ãã¿ãŒã衚瀺ããŠã¿ãã
ãŸãæåã«ããã¬ã€ã€ãŒèªèº«ã®ã¢ãã¿ãŒãšããŠè¡šç€ºããã²ãŒã ãªããžã§ã¯ãã®ãã¬ãããäœæããŸããããã§ã¯ã以äžã®3ç¹ã«æ³šæããŠãã ããã
- ãã¬ããã®ååã¯ãAvatarãã«ãã
- ãã¬ããã¯ãResourcesããã©ã«ããŒã®äžã«å ¥ãã
- ã²ãŒã ãªããžã§ã¯ãã«ã¯
PhotonView
ã³ã³ããŒãã³ãã远å ãã
次ã«ãã·ãŒã³äžã«ç©ºã®ã²ãŒã ãªããžã§ã¯ããäœæããŠã以äžã®æ°èŠã¹ã¯ãªããïŒSampleScene
ïŒã远å ããŠãã ããã
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
// MonoBehaviourPunCallbacksãç¶æ¿ããŠãPUNã®ã³ãŒã«ããã¯ãåãåããããã«ãã
public class SampleScene : MonoBehaviourPunCallbacks
{
private void Start() {
// PhotonServerSettingsã®èšå®å
容ã䜿ã£ãŠãã¹ã¿ãŒãµãŒããŒãžæ¥ç¶ãã
PhotonNetwork.ConnectUsingSettings();
}
// ãã¹ã¿ãŒãµãŒããŒãžã®æ¥ç¶ãæåããæã«åŒã°ããã³ãŒã«ããã¯
public override void OnConnectedToMaster() {
// "Room"ãšããååã®ã«ãŒã ã«åå ããïŒã«ãŒã ãååšããªããã°äœæããŠåå ããïŒ
PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
}
// ã²ãŒã ãµãŒããŒãžã®æ¥ç¶ãæåããæã«åŒã°ããã³ãŒã«ããã¯
public override void OnJoinedRoom() {
// ã©ã³ãã ãªåº§æšã«èªèº«ã®ã¢ãã¿ãŒïŒãããã¯ãŒã¯ãªããžã§ã¯ãïŒãçæãã
var position = new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f));
PhotonNetwork.Instantiate("Avatar", position, Quaternion.identity);
}
}
Unityã®ãšãã£ã¿ãŒäžã§å®è¡ããŠã¿ãŠãèªèº«ã®ã¢ãã¿ãŒãç»é¢ã«è¡šç€ºããããæåã§ãããããžã§ã¯ãããã«ãããŠãè€æ°ã®ã¢ãã¿ãŒã衚瀺ããããã確èªããŠã¿ãŸãããã
ãã¬ã€ã€ãŒåã衚瀺ããŠã¿ãã
ãã®ãŸãŸã§ã¯ãã©ãã誰ã®ã¢ãã¿ãŒãªã®ãå€å¥ãã€ããªãã®ã§ãã¢ãã¿ãŒã®é äžã«ãã¬ã€ã€ãŒåã衚瀺ããŠã¿ãŸããããã¢ãã¿ãŒã®ã²ãŒã ãªããžã§ã¯ãã®åèŠçŽ ãšããŠãããã¹ãã®ã²ãŒã ãªããžã§ã¯ããäœæããŠã以äžã®ã¹ã¯ãªããïŒAvatarNameDisplay
ïŒã远å ããŠãã ããã
using Photon.Pun;
using TMPro;
// MonoBehaviourPunCallbacksãç¶æ¿ããŠãphotonViewããããã£ã䜿ããããã«ãã
public class AvatarNameDisplay : MonoBehaviourPunCallbacks
{
private void Start() {
var nameLabel = GetComponent<TextMeshPro>();
// ãã¬ã€ã€ãŒåãšãã¬ã€ã€ãŒIDã衚瀺ãã
nameLabel.text = $"{photonView.Owner.NickName}({photonView.OwnerActorNr})";
}
}
ããã«SampleScene
ã®ã¹ã¯ãªãããä¿®æ£ããŠããã¬ã€ã€ãŒåãèšå®ããåŠçã远å ããŸãããã
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
public class SampleScene : MonoBehaviourPunCallbacks
{
private void Start() {
+ // ãã¬ã€ã€ãŒèªèº«ã®ååã"Player"ã«èšå®ãã
+ PhotonNetwork.NickName = "Player";
PhotonNetwork.ConnectUsingSettings();
}
public override void OnConnectedToMaster() {
PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
}
public override void OnJoinedRoom() {
var position = new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f));
PhotonNetwork.Instantiate("Avatar", position, Quaternion.identity);
}
}
ããã§å®è¡ãããšãã¢ãã¿ãŒã®é äžã«ãã¬ã€ã€ãŒåãšãã¬ã€ã€ãŒIDã衚瀺ãããããã«ãªããŸãã
ã¢ãã¿ãŒã®åããåæãããŠã¿ãã
ããããã¢ãã¿ãŒãæäœããŠåãããããã«ããŠã¿ãŸããããã¢ãã¿ãŒã®ã²ãŒã ãªããžã§ã¯ãã«ä»¥äžã®ã¹ã¯ãªããïŒAvatarController
ïŒã远å ããŠãUnityãšãã£ã¿ãŒäžã§èªèº«ã®ã¢ãã¿ãŒãç§»åã§ããããšã確èªããŠãã ããã
using Photon.Pun;
using UnityEngine;
// MonoBehaviourPunCallbacksãç¶æ¿ããŠãphotonViewããããã£ã䜿ããããã«ãã
public class AvatarController : MonoBehaviourPunCallbacks
{
private void Update() {
// èªèº«ãçæãããªããžã§ã¯ãã ãã«ç§»ååŠçãè¡ã
if (photonView.IsMine) {
var input = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0f);
transform.Translate(6f * Time.deltaTime * input.normalized);
}
}
}
ãªããžã§ã¯ããæäœããåŠçãè¡ãã ãã§ã¯ãä»ãã¬ã€ã€ãŒåŽã®ç»é¢äžã§åãã¯åæ ãããŸãããPUN2ã«ã¯ããªããžã§ã¯ãã®åº§æšãä»ãã¬ã€ã€ãŒãšèªåçã«åæããŠãããPhotonTransformView
ã³ã³ããŒãã³ããçšæãããŠããã®ã§ããããã¢ãã¿ãŒã®ã²ãŒã ãªããžã§ã¯ãã«è¿œå ããŸãããããããžã§ã¯ãããã«ãããŠã¿ãŠãä»ãã¬ã€ã€ãŒåŽã§ãåããåæ ãããŠãããæåã§ãã
ãã¥ãŒããªã¢ã«ã¯ã²ãšãŸãããã§çµäºã§ããããã®ãµã³ãã«ãããžã§ã¯ãã¯ã以éã®ãã£ãã¿ãŒã§èª¬æããæ©èœã®å®è£ äŸïŒð®ïŒã§äœ¿çšããŠãããŸãã