Unity Network Hakkında Soru

      Unity Network Hakkında Soru

      Merhabalar.

      Unity network (eski sistem) ile bir oyun yaptım. Oyunda 10 k poligon var ve yazılım stabil. Sorunu şöyle anlatim

      A telefonunda tek başınayken oyun kaymak gibi akıcı oluyor. Oyuna b telefonu bağlandığı zaman ise a telefonunda bu bağlanan kişi kasarak ilerliyor ancak kendisi hiç kasmadan ilerliyor. Aynı konu diğer telefon içinde geçerli. Kendisi hariç diğerleri kasarak ilerliyorlar.

      Bunun çözümü için ne yapabilirim önerileriniz nedir ? sendrate ile oynadım çoğunu denedin en sonunda 250 yaptım. Onun dışında stabil olması için ne yapmam lazım.

      Ek olarak bir soru daha. Ben unity network'ü tamamen ücretsiz biliyordum. Hangi telefonda server kurarsan cs serverları gibi sadece o telefon sunucu oluyor biliyordum ancak unity network'ün 20ccu ya kadar ücretsiz olduğunu duydum. Bu doğru mudur ?

      Post was edited 1 time, last by “cani23” ().

      freedream wrote:

      Transform konum güncellemesini değişiklik bildirim mesafesini düşürün. ilgili değişikliği NetworkTransform komponentinin ayarlar kısmında yapabilirsiniz.


      hocam networktransform kullanmıyorum sanırım network transform yeni network sistemi ile kullanılıyor ben eski sistem ile yaptım.

      Post was edited 1 time, last by “cani23” ().

      Lerp'teki değerin biraz fazla gibime geldi. Her yerde aynı hızla çalışması açıısından Time.deltaTime'a bağlarsan daha iyi olur.

      Source Code

      1. transform.position = Vector3.Lerp(transform.position, syncEndPosition, Time.deltaTime * 10);
      2. transform.rotation = Quaternion.Lerp(transform.rotation, syncEndRotation, Time.delataTime * 10);


      yaparsan daha düzgün çalışacaktır. Yavaş ilerlerse de 10'dan daha yüksek bir sayı ile çarp.

      gameover wrote:

      Lerp'teki değerin biraz fazla gibime geldi. Her yerde aynı hızla çalışması açıısından Time.deltaTime'a bağlarsan daha iyi olur.

      Source Code

      1. transform.position = Vector3.Lerp(transform.position, syncEndPosition, Time.deltaTime * 10);
      2. transform.rotation = Quaternion.Lerp(transform.rotation, syncEndRotation, Time.delataTime * 10);


      yaparsan daha düzgün çalışacaktır. Yavaş ilerlerse de 10'dan daha yüksek bir sayı ile çarp.


      hocam buraya yazmadan önce öyleydi ben buraya göndermeden önce 0.5 yapmıştım :) Yani yine pek birşey değişmiyor. Dediğim gibi oyuncu kendi ekranında kendisi hiç kasmıyor ama diğer oyuncu kasıyor gibi görünüyor
      Arkadaşlar bir sorum daha olacak. Ben server'ı kendi sunucuma kurmak istiyorum. Yani telefonlar kendisi server olmak yerine benim kendi sunucum server olacak. Telefonlardan yine oda aç butonu olacak. Oda aç dendiğinde benim sunucuya istek göndereceğim. Ancak takıldığım bir yer var. Bu olayın mantığı nedir onu kavrayamadım. Her sunucuda 1 tane server açılabiliyor ip/port mevzusundan olayı. Acaba server'i açıp her oda için başka scene mi açtırmam lazım ? Yoksa tüm oyuncuları 1 sahnede tutup her oda oyuncularını birbirine görünmez mi yapmam lazım (bu çok kasar gibi)

      Post was edited 1 time, last by “cani23” ().

      Shevy wrote:

      Portlari farkli actirirsan kurarsin.Bunun icin bir sistem gerekiyor istek yolladiginda bos port numarasini bulup o portu kullanicak.


      Farkli portlarla acildigini bilmiyordum hocam o zaman farkli portlar ile halledebilirim. Ben su sekilde dusunmustum. Herkes tek serverda ve bir sahnede oynayacak ama her oyuncu bu sahnede yalnizca 10 kisiyi gorecek diger oyuncularin objeleri false olacak. Sanirim bu sekilde cok kasma yapar. Sizce farkli port mu yoksa benim dusundugum mu mantiklidir hocam

      Shevy wrote:

      Birbirini gormemek isi biraz skintili olur bence servera her sekilde yuk binecek.Farkli port acilmasi daha mantikli geliyor bence.


      Hocam şu an deniyorum farklı portlar ile server oluşturuyorum ancak yeni server açarken eskisi masterserver listesinden siliniyor. Yani farklı portlar ile bir kaç server açamıyorum acaba sıkıntı benim yazılımımda mı ?

      Sanırım 2. server'ı açınca server'ı açtığı gibi otomatik olarak connect oluyor bu yüzden bir önceki portlu server siliniyor. Yardımcı olabilir misiniz rica etsem
      Unity'nin kendi master serverini daha once kullanmadim kendi master server'imi yazmistim acikcasi eski network'u kullaniyordun onu hatirlamiyorum pek yanliz onun desteklenmeme gibi bir olaylari vardi onla yayinlayamiyorsun gibi bir arastir derim uNet ile Server Only acilabiliyor yani sadece serveri kurmus oldugu icin Client'e ip + portu girince veya master serverdan gorebilirsin tahinimce.
      Arkadaşlar iki sorum daha olacak. Eski unity network sisteminden unet e geçmek durumunda kaldım. Önceden aşağıdaki şekilde int ve float gibi değişkenleri tüm oyunculara gönderebiliyordum ancak şimdi bu çalışmıyor. Nasıl bir yol izlemeliyim ?

      Source Code

      1. void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
      2. {
      3. if (stream.isWriting)
      4. {
      5. stream.Serialize(ref hp);
      6. }
      7. else
      8. {
      9. stream.Serialize(ref hp);
      10. }
      11. }


      İkinci soru olarak ise şöyle sorayım. Single olarak oynarken aşağıdaki koddada görüldüğü üzere tıklanan objenin tagı oyuncu ise o obje rakip olarak tanımlanıyor. Ancak unet'te oynarken yalnızca o oyuncuda rakip tanımlanırken diğer oyuncularda tanımlanmıyor ve boş kalıyor. Yani diğer oyunculara rakip değişkeni bilgisini göndermiyor. Bunları nasıl yapabilirim

      Source Code

      1. public Transform rakip;
      2. void Update()
      3. {
      4. if (Input.GetMouseButton(0))
      5. {
      6. SetRakip();
      7. }
      8. }
      9. void SetRakip()
      10. {
      11. if (Physics.Raycast(ray, out select, Mathf.Infinity))
      12. {
      13. if (select.transform.tag == "Oyuncu")
      14. {
      15. rakip = select.transform;
      16. }
      17. }
      18. }
      Eskisinde kullandigin gibi bundada RPC kullanman gerekiyor extra olarak Command yeniydi yanlis hatirlamiyorsam:
      Command: Client'den Server'a bilgi yollamak icin.
      RPC: Server'dan Client'lere bilgi yollamak icin.

      NetworkIdentity'de netID olmasi lazim.Link'i: docs.unity3d.com/ScriptReferen…etworkIdentity-netId.html
      NetworkInstanceId myID; tarzinda taniplayip objenin myID = GetComponent<NetworkIdentity>().netID; seklinde aldiktan sonra Command ile yollamalisin.Ornek fonksiyonlar:

      Source Code

      1. [Command]
      2. void CmdSendMyHealth(NetworkInstanceId id,float health){
      3. //Network Identity olan tum objeleri buldu.
      4. NetworkIdentity[] getAll = GameObject.FindObjectsOfType<NetworkIdentity>();
      5. for(int i = 0;i < getAll.length;i++){
      6. //ID ayni olan obje bulundu
      7. if(getAll[i].netID == id){
      8. getAll[i].GetComponent<Health>().currHealth = health;
      9. //Serverda cagirdigin icin tum clientlere bilgiyi yolladin.
      10. RpcSendMyHealth(id,health);
      11. }}}


      Source Code

      1. [ClientRPC]
      2. void RpcSendMyHealth(NetworkInstanceId Theid,float health){
      3. //Network Identity olan tum objeleri buldu.
      4. NetworkIdentity[] getAll = GameObject.FindObjectsOfType<NetworkIdentity>();
      5. for(int i = 0;i < getAll.length;i++){
      6. //ID ayni olan obje bulundu
      7. if(getAll[i].netID == Theid){
      8. getAll[i].GetComponent<Health>().currHealth = health;
      9. }}}

      CmdSendMyHealth'i cagirdin Server'a yolladin server tum client'e yollamis oldu sadece belirtigin id'deki kisi icin.
      Bu arada Prefix oldugu icin Rpc veya Cmd kullanman gerekiyor.SyncVar ve List olarakta senkronize oluyordu incele derim.
      unity3d.com/learn/tutorials/to…yer-health?playlist=29690
      Sitesinde guzel kaynaklar var.Kodlari denemedim elden yazdim duzeltmen gerekebilir.