Главная » Статьи » Unity3D Multiplayer

Урок 5. Мультиплеер в StarTrooper. Клиент Сервер. MasterServer

Самое время приступить к написанию сервера для этой игры, сегодня мы напишем тип соединения MasterServer/Client. Мы создадим три типа сервера.

1) Создайте новую сцену и назовите его ServerChoose: File->New Scene, File->Save Scene. Это сцена предназначена для выбора типа сервера.

2) Создайте новую сцену – UDPServer. Эта сцена будет использовать UDP Broadcast соединение.

3) Создайте новую сцену – MasterServer. Эта сцена будет использовать MasterServer соединение.

4) Еще раз создайте новую сцену - EmptyScene. Эта сцена будет загружаться, когда пользователь отсоединиться и попробует соединиться еще раз.

5) Добавьте эти сцены в build settings: File -> Build Settings -> Add Open

Scene.  Откроется список, в этот список загружаются сцены и автоматически назначается индекс сцены. У сцены ServerChoose индекс должен быть равен 0, MasterServer – 1, UDPServer – 2, StarTrooper – 3, EmptyScene – 4.

6) Откройте сцену ServerChoose.

7) Создайте новый джаваскрипт под названием Menu. Эту сцену и скрипт мы будем использовать для выбора типа сервера и соединения.

8) Перетащите этот скрипт в камере (Main Camera) и введите туда следующий код:

  1. function OnGUI() {
  2. GUI.Label(new Rect((Screen.width/2)-80,(Screen.height/2)-130,200,50),"SELECT
  3. CONNECTION TYPE");
  4. GUI.Label(new Rect((Screen.width-220),(Screen.height-30),220,30),"STAR-TROOPER
  5. MULTIPLAYER DEMO");
  6. if(GUI.Button(new Rect((Screen.width/2)-100,(Screen.height/
  7. 2)-100,200,50),"Master Server Connection"))
  8. {
  9. Application.LoadLevel("MasterServer");
  10. }
  11. if(GUI.Button(new Rect((Screen.width/2)-100,(Screen.height/2)-40,200,50),"Direct
  12. Connection"))
  13. {
  14. Application.LoadLevel("StarTrooper");
  15. }
  16. if(GUI.Button(new Rect((Screen.width/2)-100,(Screen.height/2)+20,200,50),"UDP
  17. Connection"))
  18. {
  19. Application.LoadLevel("UDPServer");
  20. }
  21. }

9) Откройте MasterServer

10) Создайте новый джаваскриптNetworkLevelLoad, новый игровой объект - ConnectionGUI. Перетиащите NetworkLevelLoad в ConnectionGUI и введите туда:

  1. // Keep track of the last level prefix (increment each time a new level loads)
  2. private var lastLevelPrefix = 0;
  3. function Awake () {
  4. // Network level loading is done in a seperate channel.
  5. DontDestroyOnLoad(this);
  6. networkView.group = 1;
  7. Application.LoadLevel("EmptyScene");
  8. }
  9. function OnGUI () {
  10. // When network is running (server or client) then display the level "StarTrooper"
  11. if (Network.peerType != NetworkPeerType.Disconnected)
  12. {
  13. if (GUI.Button(new Rect(350,10,100,30),"StarTrooper"))
  14. {
  15. // Make sure no old RPC calls are buffered and then send load level command
  16. Network.RemoveRPCsInGroup(0);
  17. Network.RemoveRPCsInGroup(1);
  18. // Load level with incremented level prefix (for view IDs)
  19. networkView.RPC( "LoadLevel", RPCMode.AllBuffered, "StarTrooper",
  20. lastLevelPrefix + 1);
  21. }
  22. }
  23. }
  24. @RPC
  25. function LoadLevel (level : String, levelPrefix : int) {
  26. Debug.Log("Loading level " + level + " with prefix " + levelPrefix);
  27. lastLevelPrefix = levelPrefix;
  28. // There is no reason to send any more data over the network on the default
  29. channel,
  30. // because we are about to load the level, because all those objects will get deleted
  31. anyway
  32. Network.SetSendingEnabled(0, false);
  33. // We need to stop receiving because first the level must be loaded.
  34. // Once the level is loaded, RPC's and other state update attached to objects in the
  35. level are allowed to fire
  36. Network.isMessageQueueRunning = false;
  37. // All network views loaded from a level will get a prefix into their NetworkViewID.
  38. // This will prevent old updates from clients leaking into a newly created scene.
  39. Network.SetLevelPrefix(levelPrefix);
  40. Application.LoadLevel(level);
  41. yield;
  42. yield;
  43. // Allow receiving data again
  44. Network.isMessageQueueRunning = true;
  45. // Now the level has been loaded and we can start sending out data
  46. Network.SetSendingEnabled(0, true);
  47. // Notify our objects that the level and the network is ready
  48. var go : Transform[] = FindObjectsOfType(Transform);
  49. var go_len = go.length;
  50. for (var i=0;i<go_len;i++)
  51. {
  52. go[i].SendMessage("OnNetworkLoadedLevel",
  53. SendMessageOptions.DontRequireReceiver);
  54. }
  55. }
  56. function OnDisconnectedFromServer () {
  57. Application.LoadLevel("EmptyScene");
  58. }
  59. @script RequireComponent(NetworkView)

Есть еще один скрипт он слишком большой и редактор запрещает его публикацию, так как символов в нем очень много, поэтому привести его здесь я не смогу, и прошу просто скачать его с сервера сайта: скачать


Категория: Unity3D Multiplayer | Добавил: Шаке (21.03.2012)
Просмотров: 5359 | Комментарии: 3 | Теги: Broadcast, startrooper, multiplayer, MasterServer, Connection, UDP, direct connect, Соединение
Всего комментариев: 3
3 сергей  
0
пожалусто выложите другую ссылку немогу не как скачать , очень хочется посмотреть на код

2 Лёха  
0
Пожалуйста, кто скачал, скиньте скрипт!!!skype carev_aleksei

1 пользователь  
0
спасибо! давно искал!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
/>meta http-equiv=