繁体   English   中英

在客户端和服务器,Unity3D之间同步ParticleSystem

[英]Sync ParticleSystem across Clients and server, Unity3D

我正在尝试使用统一5.6.4p2和c#将单人游戏切换为多人游戏。

我有两个粒子系统:

  1. “ enginePS”设置为在各个方面(客户端+服务器)上出现的唤醒状态。
  2. 设置为当玩家向前移动时播放的“ engineSpeedPS”。

第二种粒子系统不会仅对本地玩家一个向前出现,因此其他人不会看到该粒子系统。

我是UNet的新手,非常感谢您的帮助。 请在下面检查我的代码:

using UnityEngine;
using UnityEngine.Networking;

public class MP_PlayerController : NetworkBehaviour
{
public ParticleSystem enginePS1, enginePS2, engineSpeedPS1, engineSpeedPS2, 
engineSpeedPS3;

private float verticalCurrentValue;
private float movingX, movingZ;

private bool zAxis;
public bool isMovingForward = false;
public bool isMovingBackward;

public float currentPossition;

public GameObject player;

void Start()
{
    engineSpeedPS1.Stop();
    engineSpeedPS2.Stop();
    engineSpeedPS3.Stop();

    verticalCurrentValue = movingZ;

    currentPossition = transform.position.z;
}
void Update()
{
    if (!isLocalPlayer)
    {
        return;
    }

    movingX = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;
    movingZ = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;

    transform.Rotate(0, movingX, 0);
    transform.Translate(0, 0, movingZ);

    ChangeEngineParticle();
}

void ChangeEngineParticle()
{
    if(!isLocalPlayer)
    {
        return;
    }

    if (Input.GetKey("up"))
    {
        if (isMovingForward == false)
            isMovingForward = true;
    }
    else
    {
        if (isMovingForward == true)
            isMovingForward = false;
    }

    if (isMovingForward)
    {
        if (!engineSpeedPS1.isPlaying)
        {
            engineSpeedPS1.Play();
            engineSpeedPS2.Play();
            engineSpeedPS3.Play();
        }
    }
    else if (isMovingForward == false)
    {
        if (engineSpeedPS1.isPlaying)
        {
            engineSpeedPS1.Stop();
            engineSpeedPS2.Stop();
            engineSpeedPS3.Stop();
        }
    }
}

我尝试在CmdChangeEngineParticle()之前使用[Command]属性,但这使engineSpeedPS只能在服务器端工作,而不会在客户端被检测到。

有任何想法吗??

好的,因此您的第二个engineSpeedPS可以在网络代码中忽略-只需使用isClient或类似功能在客户端本地播放即可。 它不需要通过网络。

我将只讨论设置另一个您想在任何地方播放的粒子效果。 它在Client对象上,这意味着该对象由客户端控制。 客户端应告诉服务器该播放粒子了,然后服务器告诉所有其他连接的客户端。 粒子可能不应该在清醒时播放,因为每个人都会在不同的时间醒来。

因此,您应该拥有自己的代码来决定播放粒子的时间。 完成后,它将通过命令告诉服务器。 请注意,这应该在Player对象上-否则,您需要分配客户权限。

[Command]
public void CmdStartParticles()
{

}

因此,负责客户调用CmdStartParticles()。 [Command]标记意味着它不会在本地执行,而是在服务器上执行。

那么我们要服务器做什么? 它应该告诉所有客户播放粒子,并自己播放。

[ClientRpc]
public void RpcStartParticles()
{
    DoStartParticles();
}

public void DoStartParticles()
{
    particles.Play();
}

第一个功能只能由服务器调用,并且作用于所有连接的客户端。 第二个功能只是实际操作的便捷方式

在CmddStartParticles函数中,您将只调用RpcStartParticles()和DoStartParticles()(因为您希望服务器也播放它们,而RpcStartParticles仅影响客户端)。

窃听Tanks演示 ,我相信它可以通过播放粒子效果的引擎来推动事情发展。 这可能有点过时了,但仍应有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM