客户端的 Unity3D 网络射击循环
Unity3D Network Shooting Loop for Client
我想重现坦克! Unity 教程系列中的多人游戏。我也已经看过网络系列了。但是我在执行射击权时遇到了问题。坦克可以充电以增加子弹的发射力。它适用于主机,但客户端卡在触发中。
代码:
[ClientCallback]
private void Update()
{
if (!isLocalPlayer)
return;
if (m_CurrentLaunchForce >= MaxLaunchForce && !m_Fired)
{
m_CurrentLaunchForce = MaxLaunchForce;
Debug.Log("Max force achieved! Firing!");
CmdFire();
}
else if (Input.GetButtonDown("Fire1"))
{
m_Fired = false;
m_CurrentLaunchForce = MinLaunchForce;
Debug.Log("Start charging up!");
}
else if (Input.GetButton("Fire1") && !m_Fired)
{
m_CurrentLaunchForce += m_ChargeSpeed * Time.deltaTime;
Debug.Log("Charging up!");
}
else if (Input.GetButtonUp("Fire1") && !m_Fired)
{
Debug.Log("Firing with low force!");
CmdFire();
}
}
[Command]
private void CmdFire()
{
m_Fired = true;
Rigidbody shellInstance = Instantiate(ShellPrefab, FireTransform.position, FireTransform.rotation);
shellInstance.velocity = m_CurrentLaunchForce * transform.forward;
m_CurrentLaunchForce = MinLaunchForce;
NetworkServer.Spawn(shellInstance.gameObject);
m_Fired = false;
}
不是主机的客户端卡在第二个 if 情况下:
if (m_CurrentLaunchForce >= MaxLaunchForce && !m_Fired)
我检查了调试器中的变量,currentLaunchForce 从未重置为 minLaunchForce。
我自己找到了解决方案。我实现了另一个函数 "fire()",它首先从 Update 函数调用,然后再次调用命令 "cmdfire()"。在开火命令中,我重置了变量,在命令中,我只是告诉服务器以力作为参数为所有客户端生成射弹。
private void fire()
{
m_Fired = true;
CmdFire(m_CurrentLaunchForce);
m_CurrentLaunchForce = MinLaunchForce;
m_Fired = false;
startReloadTime();
}
private void CmdFire(float launchForce)
{
Rigidbody bulletInstance = Instantiate(BulletPrefab, FireTransform.position, FireTransform.rotation);
bulletInstance.velocity = launchForce * transform.forward;
NetworkServer.Spawn(bulletInstance.gameObject);
}
似乎如果你使用某些变量来检查客户端的某些条件,你也必须在客户端自己重新设置它们,就像我的情况一样:
private float m_CurrentLaunchForce;
private bool m_Fired;
然后告诉服务器使用力、位置、旋转等选项作为函数参数生成您的对象以验证它们,具体取决于您对作弊的关注程度。
我想重现坦克! Unity 教程系列中的多人游戏。我也已经看过网络系列了。但是我在执行射击权时遇到了问题。坦克可以充电以增加子弹的发射力。它适用于主机,但客户端卡在触发中。
代码:
[ClientCallback]
private void Update()
{
if (!isLocalPlayer)
return;
if (m_CurrentLaunchForce >= MaxLaunchForce && !m_Fired)
{
m_CurrentLaunchForce = MaxLaunchForce;
Debug.Log("Max force achieved! Firing!");
CmdFire();
}
else if (Input.GetButtonDown("Fire1"))
{
m_Fired = false;
m_CurrentLaunchForce = MinLaunchForce;
Debug.Log("Start charging up!");
}
else if (Input.GetButton("Fire1") && !m_Fired)
{
m_CurrentLaunchForce += m_ChargeSpeed * Time.deltaTime;
Debug.Log("Charging up!");
}
else if (Input.GetButtonUp("Fire1") && !m_Fired)
{
Debug.Log("Firing with low force!");
CmdFire();
}
}
[Command]
private void CmdFire()
{
m_Fired = true;
Rigidbody shellInstance = Instantiate(ShellPrefab, FireTransform.position, FireTransform.rotation);
shellInstance.velocity = m_CurrentLaunchForce * transform.forward;
m_CurrentLaunchForce = MinLaunchForce;
NetworkServer.Spawn(shellInstance.gameObject);
m_Fired = false;
}
不是主机的客户端卡在第二个 if 情况下:
if (m_CurrentLaunchForce >= MaxLaunchForce && !m_Fired)
我检查了调试器中的变量,currentLaunchForce 从未重置为 minLaunchForce。
我自己找到了解决方案。我实现了另一个函数 "fire()",它首先从 Update 函数调用,然后再次调用命令 "cmdfire()"。在开火命令中,我重置了变量,在命令中,我只是告诉服务器以力作为参数为所有客户端生成射弹。
private void fire()
{
m_Fired = true;
CmdFire(m_CurrentLaunchForce);
m_CurrentLaunchForce = MinLaunchForce;
m_Fired = false;
startReloadTime();
}
private void CmdFire(float launchForce)
{
Rigidbody bulletInstance = Instantiate(BulletPrefab, FireTransform.position, FireTransform.rotation);
bulletInstance.velocity = launchForce * transform.forward;
NetworkServer.Spawn(bulletInstance.gameObject);
}
似乎如果你使用某些变量来检查客户端的某些条件,你也必须在客户端自己重新设置它们,就像我的情况一样:
private float m_CurrentLaunchForce;
private bool m_Fired;
然后告诉服务器使用力、位置、旋转等选项作为函数参数生成您的对象以验证它们,具体取决于您对作弊的关注程度。