unity networking: пули не отображаются на клиенте, когда они запущены хостом

Я создаю простой 3D онлайн-шутер. Я столкнулся с проблемой: когда хост выпускает пулю, пуля летит правильно и правильно отображается. А вот если стреляет клиент он не видит свою пулю. Но хост со своего экрана видит, как пуля пролетает мимо. Также моя пуля имеет коллизию. Когда ты стреляешь в обьект игрока, он слегка двигается в сторону. Итак, когда стреляет хост то он может увидеть почему игрока подвинуло в бок. Но когда стреляешь с клиента - другой игрок просто дергается немного в бок, потому что пули не видно.

Видел на форумах много вопросов, когда хост(сервер) не отображает пулю запущенную клиентом. А вот если наоборот, хост(сервер) отображает пулю запущенную клиентом, но у клиента она не отображается, то я нигде такого не нашел.

Прикрепляю код для контролирования оружия:

using Mirror;

public class WeaponManager : NetworkBehaviour
{
    private Transform weaponTransform;
    private Vector3 weaponInitialPosition = new Vector3(0.45f, -0.397f, 0.036f);
    private Vector3 weaponTargetPosition = new Vector3(0f, -0.39f, 0.036f);
    private float moveSpeed = 10f; 

    public GameObject bulletPrefab;
    public Transform bulletSpawnPoint;
    private float bulletSpeed = 20f;
    private Camera playerCamera;

    private float shootCooldown = 2f;
    private float lastShootTime;

    void Start()
    {
        weaponTransform = transform.Find("Weapon");

        if (weaponTransform != null)
            weaponTransform.localPosition = weaponInitialPosition;

        lastShootTime = -shootCooldown;

        if (isLocalPlayer)
        {
            NetworkClient.Ready();

            playerCamera = GetComponentInChildren<Camera>();
        }
    }

    void Update()
    {
        if (!isLocalPlayer) return;

        if (weaponTransform != null)
        {
            if (Input.GetMouseButton(1))
            {
                weaponTransform.localPosition = Vector3.Lerp(
                    weaponTransform.localPosition,
                    weaponTargetPosition,
                    Time.deltaTime * moveSpeed
                );
            }
            else
            {
                weaponTransform.localPosition = Vector3.Lerp(
                    weaponTransform.localPosition,
                    weaponInitialPosition,
                    Time.deltaTime * moveSpeed
                );
            }
        }

        if (Input.GetMouseButtonDown(0) && Time.time >= lastShootTime + shootCooldown)
        {
            lastShootTime = Time.time;

            Vector3 shootDirection = playerCamera.transform.forward;
            CmdShoot(shootDirection);
        }
    }

    [Command]
    void CmdShoot(Vector3 direction)
    {
        GameObject bullet = Instantiate(bulletPrefab, bulletSpawnPoint.position, bulletSpawnPoint.rotation);

        Bullet bulletScript = bullet.GetComponent<Bullet>();
        bulletScript.Initialize(direction, bulletSpeed);

        NetworkServer.Spawn(bullet);
    }
}

И код для пули:

using UnityEngine;

public class Bullet : MonoBehaviour
{
    private Vector3 direction;
    private float speed;
    private float lifetime = 5f; 

    [Server]
    public void Initialize(Vector3 dir, float spd)
    {
        direction = dir;
        speed = spd;
        Destroy(gameObject, lifetime); 
    }

    [ServerCallback]
    void Update()
    {
        transform.position += direction * speed * Time.deltaTime;
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
            return;

        Destroy(gameObject); 
    }
}
   

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