微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Unity镜像中拍摄时客户端断开连接

如何解决在 Unity镜像中拍摄时客户端断开连接

我正在 Unity 中使用镜像网络制作在线多人游戏。 在这个脚本中,我试图通过从客户端调用服务器上的命令( CmdFire() )来射击子弹,该命令使用玩家相机的旋转从射击位置实例化一个射弹。我遇到的问题是,当我尝试从客户端机器发射子弹时,他会断开连接,如果主机尝试发射子弹,客户端将无法看到。 这是我的代码

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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。