Задать вопрос
@Senture

[Unity] Стрельба в мультиплеере?

Здравствуйте!
У меня имеется скрипт PlayerShoot:
Это один из его методов:
[Command]
    void CmdShoot()
    {
        // Create the Bullet from the Bullet Prefab
        GameObject bullet = Instantiate(
            bulletPref,
            bulletSpawn.position,
            bulletSpawn.rotation);

        // Add velocity to the bullet
        bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 700;

        //// Spawn the bullet on the Clients
        NetworkServer.Spawn(bullet);

        // Destroy the bullet after 2 seconds
        Destroy(bullet, 2.0f);
    }

Вызов данного метода происходит при нажатии на ЛКМ.
Все работает отлично за исключением одного НО, спавн пули происходит на сервере и передается на клиент(как я понял) и когда я подключаюсь к серверу(удаленно в другом городе) то при стрельбе с клиента пуля спавнится с задержкой после выстрела и если я буду ходить(персонажем) то пуля будет спавниться вне оружия.
5abf6a235c9da043328292.png
это пример как спавниться пуля при ходьбе вправо влево. Мне нужно сделать так: пуля должна спавниться на клиенте и передаваться серверу. Я пытался сделать так:
void Shoot()
    {
        // Create the Bullet from the Bullet Prefab
        GameObject bullet = Instantiate(
            bulletPref,
            bulletSpawn.position,
            bulletSpawn.rotation);

        // Add velocity to the bullet
        bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 700;

        //// Spawn the bullet on the Clients
        // NetworkServer.Spawn(bullet);
       CmdSpawn(bullet);
        // Destroy the bullet after 2 seconds
        Destroy(bullet, 2.0f);
    }

    [Command]
    void CmdSpawn(GameObject bullet)
    {
        //Spawn the bullet on the Clients
        NetworkServer.Spawn(bullet);
    }


Но выдает вот такую ошибку:
NullReferenceException: Object reference not set to an instance of an object
UnityEngine.Networking.NetworkServer.GetNetworkIdentity (UnityEngine.GameObject go, UnityEngine.Networking.NetworkIdentity& view) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1078)
UnityEngine.Networking.NetworkServer.SpawnObject (UnityEngine.GameObject obj) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1293)
UnityEngine.Networking.NetworkServer.Spawn (UnityEngine.GameObject obj) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1525)
PlayerShoot.CmdSpawn (UnityEngine.GameObject bullet) (at Assets/Scripts/PlayerShoot.cs:156)
PlayerShoot.InvokeCmdCmdSpawn (UnityEngine.Networking.NetworkBehaviour obj, UnityEngine.Networking.NetworkReader reader)
UnityEngine.Networking.NetworkIdentity.HandleCommand (Int32 cmdHash, UnityEngine.Networking.NetworkReader reader) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkIdentity.cs:618)
UnityEngine.Networking.NetworkServer.OnCommandMessage (UnityEngine.Networking.NetworkMessage netMsg) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1281)
UnityEngine.Networking.NetworkConnection.HandleReader (UnityEngine.Networking.NetworkReader reader, Int32 receivedSize, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:469)
UnityEngine.Networking.NetworkConnection.HandleBytes (System.Byte[] buffer, Int32 receivedSize, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:425)
UnityEngine.Networking.NetworkConnection.TransportReceive (System.Byte[] bytes, Int32 numBytes, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkConnection.cs:576)
UnityEngine.Networking.NetworkServer.OnData (UnityEngine.Networking.NetworkConnection conn, Int32 receivedSize, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:738)
UnityEngine.Networking.NetworkServer+ServerSimpleWrapper.OnData (UnityEngine.Networking.NetworkConnection conn, Int32 receivedSize, Int32 channelId) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1869)
UnityEngine.Networking.NetworkServerSimple.HandleData (Int32 connectionId, Int32 channelId, Int32 receivedSize, Byte error) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServerSimple.cs:384)
UnityEngine.Networking.NetworkServerSimple.Update () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServerSimple.cs:247)
UnityEngine.Networking.NetworkServer.InternalUpdate () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:691)
UnityEngine.Networking.NetworkServer.Update () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:642)
UnityEngine.Networking.NetworkIdentity.UNetStaticUpdate () (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkIdentity.cs:1091)

Как исправить?

P.S. Спасибо огромноеее!!!
  • Вопрос задан
  • 835 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Коллега, Вам звиздец. Правда. Как итог мучений, Вы придете к идее, что время на сервере - это настоящее, а время на клиенте - это всегда прошлое. И запаздывает оно на 2*(ping до сервера). Вот краткое описание, как это реализовали в Valve.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Gera01
Unity, С# и больше ничего.
Есть в unity asset пак с оружием уже настроеным для стрельбы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы