RedDwarf (бывший DarkStar) и Unity3D

от автора

Для тех кто хочет связать сервер на java RedDwarf (DarkStar):
Используется бесплатная версия Unity.

1. Скачать плагин на Unity (http://sourceforge.net/apps/trac/reddwarf/attachment/wiki/CommunityClientImplementations/DarkstarSharp.unitypackage). Импортировать в Unity. В ассетах должен появиться «DarkstarSharp».

2. В файле «SimpleSgsProtocol.cs» из папки со скриптами «DarkstarSharp», необходимо изменить версию протокола,
значение VERSION = 0x04; меняем на 0x05;

3. Создаем папку для наших скриптов и создаем в нем csharp скрипт «Messages.cs» следующего содержания:

using UnityEngine; using System; using System.Text; using System.Collections;  public class Messages {      public static byte[] encodeString(String s) {                       return Encoding.ASCII.GetBytes(s);     }      public static String decodeString(byte[] message) {                 return ASCIIEncoding.ASCII.GetString(message);         } } 

4. Создаем csharp скрипт «ConnectToRedDwarf.cs» с таким содержимым:

 using UnityEngine; using System; using System.Text; using System.Collections; using DarkstarSharp;  public class RedDwarfClient : SimpleClientListener {         private SimpleClient simpleClient;         private ConnectToRedDwarf connectRD;         private String host;     private String username;                     public RedDwarfClient(String host, String username, ConnectToRedDwarf connectRD) {                                              this.host = host;                 this.username = username;                 this.connectRD = connectRD;                 simpleClient = new SimpleClient(this);         }                 public void LoggedIn(byte[] reconnectKey){                 connectRD.loggedIn();         }             public void LoginFailed(String reason){                 connectRD.setStatus("login failed " + username+": "+reason);                    }                 public void SendMessage(String s){                              try {             simpleClient.WriteMessage(Messages.encodeString(s));         } catch (Exception e) {             connectRD.setStatus(e.Message.ToString());         }         }             public void ReceivedMessage(byte[] message){                                  connectRD.receivedMessage(Messages.decodeString(message));         }             public void Disconnected(bool forced, String message){                              connectRD.disconnected(username, message);         }             public PasswordAuthentication GetPasswordAuthentication(){                 return new PasswordAuthentication(username, "");         }             public ClientChannelListener JoinedChannel(ClientChannel channel){                          return null;;                   }                 public Boolean login() {                 Boolean result = true;         try {                         simpleClient.login(host, 62964);         } catch (Exception e) {             connectRD.setStatus("cannot login" + username+": "+e.Message.ToString());                         result = false;         }                 return result;     }                   public void LogOff(){                 simpleClient.Logout(false);         } }        public class ConnectToRedDwarf : MonoBehaviour {                private RedDwarfClient client;         Boolean onConnect = false;         String serverIP = "127.0.0.1";         String clientName = "Unity";         string status = "Not connection";          // Use this for initialization (Выполняется один раз, при запуске)         void Start () {                                                 }                 // Update is called once per frame (Выполняется регулярно, каждый раз при отрисовке кадра)         void Update () {                 }                 void OnGUI() {                 if (!onConnect) {                         //renderer.material.color = Color.blue;                 GUI.BeginGroup(new Rect(Screen.width/2-150, Screen.height/2-200, 300, 400));                 GUI.Box(new Rect(0, 0, 300, 400), "Connect to Server");                         serverIP = GUI.TextField(new Rect(100,90,100,20), serverIP);                         clientName = GUI.TextField(new Rect(100,120,100,20), clientName);                         //Подключение к серверу                                                      if (GUI.Button(new Rect(100, 150, 100, 20), "Connect")){                                 client = new RedDwarfClient(serverIP, clientName, this);                                                                onConnect = client.login();                         }                                               GUI.Label(new Rect(100,180,200,20), status);                 //Закрыть окно                 if (GUI.Button(new Rect(100, 360, 100, 20), "Close"))                 {                                   }                 GUI.EndGroup();                 } else {                         GUI.BeginGroup(new Rect(Screen.width/2-150, Screen.height/2-200, 300, 400));                 GUI.Box(new Rect(0, 0, 300, 400), "Connection Status");                                                         serverIP = GUI.TextField(new Rect(100,90,100,20), serverIP);                         clientName = GUI.TextField(new Rect(100,120,100,20), clientName);                         if (GUI.Button(new Rect(100, 150, 100, 20), "Drop connection")){                                 client.LogOff();                                 onConnect = false;                         }                                               GUI.Label(new Rect(100,180,200,20), status);                 //Закрыть окно                 if (GUI.Button(new Rect(100, 360, 100, 20), "Close"))                 {                                   }                 GUI.EndGroup();                 }         }                 public void loggedIn(){ // делаем что-то при подключении к серверу                 status = "Logined";         }                 public void setStatus(String status){ // устанавливаем новое состояние (отображаем в GUI)                 this.status = status;         }                 public void move(String pos){} // перемещаем наш объект                 public void endGame(String game){ // конец игры                 status = game;         }                 public void disconnected(String username, String message){ // обрыв соединения с сервером                 this.setStatus("Lost connection: "+message);                 onConnect = false;         }                 public void receivedMessage(String msg){                 if (msg.StartsWith("MOVE")) {             move(msg);         } else if (msg.StartsWith("END")) {             endGame(msg);         }                       }                 public void play(){ // логика игры                 client.SendMessage("PLAY");         }               } 

5. В нашей сцене создаем пустой объект и кидаем на него скрипт «ConnectToRedDwarf.cs». Запускаем на выполнение и наблюдем меню где нужно ввести адрес сервера логин. В общем разберетесь)

Послесловие:
Содержимое файла «Messages.cs» взято с официального сайта, и немного подретушировано под сишарп.
Содержимое файла «ConnectToRedDwarf.cs» вычленено с различных источников плюс плод моего воображения.
Спасибо пользователю dvb за великолепные статьи habrahabr.ru/post/129174/, habrahabr.ru/post/134812/

Проверил, работает. (c#)
Обсуждение на unity3d.ru/distribution/viewtopic.php?f=14&t=13799&p=100827#p100827

ссылка на оригинал статьи http://habrahabr.ru/post/170931/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *