C# 跨客户端和服务器同步ParticleSystem,Unity3D

C# 跨客户端和服务器同步ParticleSystem,Unity3D,c#,unity3d,C#,Unity3d,我正在尝试使用unity 5.6.4p2和c#将单人游戏切换为多人游戏 我有两个粒子系统: “enginePS”设置为在所有侧面(客户端+服务器)出现的唤醒时播放 “EngineSpeeps”设置为在玩家向前移动时播放 第二个粒子系统不仅出现在向前移动的粒子系统中,因此其他粒子系统看不到该粒子系统 我是UNet的新手,因此我非常感谢您的帮助。请在下面检查我的代码: using UnityEngine; using UnityEngine.Networking; public class MP_

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

我有两个粒子系统:

  • “enginePS”设置为在所有侧面(客户端+服务器)出现的唤醒时播放
  • “EngineSpeeps”设置为在玩家向前移动时播放
  • 第二个粒子系统不仅出现在向前移动的粒子系统中,因此其他粒子系统看不到该粒子系统

    我是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]属性,但这使得EnginePeedps只能在服务器端工作,而不会在客户端被检测到


    有什么想法吗?

    好的,这样您的第二个EngineSpeeps可以在网络代码中被忽略-只需使用iClient或类似软件在客户端本地播放即可。它不需要通过网络

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

    所以你应该有自己的代码来决定是时候玩粒子了。当它这样做时,它会用命令通知服务器。注意,这应该在播放器对象上-如果不是,则需要分配客户端权限

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

    那么我们希望服务器做什么呢?它应该告诉所有客户端播放粒子,同时也播放粒子本身

    [ClientRpc]
    public void RpcStartParticles()
    {
        DoStartParticles();
    }
    
    public void DoStartParticles()
    {
        particles.Play();
    }
    
    第一个函数只能由服务器调用,它作用于所有连接的客户端。 第二个函数只是实际执行操作的简便方法


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

    剽窃,我相信它通过播放粒子效果的引擎移动东西。它可能有点过时了,但仍有帮助。

    我会看一看。感谢您的重播,您解释代码真的很有帮助,我非常感谢您的努力。但你似乎总体上误解了这个想法。粒子系统不应该同时为所有客户端播放,它应该只为当前正在移动的玩家播放。在你解释的帮助下,我设法让粒子为只移动的玩家播放。但其他客户无法看到该播放器中的粒子。它就像主机不同步粒子到其他客户端。非常感谢,我得到了你的线索,并完成了。非常感谢。