Unity 3D TR Forum

Orjinalini görmek için tıklayınız: Unity 2D multiplayer snake game prefabs sync sorunu
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Iyi calismalar. Unity'de yeniyim ve ogrenmek icin bir oyun yapmak istedim fakat sorunum su 2d snake game yaptim bunu mirror kutuphanesini kullanarak arkadaslarimla birlikte localhost'ta oynayacak hale getirdim fakat oyunu oynayan kisi diger rakiplerin(snake) sadece ilk kismi olan head kismini goruyor diger kisim olan tail kisminda sekronizasyon sorunu gibi bir sorun var nasil cozecegim konusunda bir cozum bulamadim yardimci olursaniz sevinirim.
Yapmak istedigim sey su iki oyuncununda asagidaki gorselde gorunen Player 1 gibi duzenli sekilde gozukmesini saglamak.

Olusan soruna ait goruntu 
[attachment=150]

Snake Prefabs ina yazdigim kod


Kod:
using Mirror;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class SnakeNetwork : NetworkBehaviour
{
   [SerializeField]
   private TMP_Text displayNameText = null;
   [SyncVar(hook = nameof(HandleDisplayNameUpdated))]
   [SerializeField]
   private string displayName = "Default Name";


   // baslangictaki varsayilan yon.
   private Vector2 _direction = Vector2.right;
   // her oyuncuya ait govde prefabs'i iceren liste.
   private List<Transform> _tailList = new List<Transform>();
   // component kisminda bana verilecen olan govde parcasi.
   public Transform _tailPrefab;
   // varsayilan ilk uzunluk degeri.
   public int initialSize = 4;

   // oyun baslangicinda tek seferlik calisan metot.
   void Start()
   {
       ResetGame();
   }

   // her frame'de calisan metot.
   void Update()
   {
       // oyuncu kendi oyununda kendine ait olan yilani oynatmasini saglar.
       if (isLocalPlayer) // Mirror.NetworkBehaviour dan gelen deger.
       {
           if (Input.GetKeyDown(KeyCode.UpArrow) && _direction != Vector2.down)
           {
               _direction = Vector2.up;
           }
           else if (Input.GetKeyDown(KeyCode.RightArrow) && _direction != Vector2.left)
           {
               _direction = Vector2.right;
           }
           else if (Input.GetKeyDown(KeyCode.DownArrow) && _direction != Vector2.up)
           {
               _direction = Vector2.down;
           }
           else if (Input.GetKeyDown(KeyCode.LeftArrow) && _direction != Vector2.right)
           {
               _direction = Vector2.left;
           }
       }
   }

   // edit > project settings > Time > fixed time stamp > 0.07f
   private void FixedUpdate()
   {
       // tail listesini tersten yazdirarak her bir degeri bir onceki degere aktariyorum bu sekilde ilerliyor.
       for (int i = _tailList.Count - 1; i > 0; i--)
       {
           _tailList[i].position = _tailList[i - 1].position;
       }
       this.transform.position = new Vector3(
           Mathf.Round(this.transform.position.x) + _direction.x,
           Mathf.Round(this.transform.position.y) + _direction.y,
           0.0f
           );
   }

   private void Grow()
   {
       // components kisminda bana verilen prefabs den ornek aliyorum.
       Transform tail = Instantiate(_tailPrefab);
       // yilani bir ile gonderiyorum.
       tail.position = _tailList[_tailList.Count - 1].position;
       // yilanin en son degerine yeni prefabs imi ekliyorum.
       _tailList.Add(tail);
   }

   // verdigim tag'lerde tetiklenme olursa
   private void OnTriggerEnter2D(Collider2D collision)
   {
       if (collision.tag == "Food")
       {
           Grow();
       }
       else if (collision.tag == "Obstacle")
       {
           ResetGame();
       }
   }

   public void ResetGame()
   {
       for (int i = 1; i < _tailList.Count; i++)
       {
           Destroy(_tailList[i].gameObject);
       }
       _tailList.Clear();
       _tailList.Add(transform);
       for (int i = 1; i < initialSize; i++)
       {
           _tailList.Add(Instantiate(_tailPrefab));
       }
       transform.position = Vector3.zero;
   }

   [Server]
   public void SetDisplayName(string newDisplayName)
   {
       displayName = newDisplayName;
   }

   [Command]
   private void CmdSetDisplayName(string newDisplayName)
   {
       SetDisplayName(newDisplayName);
   }

   private void HandleDisplayNameUpdated(string _, string newName)
   {
       displayNameText.text = newName;
   }


}