Для тех кто хочет связать сервер на 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
Автор: Gexon