Почему клиент не обновляется после своего хода?C#

Место общения программистов C#
Ответить
Anonymous
 Почему клиент не обновляется после своего хода?

Сообщение Anonymous »

Итак, я пытался создать многопользовательскую карточную игру на Unity и добавил стрелку, показывающую текущего игрока. Хост Игрок 1 находится слева, клиент Игрок 2 — справа, и в этом примере у меня есть два компьютерных игрока с базовой карточной логикой. Как вы можете видеть в этом примере, когда играет Игрок 1, стрелка в обоих представлениях перемещается к Игроку 2. Игрок 2 играет, и только Игрок 1 обновляется, указывая на Игрок 3, затем после того, как Игрок 3 уходит, и Игрок 1, и Игрок 2 переходят к Игроку 4. По какой-то причине это всегда происходит с Игроком 2.
Изображение

Это вызывается после того, как я нажимаю кнопку выбора. Значения карт объединены в сеть, поэтому в основном это поиск соответствующей карты, выбранной в руке игрока, и создание игрового объекта для помещения в общую зону сброса, уничтожение карты в руке и добавление всего в зону сброса.
public void addCardsToDropzone()
{

List temp = new List();
List dc = new List();
for (int i = 0; i < selectedTags.Count; i++)
{
GameObject c = selectedCards;
Debug.Log($"This is the id for {c.name}: {cardNametoId[c.name]}");
temp = GameManager.Instance.getRandomCardData(i, selectedTags.Count);
if(GameManager.Instance.cardRank[c.tag] == 8)
{
GameManager.Instance.settingEightServerRpc();
}

GameManager.PlayedCardState cardInfo = new GameManager.PlayedCardState(cardNametoId[c.name], PlayerId, temp[0], temp[1], temp[2], GameManager.Instance.cardRank[c.tag]);
dc.Add(cardInfo);
Destroy(c);
}
GameManager.Instance.PlayCardServerRpc(dc.ToArray(), PlayerId, PlayerHandCount.Value);
PlayerHandCount.Value -= selectedCards.Count;

//callingPlayerPassClientRpc(0, PlayerHandCount.Value, PlayerId);
callingPlayerPass(0, PlayerHandCount.Value, PlayerId);
selectedCards.Clear();
selectedTags.Clear();

}

Затем он вызывает Gamemanager (синглтон для игровой логики) и добавляет карту, затем переходит к endturn, где она должна закончиться обновлением NextPlayer, а затем стрелочным скриптом.
[ServerRpc(RequireOwnership = false)]
public void PlayCardServerRpc(PlayedCardState[] dc, ulong playerId, int count)
{

if (!IsServer) return;
foreach(PlayedCardState card in dc)
{
dropzoneCards.Add(new PlayedCardState { CardNetworkId = card.CardNetworkId, PlayerId = playerId, X = card.X, Y = card.Y, Rotate = card.Rotate, CardRank = card.CardRank });
}

EndTurn(count,playerId);
}

public void EndTurn(int handcount, ulong playerId)
{
broadcastedCurPlayer = false;
Debug.Log("In end turn");

/* Shouldn't go here for this example, no 8s were played the handcount isn't 0 and the passes haven't reached 3*/
if (dropzoneCards.Count > 0 && (eightPlayed || handcount == 0 || (playerPass.Value == allPlayerId.Count - 1 )))
{
StartCoroutine(pauseBeforeContinue(handcount, playerId));
}
else
{
Debug.Log($"broadcast bool: {broadcastedCurPlayer}");
int temp = (currentPlayer.Value + 1) % 4;
broadcastingPlayerClientRpc(temp);

Debug.Log($"Before player set");
//setNextPlayerServerRpc(temp);
updatingNextPlayer(temp);

Debug.Log($"after player set");

}
}

public void updatingNextPlayer(int temp)
{
Player player = NetworkManager.Singleton.LocalClient.PlayerObject.GetComponent
();
if (player == null) return;

Debug.Log("Is setting new player");
player.arrow.GetComponent().SetTurn(temp);

setNextPlayerServerRpc(temp);
}

Тогда это стрелочный скрипт. Эпос — это позиция противника по отношению к игроку. Я не понимаю, почему Игрок 2 не получает обновления после своего хода.
public void SetTurn(int temp)
{
ulong playerId = NetworkManager.Singleton.LocalClient.ClientId;

int index = GameManager.Instance.allPlayerId.IndexOf(playerId);
ulong target = GameManager.Instance.allPlayerId[temp];
int ePos = (GameManager.Instance.allPlayerId.IndexOf(target) - index + 4) % 4;

if (index == -1)
ePos = 0;

Debug.Log($"Index: {index} \nTarget: {target}");
Debug.Log($"Index of target: {GameManager.Instance.allPlayerId.IndexOf(target)}");
Debug.Log($"epos: {ePos}");

Debug.Log($"Player {target} position is at {ePos}");

switch (ePos)
{
case 0:
// Player(-640, -230--260) rot 180
transform.localPosition = new Vector3(-640, -230, 180);
transform.rotation = Quaternion.Euler(new Vector3(0, 0, 180));
targetPos = new Vector3(-640, -245, 0);
floatX = false;
//floatY = true;
break;

case 1:
// Right(660 - 680, -260) rot - 90
transform.localPosition = new Vector3(660, -260, 0);
transform.rotation = Quaternion.Euler(new Vector3(0, 0, -90));
targetPos = new Vector3(670, -260, 0);
floatX = true;
break;

case 2:
// Up(640, 200-260/230-260) rot = 0
transform.localPosition = new Vector3(640, 230, 0);
transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));
targetPos = new Vector3(640, 245, 0);
floatX = false;
break;

case 3:
// Left(-660 - -680, 260) rot 90
transform.localPosition = new Vector3(-660, 260, 0);
transform.rotation = Quaternion.Euler(new Vector3(0, 0, 90));
targetPos = new Vector3(-670, 260, 0);
floatX = true;
break;

default:
Debug.Log("Arrow case went to default.");
break;

}

}



Подробнее здесь: https://stackoverflow.com/questions/798 ... r-its-turn
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»