Unity. Синхронизация UI счёта игроков
Я делаю пинг-понг игру на Юнити Миррор. Это мой первый мультиплеер проект, поэтому буду рад услышать любую критику по коду от вас. Началась проблема с того, что я не знал как наладить взаимодействие между клиентом и сервером в моих двух скриптах - ball.cs (в нем находится условие, при выполнении которого срабатывает метод другого скрипта ScoreScript.cs, отвечающего за изменение счётчика очков игроков)
ball.cs:
public override void OnStartServer()
{
base.OnStartServer();
ScoreScript = GameObject.Find("ScoreManager").GetComponent<Score>();
if (ScoreScript == null)
Debug.Log("There's no GameObject ScoreScript");
rb.velocity = Vector2.zero;
}
void FixedUpdate()
{
SpeedLimit();
if(hasAuthority)
GoalUpdate();
}
[Command]
private void GoalUpdate()
{
if (rb.transform.position.x > 10.0)
{
rb.velocity = Vector2.zero;
rb.transform.position = startPosition2;
ScoreScript.Increment(1); //increment score for p1
Debug.Log("Goal for Player 1 in GoalUpdate, Yeah!");
}
else if (rb.transform.position.x < -10.0)
{
rb.velocity = Vector2.zero;
rb.transform.position = startPosition1;
ScoreScript.Increment(2); //increment score for p2
Debug.Log("Goal for Player 2 in GoalUpdate, Yeah!");
}
}
Score.cs:
[SerializeField] int scorePlayer1, scorePlayer2;
public Text ScoreText1, ScoreText2;
public void Start()
{
scorePlayer1 = 0;
ScoreText1.text = 0.ToString();
scorePlayer2 = 0;
ScoreText2.text = 0.ToString();
}
[ClientRpc]
public void Increment(int whichScore)
{
if (whichScore == 1)
{
ScoreText1.text = (++scorePlayer1).ToString();
Debug.Log("Plus Score for Player 1 in ScoreScript.Increment(), Yeah!");
}
if (whichScore == 2)
{
ScoreText2.text = (++scorePlayer2).ToString();
Debug.Log("Plus Score for Player 2 in ScoreScript.Increment(), Yeah!");
}
}
После определения GoalUpdate() как [Command] и Increment как [ClientRpc] возникла проблема того, что при выполнении условия, то есть мяч вышел за границы x, начинается спам очков , т.е. бесконечное выполнение ScoreScript.Increment(). При этом в коде видно, что сначала меняется положение этого мячика на начальное, а только потом идет присвоение счёта. На сцене видно, что, при выходе мяча за x, скорость мячика равна 0, а его изменение положения на стартовое просто игнорируется. Единственный вывод, который я сделал - это то, что при использовании [Command] нельзя давать новую позицию объекту. Тогда можно обратиться в Score.cs к RigidBody мяча и там уже в том же методе отредактировать новое положение и оно действительно работает. Но, на мой взгляд, это ужасное решение и я, наверное, что-то упускаю.
rb.velocity = Vector2.zero;
rb.transform.position = startPosition;