- Home /
Updating multiplayer map on joining
Hello,
Some friends and I are making our own multiplayer game in Unity using the Photon networking plugin.
We have a pre made map with objects in it we alter the state of the objects using RPCs. Now, when a player joins the match i need to get the state of every object from the master client (any client can work), and i need to update the states of those objects on the joining client.
here's the joining code(C#):
using UnityEngine;
using System.Collections;
public class NetworkHandler : Photon.MonoBehaviour
{
public void Start() {
PhotonNetwork.ConnectUsingSettings("alpha 1.0");
}
public void OnGUI() {
GUILayout.Label(PhotonNetwork.connectionStateDetailed.ToString());
}
public void OnJoinedLobby() {
PhotonNetwork.JoinRandomRoom();
}
// Update is called once per frame
public void OnPhotonRandomJoinFailed() {
PhotonNetwork.CreateRoom(null);
}//
public void OnJoinedRoom() {
GameObject Player = PhotonNetwork.Instantiate("Player", Vector3.zero, Quaternion.identity, 0);
Player.transform.position = new Vector3(3.278986f, 0, -2.779208f);
// Enable all the scripts
foreach (MonoBehaviour script in Player.GetComponents<MonoBehaviour>()) {
script.enabled = true;
}
Transform playerCam = Player.transform.Find("Main Camera");
playerCam.gameObject.SetActive(true);
}
}
And here is the code for the walls that use the RPCs(also C#):
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Wall : Photon.MonoBehaviour
{
public enum Type {
Default = 0,
Unbreakable = 1,
Ghost = 2
};
public Type type;
private List<Material> materials = new List<Material>();
private PhotonView myphoton;
// Use this for initialization
public void Start() {
materials.Insert((int)Type.Default, Resources.Load("Materials/Wall_Default") as Material);
materials.Insert((int)Type.Unbreakable, Resources.Load("Materials/Wall_Solid") as Material);
materials.Insert((int)Type.Ghost, Resources.Load("Materials/Wall_Default_Ghost") as Material);
myphoton = GetComponent<PhotonView>();
//if (Random.Range(0, 2) > 0) {
// myphoton.RPC("Deactivate", PhotonTargets.All);
//}
}
/**
* Wall (de)activators
*/
[RPC]
public void Activate() {
gameObject.collider.isTrigger = false;
// renderer.material = material;
renderer.material = materials[(int)Type.Default];
type = Type.Default;
gameObject.layer = 0;
}
[RPC]
public void Deactivate() {
gameObject.collider.isTrigger = true;
renderer.material = materials[(int)Type.Ghost];
type = Type.Ghost;
gameObject.layer = 8;
}
/**
* Called when the object is being clicked on by the player
*/
public void Click(/*Player.Mode mode*/) {
switch (type) {
case Type.Default:
myphoton.RPC("Deactivate", PhotonTargets.All);
break;
case Type.Ghost:
myphoton.RPC("Activate", PhotonTargets.All);
break;
case Type.Unbreakable:
// Nothing to do here
break;
}
}
}
So, each wall has an Active and Deactive state basically and i need to sychronize those states for the newly joining players.
Thanks a tonne,
Yannick
Answer by MileSplit · May 08, 2014 at 03:28 PM
I would look into the PhotonTarget.AllBuffered. Basically all new joining players will have the rpc sent to them when they join your game.
Your answer
Follow this Question
Related Questions
Unity3D Photon movement synchronization 0 Answers
Photon timer issue 2 Answers
Unity networking tutorial? 6 Answers
Photon Cloud, Multiplayer Damage script 0 Answers