【问题标题】:problem with mirror(particle system) unity, pls help:)镜像(粒子系统)统一性问题,请帮助:)
【发布时间】:2022-08-07 17:12:30
【问题描述】:

我的镜子有问题,我正在做一个在线策略游戏,你在游戏中有建筑,你可以用这些建筑来制造士兵,现在这些建筑有一个粒子模拟器可以工作,同时它们可以制造更多的士兵,但只有服务器可以看到自己建筑和对手的粒子模拟,有什么想法吗?

这是构建烟雾的代码:

    #region data
    [SerializeField] private ParticleSystem[] Explotion = new ParticleSystem[2];
    [SerializeField] private Unit UnitPrefab;
    [SerializeField] private Transform position;
    [SerializeField] private Health MyHp;

    [SerializeField] private Image ProgressBar = null;
    [SerializeField] private TMP_Text QuaeText = null;

   [SerializeField] private float QDurition = 5f;
   [SerializeField] private float SpaceSpawn = 7f;
   [SerializeField] private int QMax = 5;
   [SerializeField] private float progressImageVelocity = 2;
    bool played = false;
    [SyncVar(hook = nameof(UpdateQText))] private int QuadeUnits;
    [SyncVar] private float Timer = 0f;
    private ParticleSystem Smoke = null;
    private RTSPlayer player;
    private float QProgress;

    #endregion

    //[ServerCallback]
    private void UpdateQText(int OldQ,int NewQ)
    {
        QuaeText.text = NewQ.ToString();
    }
    

    private void Update()
    {
        if(Smoke == null)
        {
            Smoke = GetComponentInChildren<ParticleSystem>();
        }
        if(player == null)
        {
            player = NetworkClient.connection.identity.GetComponent<RTSPlayer>();
        }

        if (isServer)
        {
            ProduceUnits();
        }

        if (isClient)
        {
            UpdateTimer();
        }

        if(QuadeUnits <= 0)
        {
            QuadeUnits = 0;
            Timer = 0;
            QProgress = 0;
            ProgressBar.fillAmount = 0;
        }
    }

    [Server]
    private void ProduceUnits()
    {
        if(QuadeUnits == 0) 
        {
            try
            {
                Smoke.Stop();
            }
            catch
            {

            }
            played = false;
            return;
        }
        try
        {
            if (!played)
            {
                print(\"playing\");
                Smoke.Play();
                played = true;
            }
           
        }
        catch
        {

        }
        Timer += Time.deltaTime;
        if(Timer < QDurition) { return; }
        GameObject instance1 = Instantiate(UnitPrefab.gameObject, position.position, position.rotation);
        NetworkServer.Spawn(instance1, connectionToClient);
        Vector3 SpawnPlace = gameObject.transform.position * SpaceSpawn;
        SpawnPlace.y = 0;
        Movment ClearSpot = instance1.gameObject.GetComponent<Movment>();
        ClearSpot.ServerMoveUnit(SpawnPlace);
        instance1.gameObject.GetComponent<HPDispaly>().SetEnacled(false);
        QuadeUnits--;
        Timer = 0f;
    }

    标签: c# unity3d game-engine unity3d-mirror


    【解决方案1】:

    这并不是很有用,但我发现其他代码可以帮助我解决这个问题,如果有人遇到同样的问题,这里是解决方案: Solution

    您需要创建一个 syncVar bool 并使用它更新动画师,而不仅仅是常规的 false/true 调用,这是我的新代码:

          #region data
        [SyncVar(hook = nameof(HandleBuilding))] private bool IsBuildng = false;
        [SyncVar(hook = nameof(HandleExplotion))] private bool IsPlaying = false;
        [SerializeField] private ParticleSystem[] Explotion = new ParticleSystem[2];
        [SerializeField] private Unit UnitPrefab;
        [SerializeField] private Transform position;
        [SerializeField] private Health MyHp;
    
        [SerializeField] private Image ProgressBar = null;
        [SerializeField] private TMP_Text QuaeText = null;
    
       [SerializeField] private float QDurition = 5f;
       [SerializeField] private float SpaceSpawn = 7f;
       [SerializeField] private int QMax = 5;
       [SerializeField] private float progressImageVelocity = 2;
        bool played = false;
        [SyncVar(hook = nameof(UpdateQText))] private int QuadeUnits;
        [SyncVar] private float Timer = 0f;
       [SerializeField] private ParticleSystem Smoke = null;
        private RTSPlayer player;
        private float QProgress;
    
        #endregion
    
        //[ServerCallback]
        private void UpdateQText(int OldQ,int NewQ)
        {
            QuaeText.text = NewQ.ToString();
        }
        private void HandleBuilding(bool OldBool,bool NewBool)
        {
            Smoke.gameObject.SetActive(IsBuildng);
        }
    
        private void Update()
        {
            if(Smoke == null)
            {
                Smoke = GetComponentInChildren<ParticleSystem>();
            }
            if(player == null)
            {
                player = NetworkClient.connection.identity.GetComponent<RTSPlayer>();
            }
    
            if (isServer)
            {
                ProduceUnits();
            }
    
            if (isClient)
            {
                UpdateTimer();
            }
    
            if(QuadeUnits <= 0)
            {
                QuadeUnits = 0;
                Timer = 0;
                QProgress = 0;
                ProgressBar.fillAmount = 0;
            }
        }
    
        [Server]
        private void ProduceUnits()
        {
            if(QuadeUnits == 0) 
            {
                IsBuildng = false;
                played = false;
                return;
            }
            else
            {
                IsBuildng = true;
            }
            IsBuildng = true;
            Timer += Time.deltaTime;
            if(Timer < QDurition) { return; }
            GameObject instance1 = Instantiate(UnitPrefab.gameObject, position.position, position.rotation);
            NetworkServer.Spawn(instance1, connectionToClient);
            Vector3 SpawnPlace = gameObject.transform.position * SpaceSpawn;
            SpawnPlace.y = 0;
            Movment ClearSpot = instance1.gameObject.GetComponent<Movment>();
            ClearSpot.ServerMoveUnit(SpawnPlace);
            instance1.gameObject.GetComponent<HPDispaly>().SetEnacled(false);
            QuadeUnits--;
            Timer = 0f;
        }
    

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 2013-02-06
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      相关资源
      最近更新 更多