【问题标题】:Sync ParticleSystem across Clients and server, Unity3D跨客户端和服务器同步粒子系统,Unity3D
【发布时间】:2018-04-10 08:05:24
【问题描述】:

我正在尝试使用 unity 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 只能在服务器端工作,而不会在客户端被检测到。

有什么想法吗??

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

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

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

    所以你应该有自己的代码来决定是时候播放粒子了。当它执行时,它会通过命令告诉服务器。请注意,这应该在 Player 对象上 - 如果不是,您需要分配客户端权限。

    [Command]
    public void CmdStartParticles()
    {
    
    }
    

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

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

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

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

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

    【讨论】:

    • 感谢重播,您解释代码真的很有帮助,我非常感谢您的努力。但是您似乎总体上误解了这个想法。粒子系统不应该同时为所有客户端播放,它应该只为当前正在移动的玩家播放。在您的解释的帮助下,我设法让粒子只为移动的玩家播放。但是其他客户端看不到该播放器发出的粒子。就像主机没有将粒子同步到其他客户端一样。
    • 非常感谢,我得到了你的提示,已经完成了。非常感谢。
    【解决方案2】:

    撕掉Tanks Demo,我相信它可以通过播放粒子效果的引擎来移动东西。它可能有点过时了,但应该仍然有帮助。

    【讨论】:

    • 我会看看。
    猜你喜欢
    • 2015-06-02
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多