簡體   English   中英

鏡像(粒子系統)統一性問題,請幫助:)

[英]problem with mirror(particle system) unity, pls help:)

我的鏡子有問題,我正在制作一個在線策略游戲,你在游戲中有建築物,你可以用這些建築物制作士兵,現在這些建築物有一個粒子模擬器可以工作,同時它們可以制作更多的士兵,但只有服務器可以看到自己建築物和對手的粒子模擬,有什么想法嗎?

這是構建煙霧的代碼:

    #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;
    }

服務器 客戶

這並不是很有用,但我發現其他代碼可以幫助我解決這個問題,如果有人遇到同樣的問題,這里是解決方案: 解決方案

您需要制作一個 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;
    }

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM