Используется бесплатная версия 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/
Добавить комментарий