2016-03-09 5 views
1

Установка: Создание моей первой многопользовательской игры и запущенная странная проблема. это танк игра, в которой игроки могут стрелять пулями и убивать друг другаИгрок, столкнувшийся с пулей при движении - Unity UNET

Проблема: Когда клиент стреляет во время движения, пуля, кажется, икру с небольшой задержкой, которая приводит к тому, игрок столкнется с пулей.

Проблема, кажется, что сам игрок является локальным и пуля в настоящее время породило в сети (что вызывает задержку)

Примечания: Ведущий игрок не имеет эта проблема, поэтому она как-то связана с сетью.

Как я могу синхронизировать пулю с клиентом?

private void Fire(){ 
    // Set the fired flag so only Fire is only called once. 
    m_Fired = true; 
    CmdCreateBullets(); 
    // Change the clip to the firing clip and play it. 
    m_ShootingAudio.clip = m_FireClip; 
    m_ShootingAudio.Play(); 
    // Reset the launch force. This is a precaution in case of missing button events. 
    m_CurrentLaunchForce = m_MinLaunchForce; 
} 

[Command] 
private void CmdCreateBullets() 
{ 

    GameObject shellInstance = (GameObject) 
     Instantiate (m_Shell, m_FireTransform.position, m_FireTransform.rotation) ; 
    // Set the shell's velocity to the launch force in the fire position's forward direction. 
    shellInstance.GetComponent<Rigidbody>().velocity = m_CurrentLaunchForce * m_FireTransform.forward; 

    NetworkServer.Spawn (shellInstance); 

} 
+0

Если снаряд создается на стороне сервера, он должен всегда быть впереди игрок (в евро), однако проблема вызвана коллайдером игрока, пересекающий модель к тому времени, игрок получает положение снаряда информация право? Это потому, что вы используете клиентское столкновение с ударом столкновения? –

+0

Это точно верно, и обнаружение столкновения Hit происходит на стороне клиента. – Rana

ответ

0

Я решил это следующим образом. если кто-то может посмотреть, чтобы подтвердить мой ответ, было бы хорошо.

private void Fire(){ 
    // Set the fired flag so only Fire is only called once. 
    m_Fired = true; 
    CmdCreateBullets(); 
    // Change the clip to the firing clip and play it. 
    m_ShootingAudio.clip = m_FireClip; 
    m_ShootingAudio.Play(); 
    // Reset the launch force. This is a precaution in case of missing button events. 
    m_CurrentLaunchForce = m_MinLaunchForce; 
} 

[Command] 
private void CmdCreateBullets() 
{ 
    RpclocalBullet(); 
} 

[ClientRpc] 
private void RpclocalBullet(){ 
    GameObject shellInstance = (GameObject) 
     Instantiate (m_Shell, m_FireTransform.position, m_FireTransform.rotation) ; 
    // Set the shell's velocity to the launch force in the fire position's forward direction. 
    shellInstance.GetComponent<Rigidbody>().velocity = 25f * m_FireTransform.forward; 
} 
2

Сделайте свою игру правила должны обслуживать танк игрока возможность снимать себя?

Если нет, то простое решение, чтобы иметь коллайдер снаряда игнорировать это коллайдер владельца, когда он активируется:

Transform bullet = Instantiate(bulletPrefab) as Transform; 
    Physics.IgnoreCollision(bullet.GetComponent<Collider>(), GetComponent<Collider>()); 
+0

Я думаю, что это один из способов решения проблемы. однако, я хотел бы, чтобы игрок получил урон, если они стоят перед стеной и стреляют. Радиус взрыва пули в этом случае повредит плеер. +1 за последнее решение, спасибо. – Rana

Смежные вопросы