В одной из тем посвященной 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;
}
}
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;
}
}
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;
}
public static string ChecUserLogin(string login, string pass, string massage)
{
massage = MySQLConnect.MySQLLoginChec(login, pass, massage);
return massage;
}
при компиляции клиента скрипт MySQLCon.cs дубет добавлен? Просто если да, тогда при декомпиле клиента злостный "ридиско" получит на выходе все данные от БД, а это уже никуда не годится.
Заранее благодарен за ответ.