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;

Ответы (0 шт):