Вопрос по RPC

Сеть в Unity3D

Вопрос по RPC

Сообщение Berenold 07 июн 2011, 20:52

Доброго времени суток.
В одной из тем посвященной RPC прозвучал такой ответ:
не чего странного, архитектура юнити не подразумевает физического разделения на клиент - сервер, вы обязаны создавать (клиент-сервер) в одном проекте так как NetworkView должен иметь одинаковый ViewID, ибо в ручную установить ViewID нельзя,(можно только выделить через AllocateViewID) само сабой юнити требует отправки и получению RPC вызова в одном из скриптов на этом же ГО


У меня вопрос заключается в следующем:
Есть скрипт который должен выполнятся только на сервере MySQLCon.cs
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System;
using MySql.Data;
using MySql.Data.MySqlClient;

public class MySQLConnect : MonoBehaviour
{
        private static string connStr = "server=localhost;user=root;database=onlinetest;port=3306;password=pass;";
        private static MySqlConnection conn;

        public static void ConMySQL()
        {
                conn = new MySqlConnection(connStr);
                try
                {
                        Debug.Log("Connecting to MySQL...");
                        conn.Open();
                }
                catch (Exception ex)
                {
                        Debug.Log(ex.ToString());
                }
        }

        public static void DisMySQL()
        {
                conn.Close();
                Debug.Log("Connect Close!");
        }

        public static string MySQLLoginChec(string login, string pass, string message)
        {
                bool baned = false;
                string sql = "SELECT name FROM ban_list WHERE name = login";
                MySqlCommand  cmd = new MySqlCommand(sql, conn);
                MySqlDataReader rdr = cmd.ExecuteReader();
                while(rdr.Read())
                {
                        if(rdr[0] == login)
                        {
                                message = "ban";
                                baned = true;
                        }
                }
                rdr.Close();
                if(baned != true)
                {
                        sql = "SELECT pass FROM account WHERE mail = login";
                        cmd = new MySqlCommand(sql, conn);
                        rdr = cmd.ExecuteReader();
                        while(rdr.Read())
                        {
                                if(rdr[0] == pass)
                                {
                                        message = "done";
                                }
                                else if(rdr[0] != pass)
                                {
                                        message = "wrong";
                                }
                        }
                        rdr.Close();
                }
                return message;
        }
}
 


Есть скрикт ServerControl.cs который Стартует сервер и запускает метод из выше указанного скрипта с БД
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class ServerControl : MonoBehaviour {

        public GUIStyle statusLableStyleOn;
        public GUIStyle statusLableStyleOff;
       
        private const int BUTTON_W = 150;
        private const int BUTTON_H = 30;
        private const int MARGIN_TOP = 10;
        private const int MARGIN_LEFT = 10;
        private const int SPACE = 10;
       
        private int _connectPort = 45678;
        private GUIStyle _curentStyle;
        private string _status;
        private float _coolDown;      
        private float _rebootTimer;  
        private string _playerConLab;
       
        void Start()
        {
                _coolDown = 1.0f;
                _status = "SERVER STOPED";
                _curentStyle = statusLableStyleOff;
        }
       
        public void OnGUI()
        {
                GUI.Label(new Rect(MARGIN_LEFT,
                                   MARGIN_TOP,
                                   BUTTON_W,
                                   BUTTON_H),_status, _curentStyle);
               
                if (Network.peerType == NetworkPeerType.Disconnected)
                {
                       _status = "SERVER STOPED";
                       if (GUI.Button(new Rect(MARGIN_LEFT,
                                                            MARGIN_TOP + BUTTON_H + SPACE,
                                                            BUTTON_W,
                                                            BUTTON_H),"Start Server"))
                      {
                              Network.useNat = true;
                              Network.InitializeServer(1000, _connectPort);
                              _curentStyle = statusLableStyleOn;
                              _status = "SERVER STARTED";
                              MySQLConnect.ConMySQL();
                      }
                }
                else
                {
                         if (GUI.Button(new Rect(MARGIN_LEFT,
                                                              MARGIN_TOP + BUTTON_H + SPACE,
                                                              BUTTON_W,
                                                              BUTTON_H),"Stop Server"))
                        {
                               Network.Disconnect(200);
                               _status = "SERVER STOPED";
                               _curentStyle = statusLableStyleOff;
                               MySQLConnect.DisMySQL();
                        }
                        else if (Network.peerType == NetworkPeerType.Server)
                        {
                                _status = "SERVER STARTED";
                                _curentStyle = statusLableStyleOn;
                                GUI.Label(new Rect(MARGIN_LEFT + SPACE + BUTTON_W,
                                                               MARGIN_TOP,
                                                               BUTTON_W,
                                                               BUTTON_H),"Connections: " + Network.connections.Length);
               
                                 GUI.Label(new Rect(MARGIN_LEFT + SPACE + BUTTON_W,
                                                                MARGIN_TOP + SPACE + MARGIN_TOP,
                                                                BUTTON_W + BUTTON_W,
                                                                BUTTON_H),"Player connected from " + _playerConLab);
               
                                if (Network.connections.Length > 1)
                                {
                                        GUILayout.Label("Ping to first player: " + Network.GetAveragePing(Network.connections[0]));
                                }
                      }
               }
        }
       
        private void OnPlayerConnected(NetworkPlayer player)
        {
                _playerConLab = player.ipAddress + ":" + player.port;
        }
       
        private void OnPlayerDisconnected(NetworkPlayer player)
        {
                _playerConLab = "Clean up after player " + player;
                Network.RemoveRPCs(player);
                Network.DestroyPlayerObjects(player);
        }

        [RPC]
        public static string ChecUserLogin(string login, string pass, string massage)
        {
                massage = MySQLConnect.MySQLLoginChec(login, pass, massage);
                return massage;
        }
}
 



1)Может ли через RPC делать return massage?
2)Если нужно в клиентском коде писать
Синтаксис:
Используется csharp
        [RPC]
        public static string ChecUserLogin(string login, string pass, string massage)
        {
                massage = MySQLConnect.MySQLLoginChec(login, pass, massage);
                return massage;
        }

при компиляции клиента скрипт MySQLCon.cs дубет добавлен? Просто если да, тогда при декомпиле клиента злостный "ридиско" получит на выходе все данные от БД, а это уже никуда не годится.
Заранее благодарен за ответ.
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Вопрос по RPC

Сообщение Berenold 07 июн 2011, 21:26

Так насчет return я уже все понял)) Возвращать нельзя. Но наткнулся на такие грабли
У меня есть некий скрипт на клиенте который собственно и должен посылать RPC
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System;


public class MetodConnect : MonoBehaviour
{
       
        private static string connectToIP = "92.249.121.143";  //IP адресс к которому будет осуществялся подключение
    private static int connectPort = 45678;                //Порт к которому будет осуществятся подключение
       
       
        public static string ConToServ(string login, string pass, string status)
        {
        // Подсоединяемся к "connectToIP" и "connectPort" как клиент
        // В данном случае используя NAT
                Network.useNat = true;
                Network.Connect(connectToIP, connectPort);
        if (Network.peerType == NetworkPeerType.Client)
        {
                // Статус - клиент
                        ColRPC(login, pass, status);
        }
               
                return status;
        }

        public void ColRPC(string login, string pass, string status)
        {
                networkView.RPC("ChecUserLogin", RPCMode.Server, login, pass, status);
        }
       
        [RPC]
        public void ChecUserLogin(string login, string pass, string massage)
        {
                massage = MySQLConnect.MySQLLoginChec(login, pass, massage);
        }
       
}
 


Выдается вот такая ошибка : Assets/Content/Scripts/Client/login/MetodConnect.cs(22,25): error CS0120: An object reference is required to access non-static member `MetodConnect.ColRPC(string, string, string)'
Насколько я понимаю RPC не может быть послан из вызываемого метода?
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Вопрос по RPC

Сообщение gnoblin 07 июн 2011, 21:44

Метод нестатический, а обращение идет к нему как к статическому.
В этом и ошибка.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Вопрос по RPC

Сообщение Berenold 07 июн 2011, 21:52

Вот так пробовал туже ошибку выдает
Синтаксис:
Используется csharp
        public static string ConToServ(string login, string pass, string status)
        {
        // Подсоединяемся к "connectToIP" и "connectPort" как клиент
        // В данном случае используя NAT
                Network.useNat = true;
                Network.Connect(connectToIP, connectPort);
        if (Network.peerType == NetworkPeerType.Client)
        {
                // Статус - клиент
                        //ColRPC(login, pass, status);
                networkView.RPC("ChecUserLogin", RPCMode.Server, login, pass, status);
        }
               
                return status;
        }
 


Я уже и через делегаты пробовал, та же ошибка.
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Вопрос по RPC

Сообщение gnoblin 07 июн 2011, 22:51

ладно, я неправ.
Всё хуже :).

Вот public static string ConToServ() это статический метод.
Внутри него идет попытка вызвать нестатический метод ColRPC(login, pass, status);

Каким макаром он должен вызываться если объекта никакого нету?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Вопрос по RPC

Сообщение Berenold 07 июн 2011, 23:14

Нет все не хуже)) Все банально
Синтаксис:
Используется csharp
networkView.RPC("ChecUserLogin", RPCMode.Server, login, pass, status);

не работает в static методе. вынес его в
Синтаксис:
Используется csharp
void Update()
{
    ...
    if(...)
    {
        networkView.RPC("ChecUserLogin", RPCMode.Server, login, pass, status);  
    }

}
 

и все заработало как нужно.

Остается узнать ответ на мой вопрос в самом первом посте по повожу MySQLConnect.cs...

Но чувствую, что и на него я ответ уже знаю. И прейдется мне разгребаться со сторонним софтом для реализации клиент сервер или, что еще мрачнее писать свою реализацию(((
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Вопрос по RPC

Сообщение gnoblin 08 июн 2011, 00:55

Все скрипты которые лежат в проекте включаются в билд.
Что такое return massage?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Вопрос по RPC

Сообщение Berenold 08 июн 2011, 09:15

return - это return, message - это стринговая переменная которую хотелось бы вернуть, но при попытки провести такой финт мне компилятор сразу же говорит что нельзя преобразовать void в string из чего я сделал вывод, что
Синтаксис:
Используется csharp
networkView.RPC("ChecUserLogin", RPCMode.Server, login, pass, status);
всегда void. Скрипты которые я выкладывал в самом начале темы уже изменены так, что спс за ответы
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4