- PVSM.RU - https://www.pvsm.ru -

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

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

1. Скачать плагин на Unity [1] (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 [2] за великолепные статьи habrahabr.ru/post/129174/ [3], habrahabr.ru/post/134812/ [4]

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

Автор: Gexon

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/28222

Ссылки в тексте:

[1] плагин на Unity: http://sourceforge.net/apps/trac/reddwarf/attachment/wiki/CommunityClientImplementations/DarkstarSharp.unitypackage

[2] dvb : http://habrahabr.ru/users/dvb/

[3] habrahabr.ru/post/129174/: http://habrahabr.ru/post/129174/

[4] habrahabr.ru/post/134812/: http://habrahabr.ru/post/134812/

[5] unity3d.ru/distribution/viewtopic.php?f=14&t=13799&p=100827#p100827: http://unity3d.ru/distribution/viewtopic.php?f=14&t=13799&p=100827#p100827

[6] Источник: http://habrahabr.ru/post/170931/