In Unity with Photon, wait for clients for an object before destroy it from master?
I am trying to make a multiplayer card game. I am facing some kind of race condition. When a user clicks on a card, it says to master that the card is played. And the master decides that the move is accurate and turn back to clients that a card is played throw it to the table. And also if there are 4 cards on the table decide the winner and destroy the cards that played.
This is my player object:
public class Player : MonoBehaviour, IOnEventCallback
{
List<int> cardsOnTheTable;
public void OnEvent(EventData photonEvent)
{
byte eventCode = photonEvent.Code;
if (eventCode == 0)
{
if (photonView.IsMine)
{
object data = (object)photonEvent.CustomData;
if (CheckTheMoveIsOK())
{
byte evCode = 1;
object content = new object { (int)data[0], (int)data[1] };
RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.All };
SendOptions sendOptions = new SendOptions { Reliability = true };
PhotonNetwork.RaiseEvent(evCode, content, raiseEventOptions, sendOptions);
}
}
}
else if (eventCode == 1)
{
if (photonView.IsMine)
{
object data = (object)photonEvent.CustomData;
Card.Throw(fromPos, toPos);
if (PhotonNetwork.IsMasterClient)
{
cardsOnTheTable.Add((int)data[1]);
if (cardsOnTheTable.Count == 4)
{
RemoveCards();//With PhotonNetwork.Destroy
}
}
}
}
}
}
“Card” is a scene object that created from the master.
public class Card : MonoBehaviour
{
int CardId;
void OnMouseDown()
{
if (!photonView.IsMine)
{
return;
}
byte evCode = 0;
object content = new object { PhotonNetwork.LocalPlayer.ActorNumber, CardId };
RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.MasterClient };
SendOptions sendOptions = new SendOptions { Reliability = true };
PhotonNetwork.RaiseEvent(evCode, content, raiseEventOptions, sendOptions);
}
public void Throw(Vector3 fromPos, Vector3 toPos)
{
//Move card
}
}
The question is, sometimes, for some of the clients “Throw” functions throws an error because in the master client the corresponding card was already destroyed. I think I need to wait for all clients to “Throw” their cards then remove them from the network. How can I do that?
c# unity3d photon
add a comment |
I am trying to make a multiplayer card game. I am facing some kind of race condition. When a user clicks on a card, it says to master that the card is played. And the master decides that the move is accurate and turn back to clients that a card is played throw it to the table. And also if there are 4 cards on the table decide the winner and destroy the cards that played.
This is my player object:
public class Player : MonoBehaviour, IOnEventCallback
{
List<int> cardsOnTheTable;
public void OnEvent(EventData photonEvent)
{
byte eventCode = photonEvent.Code;
if (eventCode == 0)
{
if (photonView.IsMine)
{
object data = (object)photonEvent.CustomData;
if (CheckTheMoveIsOK())
{
byte evCode = 1;
object content = new object { (int)data[0], (int)data[1] };
RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.All };
SendOptions sendOptions = new SendOptions { Reliability = true };
PhotonNetwork.RaiseEvent(evCode, content, raiseEventOptions, sendOptions);
}
}
}
else if (eventCode == 1)
{
if (photonView.IsMine)
{
object data = (object)photonEvent.CustomData;
Card.Throw(fromPos, toPos);
if (PhotonNetwork.IsMasterClient)
{
cardsOnTheTable.Add((int)data[1]);
if (cardsOnTheTable.Count == 4)
{
RemoveCards();//With PhotonNetwork.Destroy
}
}
}
}
}
}
“Card” is a scene object that created from the master.
public class Card : MonoBehaviour
{
int CardId;
void OnMouseDown()
{
if (!photonView.IsMine)
{
return;
}
byte evCode = 0;
object content = new object { PhotonNetwork.LocalPlayer.ActorNumber, CardId };
RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.MasterClient };
SendOptions sendOptions = new SendOptions { Reliability = true };
PhotonNetwork.RaiseEvent(evCode, content, raiseEventOptions, sendOptions);
}
public void Throw(Vector3 fromPos, Vector3 toPos)
{
//Move card
}
}
The question is, sometimes, for some of the clients “Throw” functions throws an error because in the master client the corresponding card was already destroyed. I think I need to wait for all clients to “Throw” their cards then remove them from the network. How can I do that?
c# unity3d photon
You should afterif (PhotonNetwork.IsMasterClient)
wait until all players have the animation finished e.g. by letting them respond with a simple message and on the server count those responses e.g.while(responses!= 4) wait
before calling the destroy
– derHugo
Jan 2 at 9:37
add a comment |
I am trying to make a multiplayer card game. I am facing some kind of race condition. When a user clicks on a card, it says to master that the card is played. And the master decides that the move is accurate and turn back to clients that a card is played throw it to the table. And also if there are 4 cards on the table decide the winner and destroy the cards that played.
This is my player object:
public class Player : MonoBehaviour, IOnEventCallback
{
List<int> cardsOnTheTable;
public void OnEvent(EventData photonEvent)
{
byte eventCode = photonEvent.Code;
if (eventCode == 0)
{
if (photonView.IsMine)
{
object data = (object)photonEvent.CustomData;
if (CheckTheMoveIsOK())
{
byte evCode = 1;
object content = new object { (int)data[0], (int)data[1] };
RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.All };
SendOptions sendOptions = new SendOptions { Reliability = true };
PhotonNetwork.RaiseEvent(evCode, content, raiseEventOptions, sendOptions);
}
}
}
else if (eventCode == 1)
{
if (photonView.IsMine)
{
object data = (object)photonEvent.CustomData;
Card.Throw(fromPos, toPos);
if (PhotonNetwork.IsMasterClient)
{
cardsOnTheTable.Add((int)data[1]);
if (cardsOnTheTable.Count == 4)
{
RemoveCards();//With PhotonNetwork.Destroy
}
}
}
}
}
}
“Card” is a scene object that created from the master.
public class Card : MonoBehaviour
{
int CardId;
void OnMouseDown()
{
if (!photonView.IsMine)
{
return;
}
byte evCode = 0;
object content = new object { PhotonNetwork.LocalPlayer.ActorNumber, CardId };
RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.MasterClient };
SendOptions sendOptions = new SendOptions { Reliability = true };
PhotonNetwork.RaiseEvent(evCode, content, raiseEventOptions, sendOptions);
}
public void Throw(Vector3 fromPos, Vector3 toPos)
{
//Move card
}
}
The question is, sometimes, for some of the clients “Throw” functions throws an error because in the master client the corresponding card was already destroyed. I think I need to wait for all clients to “Throw” their cards then remove them from the network. How can I do that?
c# unity3d photon
I am trying to make a multiplayer card game. I am facing some kind of race condition. When a user clicks on a card, it says to master that the card is played. And the master decides that the move is accurate and turn back to clients that a card is played throw it to the table. And also if there are 4 cards on the table decide the winner and destroy the cards that played.
This is my player object:
public class Player : MonoBehaviour, IOnEventCallback
{
List<int> cardsOnTheTable;
public void OnEvent(EventData photonEvent)
{
byte eventCode = photonEvent.Code;
if (eventCode == 0)
{
if (photonView.IsMine)
{
object data = (object)photonEvent.CustomData;
if (CheckTheMoveIsOK())
{
byte evCode = 1;
object content = new object { (int)data[0], (int)data[1] };
RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.All };
SendOptions sendOptions = new SendOptions { Reliability = true };
PhotonNetwork.RaiseEvent(evCode, content, raiseEventOptions, sendOptions);
}
}
}
else if (eventCode == 1)
{
if (photonView.IsMine)
{
object data = (object)photonEvent.CustomData;
Card.Throw(fromPos, toPos);
if (PhotonNetwork.IsMasterClient)
{
cardsOnTheTable.Add((int)data[1]);
if (cardsOnTheTable.Count == 4)
{
RemoveCards();//With PhotonNetwork.Destroy
}
}
}
}
}
}
“Card” is a scene object that created from the master.
public class Card : MonoBehaviour
{
int CardId;
void OnMouseDown()
{
if (!photonView.IsMine)
{
return;
}
byte evCode = 0;
object content = new object { PhotonNetwork.LocalPlayer.ActorNumber, CardId };
RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.MasterClient };
SendOptions sendOptions = new SendOptions { Reliability = true };
PhotonNetwork.RaiseEvent(evCode, content, raiseEventOptions, sendOptions);
}
public void Throw(Vector3 fromPos, Vector3 toPos)
{
//Move card
}
}
The question is, sometimes, for some of the clients “Throw” functions throws an error because in the master client the corresponding card was already destroyed. I think I need to wait for all clients to “Throw” their cards then remove them from the network. How can I do that?
c# unity3d photon
c# unity3d photon
asked Jan 2 at 8:45
ozturk.brkozturk.brk
84
84
You should afterif (PhotonNetwork.IsMasterClient)
wait until all players have the animation finished e.g. by letting them respond with a simple message and on the server count those responses e.g.while(responses!= 4) wait
before calling the destroy
– derHugo
Jan 2 at 9:37
add a comment |
You should afterif (PhotonNetwork.IsMasterClient)
wait until all players have the animation finished e.g. by letting them respond with a simple message and on the server count those responses e.g.while(responses!= 4) wait
before calling the destroy
– derHugo
Jan 2 at 9:37
You should after
if (PhotonNetwork.IsMasterClient)
wait until all players have the animation finished e.g. by letting them respond with a simple message and on the server count those responses e.g. while(responses!= 4) wait
before calling the destroy– derHugo
Jan 2 at 9:37
You should after
if (PhotonNetwork.IsMasterClient)
wait until all players have the animation finished e.g. by letting them respond with a simple message and on the server count those responses e.g. while(responses!= 4) wait
before calling the destroy– derHugo
Jan 2 at 9:37
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003427%2fin-unity-with-photon-wait-for-clients-for-an-object-before-destroy-it-from-mast%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003427%2fin-unity-with-photon-wait-for-clients-for-an-object-before-destroy-it-from-mast%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
You should after
if (PhotonNetwork.IsMasterClient)
wait until all players have the animation finished e.g. by letting them respond with a simple message and on the server count those responses e.g.while(responses!= 4) wait
before calling the destroy– derHugo
Jan 2 at 9:37