Hey merhaba ziyaretçi bize destek olmak ister misin ? Hemen Kayıt Ol Seni hiç sıkmadan kayıt edeceğiz endişelenmek bize destek olduğun için teşekkürler.



  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Unity 2D multiplayer snake game prefabs sync sorunu
#1
Bug 
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 
   

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


}
  Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Question Vuforia 3D Nesnesinin Sabit Kalma Sorunu cverf127 0 57 05-01-2022, Saat: 01:44
Son Yorum: cverf127
  Unity - 2 Nokta Arasına Obje Spawnlama Scofailed 3 2,284 25-12-2021, Saat: 14:58
Son Yorum: Koala
Wink Farklı cihazlarda görüntülenme sorunu CafeBull 0 72 18-12-2021, Saat: 18:45
Son Yorum: CafeBull
Sad Objeyi İleri Hareket Ettirme Sorunu FurkanSafa 0 139 11-12-2021, Saat: 12:00
Son Yorum: FurkanSafa
Question Unity araç sesi Hals45 1 194 26-08-2021, Saat: 18:38
Son Yorum: TheTudors

Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi