Sticky Unity Network

      Unity Network

      Paladin Studios'un ornek Network dersinden NetworkManager scripti bu script Lobby sistemi ile ilgili oda kurup veya odaya katilmaya yariyor.
      Kaynak ve ornek proje icin: paladinstudios.com/2013/07/10/…tiplayer-game-with-unity/
      Ingilizce olarakta yapilan islemleri anlatmaktadir.

      Source Code

      1. using UnityEngine;
      2. using System.Collections;
      3. public class NetworkManager : MonoBehaviour
      4. {
      5. private const string typeName = "UniqueGameName";
      6. private const string gameName = "RoomName";
      7. private bool isRefreshingHostList = false;
      8. private HostData[] hostList;
      9. public GameObject playerPrefab;
      10. void OnGUI()
      11. {
      12. if (!Network.isClient && !Network.isServer)
      13. {
      14. if (GUI.Button(new Rect(100, 100, 250, 100), "Start Server"))
      15. StartServer();
      16. if (GUI.Button(new Rect(100, 250, 250, 100), "Refresh Hosts"))
      17. RefreshHostList();
      18. if (hostList != null)
      19. {
      20. for (int i = 0; i < hostList.Length; i++)
      21. {
      22. if (GUI.Button(new Rect(400, 100 + (110 * i), 300, 100), hostList[i].gameName))
      23. JoinServer(hostList[i]);
      24. }
      25. }
      26. }
      27. }
      28. private void StartServer()
      29. {
      30. Network.InitializeServer(5, 25000, !Network.HavePublicAddress());
      31. MasterServer.RegisterHost(typeName, gameName);
      32. }
      33. void OnServerInitialized()
      34. {
      35. SpawnPlayer();
      36. }
      37. void Update()
      38. {
      39. if (isRefreshingHostList && MasterServer.PollHostList().Length > 0)
      40. {
      41. isRefreshingHostList = false;
      42. hostList = MasterServer.PollHostList();
      43. }
      44. }
      45. private void RefreshHostList()
      46. {
      47. if (!isRefreshingHostList)
      48. {
      49. isRefreshingHostList = true;
      50. MasterServer.RequestHostList(typeName);
      51. }
      52. }
      53. private void JoinServer(HostData hostData)
      54. {
      55. Network.Connect(hostData);
      56. }
      57. void OnConnectedToServer()
      58. {
      59. SpawnPlayer();
      60. }
      61. private void SpawnPlayer()
      62. {
      63. Network.Instantiate(playerPrefab, Vector3.up * 5, Quaternion.identity, 0);
      64. }
      65. }


      Scriptteki fonksiyon bilgileri:
      OnServerInitialized - Oda kuran oyuncu server yuklendiginde yapilacak islemleri gerceklestirir.
      OnConnectedToServer - Bu fonksiyon ise server katilan clientlerin server yuklediginde yapilacak islemleri gerceklestirir.
      SpawnPlayer - OnServerInitialized ve OnConnectedToServer altinda cagrildigindan anlasilacagi uzere servera baglanildiginda belirlenen playerPrefab'in sahneye spawnlanmasi icin olusturulmus oldugu gorulmekte.
      RefreshHostList - Master Server'a kayit ettirilen odalari goruntuleyip acilan odalari GUI.Button'a tiklayarak baglanilmasi icin olusturulmustur.
      JoinServer - Anlasilacagi uzere ustde bahsettigimiz GUI.Button'a basilinca baglanilacak odaya baglanma islemini yapar.
      StartServer - Bu fonksiyonda odamizin ipi ve portunu master servera kayit ettiririz.

      Not:playerPrefab'in uzerinde NetworkView Componenti ekli olmalidir bu scriptin bulundugu objedede.

      Kendi MasterServeriniz ilede yapabilirsiniz bazen Unity'nin kendisininki cokmus veya cok kalabalik oluyor o yuzden yukardaki scripte:

      Source Code

      1. void Start(){
      2. MasterServer.ipAddress = “127.0.0.1″;
      3. }

      ekleyin.
      Master serveri kurmak icin unity3d.com/master-server/ siteden MasterServer'i indirin fakat Visual Studio olmadan build alinmiyor o yuzden ben buildledigimide ekledim:
      Facebook'a yukledigim icin bu kadar uzun oldu :) 362KB bir dosya.
      cdn.fbsbx.com/hphotos-xpf1/v/t…eb123824&oe=55CD612C&dl=1
      Not:MasterServer'i acmadan Start Server dediginizde Master Server'a baglanamadigi icin bulamiyacak ve arkadaslarinizla test edeceginiz zaman:
      MasterServer.ipAddress = “127.0.0.1″; //local ip kendi pcinizde deneyeceginiz zaman sizde olanda bu olmali
      MasterServer.ipAddress = “88.xxx.xxx.xxx″; //external ip olmali farkli pcden baglanilacagi zaman master server'daki kayitli odalari gorebilmek icin

      RPC modlarina gelelim:
      RPCMode.Server = Cagrilan RPC fonksiyonunu sadece sunucuya yollar.
      RPCMode.Others = Yine cagrilan RPC fonksiyonun sadece sunucuya yollar gonderen disinda.
      RPCMode.OthersBuffered = Gonderen disinda herkese yollar.
      RPCMode.All - Herkese yollar.
      RPCMode.AllBuffered - Herkese yollar.

      Not:Buffered olanlar sonradan odaya sonradan dahil olan oyunculara yollanmakta kullaniliyor.

      Ornek bir RPC fonksiyonu ve cagrilma sekli

      Source Code

      1. void Update(){
      2. if(Input.GetKey(KeyCode.W)){
      3. GetComponent<NetworkView>().RPC("testRPC",RPCMode.AllBuffered);
      4. }}
      5. [RPC] void testRPC(){
      6. print("Test!");
      7. }


      RPC'li fonksiyonlara cesitli degiskenler gonderilebilir bunlar:
      • int
      • float
      • string
      • NetworkPlayer
      • NetworkViewID
      • Vector3
      • Quaternion
      int ile ornek olarak:

      Source Code

      1. void Update(){
      2. if(Input.GetKey(KeyCode.W)){
      3. GetComponent<NetworkView>().RPC("testRPC",RPCMode.AllBuffered,2);
      4. }}
      5. [RPC] void testRPC(int myNumber){
      6. print(myNumber.ToString());
      7. }


      playerPrefab'a NetworkView'i eklemis oldugumuzu varsayarak Rigidbody'de ekliyoruz ve yine PaladinStudios ornek projesindeki State Synchronization smooth hareket etmesi icin gerekli olan bir sistem.Ayrica scripte renk degistirme RPC'si var ornek olarak incelenebilir.

      Source Code

      1. using UnityEngine;
      2. using System.Collections;
      3. public class Player : MonoBehaviour
      4. {
      5. public float speed = 10f;
      6. private float lastSynchronizationTime = 0f;
      7. private float syncDelay = 0f;
      8. private float syncTime = 0f;
      9. private Vector3 syncStartPosition = Vector3.zero;
      10. private Vector3 syncEndPosition = Vector3.zero;
      11. void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
      12. {
      13. Vector3 syncPosition = Vector3.zero;
      14. Vector3 syncVelocity = Vector3.zero;
      15. if (stream.isWriting)
      16. {
      17. syncPosition = rigidbody.position;
      18. stream.Serialize(ref syncPosition);
      19. syncPosition = rigidbody.velocity;
      20. stream.Serialize(ref syncVelocity);
      21. }
      22. else
      23. {
      24. stream.Serialize(ref syncPosition);
      25. stream.Serialize(ref syncVelocity);
      26. syncTime = 0f;
      27. syncDelay = Time.time - lastSynchronizationTime;
      28. lastSynchronizationTime = Time.time;
      29. syncEndPosition = syncPosition + syncVelocity * syncDelay;
      30. syncStartPosition = rigidbody.position;
      31. }
      32. }
      33. void Awake()
      34. {
      35. lastSynchronizationTime = Time.time;
      36. }
      37. void Update()
      38. {
      39. if (networkView.isMine)
      40. {
      41. InputMovement();
      42. InputColorChange();
      43. }
      44. else
      45. {
      46. SyncedMovement();
      47. }
      48. }
      49. private void InputMovement()
      50. {
      51. if (Input.GetKey(KeyCode.W))
      52. rigidbody.MovePosition(rigidbody.position + Vector3.forward * speed * Time.deltaTime);
      53. if (Input.GetKey(KeyCode.S))
      54. rigidbody.MovePosition(rigidbody.position - Vector3.forward * speed * Time.deltaTime);
      55. if (Input.GetKey(KeyCode.D))
      56. rigidbody.MovePosition(rigidbody.position + Vector3.right * speed * Time.deltaTime);
      57. if (Input.GetKey(KeyCode.A))
      58. rigidbody.MovePosition(rigidbody.position - Vector3.right * speed * Time.deltaTime);
      59. }
      60. private void SyncedMovement()
      61. {
      62. syncTime += Time.deltaTime;
      63. rigidbody.position = Vector3.Lerp(syncStartPosition, syncEndPosition, syncTime / syncDelay);
      64. }
      65. private void InputColorChange()
      66. {
      67. if (Input.GetKeyDown(KeyCode.R))
      68. ChangeColorTo(new Vector3(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f)));
      69. }
      70. [RPC] void ChangeColorTo(Vector3 color)
      71. {
      72. renderer.material.color = new Color(color.x, color.y, color.z, 1f);
      73. if (networkView.isMine)
      74. networkView.RPC("ChangeColorTo", RPCMode.OthersBuffered, color);
      75. }


      Not:rigidbody olarak calismaz ise GetComponent<Rigidbody> olarak deneyiniz.

      Yukardaki scriptte en dikkat ceken kisim:

      Source Code

      1. if (networkView.isMine)
      2. networkView.RPC("ChangeColorTo", RPCMode.OthersBuffered, color);
      3. }

      Neden cunku networkView.isMine eger bu kisim olmasaydi herkesin rengi tusa basilmasiyla degistirilecekti "mine" kelime anlami olarakta benim anlamina geldigi icin tusa basildiginda sadece bize ait olan kupun rengi degismis olacak.Eger kamerali bir prefab spawnlanacaksa kesinlikle prefabin icindeki kameraya networkview eklenmeli ve networkView.isMine ile kontrol edilmeli aksi taktirde diger oyuncunun kamerasindan goruyorsun harekettede bu gecerli diger oyuncunun prefabini hareket ettiriyorsunuz.
      Ornegin kamera icin:

      Source Code

      1. if(GetComponent<NetworkView>().isMine){
      2. GetComponent<Camera>().enabled = true;
      3. }else{
      4. GetComponent<Camera>().enabled = false;
      5. }

      Not:networkView.isMine calismas ise GetComponent<NetworkView>().isMine olarak deneyin.Simdilik bu kadar ilerleyen zamanlarda ornekler ile devam edecegim anlatmaya hatamiz varsa af ola.

      Post was edited 2 times, last by “Shevy” ().

      Merhaba ufak çapta bir multiplayer oyun yaptım .Oynu kendi bilgisayarımda çalıştırdım(exe ve unity'de sorunsuz çalıştı, bağlandı ikisi de), daha sonra dosyaları farklı pcye attım, ancak sol altta text içinde(ConnectionDetaili gösteren yer) "peer created unity" yazıyor ve kalıyor.Nedenini bilen ya da böyle bi sorunla karsılasan var mı?Farklı ıp adreslerinden baglanabiliyor muyuz Photon Networking Free ile ? Yardımlarınızı bekliyorum ,şimdiden teşekkürler...
      Merhaba oncellikle bu konu Photon ile ilgili degil RakNet Unity'nin kendi Networking ile ilgili daha sonra yeni surumunde yenilediler bildigim kadariyla.Photon hakkinda bilgi sahibi degilim ama eger 192.168.1.2 veya 127.0.0.1 gibi baglanti yapiliyorsa baska bir internetten oyununuza girilmez.External IP'nizi yazmaniz gerekmekte.http://www.ipimne.com/ gibi sitelerinden gozukuyor arkadasiniz size ait bu ip ile baglanmayi denesin siz sizin bilgisayarinizdan acin bu siteden ogrenin ona attin o da bunla baglanmayi denesin tahminimce oyledir iyi calismalar.