在 Unity 中拍摄时客户端断开连接(镜像)
Client disconnect when shooting in Unity (Mirror)
我正在使用 Mirror Networking 在 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);
}
我正在使用 Mirror Networking 在 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);
}