Синхронизация Unity Ball

Я пишу код для многопользовательской мобильной игры с анимированным мячом. Анимация мяча довольно быстрая (скорость около 25-30), и есть несколько мячей.

Изначально я пытался, чтобы физика запускалась на masterclient и синхронизировалась в клиентах по сети. Однако анимация мяча на клиентах не очень плавная, что снижает радость игрока.

Во-вторых, я попытался запустить каждую физику на каждом клиенте отдельно с помощью функции ниже, однако симуляция физики отличается в редакторе Android и Unity.

Наконец, что мне делать?

Rigidbody rb;
float t1 = 0.0f;
float t2 = 0.0f;
float scale = 2f;
float maxVelocity = 20f;
bool collided = false;
float limitSpeed = 30f;

float cooldown = 1;

void Start()
{
    rb = GetComponent<Rigidbody>();        
}

void InitialKick()
{
    switch (GameObject.Find("GameManager").GetComponent<GameManager>().ballCount)
    {
        case 1:
            rb.AddForce(new Vector3(20, 0f, 20), ForceMode.Force);
            break;
        case 2:
            rb.AddForce(new Vector3(-20, 0f, 20), ForceMode.Force);
            break;
        case 3:
            rb.AddForce(new Vector3(20, 0f, -20), ForceMode.Force);
            break;
        case 4:
            rb.AddForce(new Vector3(-20, 0f, -20), ForceMode.Force);
            break;
        case 5:
            rb.AddForce(new Vector3(10, 0f, 30), ForceMode.Force);
            break;
        case 6:
            rb.AddForce(new Vector3(-10, 0f, 30), ForceMode.Force);
            break;
        case 7:
            rb.AddForce(new Vector3(10, 0f, -30), ForceMode.Force);
            break;
        case 8:
            rb.AddForce(new Vector3(-10, 0f, -30), ForceMode.Force);
            break;
        case 9:
            rb.AddForce(new Vector3(30, 0f, 10), ForceMode.Force);
            break;
        case 10:
            rb.AddForce(new Vector3(-30, 0f, 10), ForceMode.Force);
            break;
    }
}

private void FixedUpdate()
{
    if (!collided) InitialKick();
    if (collided & rb.velocity.magnitude < maxVelocity) rb.AddForce(3f * scale * rb.velocity.normalized, ForceMode.Force);

    t1 += Time.deltaTime;
    if (t1 > 1.0f)
    {
        scale += 0.5f;
        t1 = 0.0f;
    }

    t2 += Time.deltaTime;
    if (t2 > 10.0f)
    {
        if (maxVelocity < 40f) maxVelocity++;
        t2 = 0.0f;
    }

    rb.mass += Time.deltaTime * 0.01f;
}

private void OnCollisionEnter(Collision collision)
{

    if (collision.collider.tag == "Wall" || collision.collider.tag == "Column")
    {
        collided = true;
    }

}
}

person cumhur asan    schedule 12.12.2019    source источник


Ответы (1)


Что я бы сделал, так это вычислил физику (например, список положений мяча в анимации) на masterclient. Мастер-клиент отправит каждому клиенту результаты расчетов. В конце концов, каждый клиент создаст анимацию на основе результатов.

person shahar    schedule 12.12.2019
comment
Спасибо, Шахар, звучит идеально. Извините, может быть, глупый вопрос, что вы имеете в виду под вычислением физики? Собственно, теоретически я прекрасно понял, что вы имеете в виду, но что мне делать на практике :) - person cumhur asan; 13.12.2019
comment
Лучше всего использовать расчеты физики у клиентов, но я не знаю, как это делать. Вы можете узнать, как это сделать, или вы можете создать массив положений мяча для создания анимации движения мяча в клиентах. - person shahar; 14.12.2019