在客户端和服务器Unity3D上同步ParticleSystem

时间:2018-04-10 08:05:24

标签: c# unity3d

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

我有两个粒子系统:

  1. " enginePS"设置为播放on-wake,出现在所有方面(cliens +服务器)。
  2. " engineSpeedPS"当玩家向前移动时,它会发挥作用。
  3. 第二个粒子系统不仅仅出现在向前移动的本地玩家,因此其他人看不到粒子系统。

    我是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仅在服务器端工作而未在客户端检测到。

    任何想法??

2 个答案:

答案 0 :(得分:1)

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

我将谈论设置你想要在任何地方播放的其他ParticleEffect。它位于Client对象上,表示该对象由客户端控制。客户端应该告诉服务器它是时候播放粒子,然后服务器告诉所有其他连接的客户端。 粒子可能不应该在清醒时播放,因为每个人都会在不同的时间醒来。

因此,您应该拥有自己的代码来决定播放粒子的时间。当它这样做时,它告诉服务器一个命令。请注意,这应该在Player对象上 - 如果不是,您需要分配客户端权限。

[Command]
public void CmdStartParticles()
{

}

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

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

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

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

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

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

答案 1 :(得分:0)

扯掉Tanks Demo,我认为它可以通过播放粒子效果的引擎移动。它可能是一个过时的,但应该仍然有用。