簡體   English   中英

在 Unity(鏡像)中拍攝時客戶端斷開連接

[英]Client disconnect when shooting in Unity (Mirror)

我正在使用 Mirror Networking 在 Unity 中制作在線多人游戲。 在這個腳本中,我試圖通過從客戶端調用服務器上的命令( CmdFire() )來發射子彈,該命令使用玩家相機的旋轉從 position 實例化射彈。 我遇到的問題是,當我嘗試從客戶端機器射擊子彈時,他斷開連接,如果主機嘗試射擊彈丸,客戶端看不到。 這是我的代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
public class Shooter : NetworkBehaviour
{
public GameObject projectilePrefab;
public Transform shootPos;
public Camera playerCamera;
bool canShoot = true;
public AudioSource shotSound;
[Command]
void CmdFire()
{
     GameObject projectile = Instantiate(projectilePrefab, shootPos.position, playerCamera.transform.rotation);
     NetworkServer.Spawn(projectile);
    
}

// Update is called once per frame
void Update()
{
    if (!hasAuthority) return;
    
    if (Input.GetButton("Fire1"))
    {
        if (canShoot)
        {
            canShoot = false;

            GenerateRayCast();
            CmdFire();

            StartCoroutine(FireDelay());
            shotSound.Play();
        }

    }
}
Transform GenerateRayCast()
{
    playerCamera = transform.Find("CameraMountPosition").Find("Camera").GetComponent<Camera>();

    Ray ray = new Ray(shootPos.transform.position, playerCamera.transform.forward * 500);
    Debug.DrawRay(shootPos.transform.position, playerCamera.transform.forward * 500, Color.red, 2f);
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit))
    {
        Debug.LogError("SERVER: Player shot: " + hit.collider.name);

        if (hit.collider.CompareTag("Player"))
        {
           //deal damage 
        }

    }
    return hit.transform;

}
// Cooldown before shooting again
IEnumerator FireDelay()
{
    yield return new WaitForSeconds(2);
    canShoot = true;
}
}

我最終改變了玩家發射彈丸的整個方式。

首先,我避免使用玩家相機來了解生成彈丸的方向,並且我使用了另一個游戲對象,它基本上具有與相機相同的行為,但它被放置在玩家預制件中。

我做的另一件事是使用非網絡身份射彈。 所以我在客戶端和服務器中都生成了彈丸。

void Fire()
{
    if (!base.hasAuthority) return;

    //if is client spawn on here
    if (!base.isServer)
    {
        Projectile p = Instantiate(projectilePrefab, shootPos.position, shootPos.rotation);
    }

    //spawn on the server
    CmdFire(shootPos.position, shootPos.rotation);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM