COPYRIGHT 2014 @ UNITY TECHNOLOGIES
UNITY NETWØRK1NG:
НØВЫЕ ВØ3МØЖНØСТИ
Валентин Симонов
Field Engineer @ Unity Technologies
E-mail: val@unity3d.com
Skype: simonov.valentin
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Валентин Симонов
Field Engineer @ Unity Technologies
• Помогаю разработчикам
выжимать максимум из Unity
• Рассказываю про Unity
• Перевожу книги по Unity
• Веду курсы по Unity
• Поддерживаю open source проекты:
• https://github.com/TouchScript/TouchScript
E-mail: val@unity3d.com
Skype: simonov.valentin
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
ПРОШЛОЕ: RAKNET
• Стороннее решение
• Для небольших мультиплеер игр
• Акцент на простоту интеграции в IDE
• Нет low-level доступа
• Не предназначено для ММО с авторитарным
сервером
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
БУДУЩЕЕ: UNITY NETWORKING
• Производительное, стабильное и удобное решение
• Рассчитано на самые разные типы игр
• Client hosted и server based
• Большое количество одновременных подключений
• Native в Unity
• High Level и Low Level API
• Match making, relay server для обхода NAT
• Серверные библиотеки и simulation server
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
НАСТОЯЩЕЕ
5.1: http://unity3d.com/unity/beta
• Протокол на основе UDP
• Multi-channel дизайн
• Разные уровни QoS (Quality of Service) на канал
• Поддержка peer-to-peer и client-server
• High Level и Low Level API
• Relay/match making сервер
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
http://forum.unity3d.com/threads/networking-sample-projects.325096/
COPYRIGHT 2014 @ UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES
LOW LEVEL API
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
LOW LEVEL API
config = new ConnectionConfig();
channel = config.AddChannel(QosType.Reliable);
NetworkTransport.Init();
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
КАНАЛЫ
Каналы — логическое разделение потока
сообщений для соединения
QoS:
• Unreliable, Unreliable Fragmented, Unreliable
Sequenced
• Reliable, Reliable Fragmented, Reliable Sequenced
• State Update, All Cost Delivery
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
// server
HostTopology topology = new HostTopology(config, 12);
host = NetworkTransport.AddHost(topology, port, null);
// client
host = NetworkTransport.AddHost(topology, 0);
connection =
NetworkTransport.Connect(host, ip, port, 0, out error);
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
NetworkEventType recData =
NetworkTransport.Receive( … );
switch (recData) {
case NetworkEventType.Nothing:
break;
case NetworkEventType.ConnectEvent:
break;
case NetworkEventType.DataEvent:
break;
case NetworkEventType.DisconnectEvent:
break;
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
NetworkTransport.Send(host, connection,
channel, bytes, bytes.Length, out error);
NetworkTransport.Shutdown();
COPYRIGHT 2014 @ UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES
HIGH LEVEL API
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
HIGH LEVEL API
• Простое API для основных задач
• На основе Low Level API
• Набор компонентов и атрибутов
• Авторитарный сервер
• Игрок может быть сервером
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
P2P/НЕАВТОРИТАРНЫЙ СЕРВЕР
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
АВТОРИТАРНЫЙ СЕРВЕР
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
// Server
NetworkServer.Listen(4444);
// Client
myClient = new NetworkClient();
myClient.RegisterHandler(
MsgType.Connect, OnConnected);
myClient.Connect("127.0.0.1", 4444);
NetworkServer.SendToAll( ... );
public void OnConnected(NetworkMessage netMsg) { ...
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
SIMULATOR
ConnectWithSimulator(
string serverIp,
int serverPort,
int latency,
float packetLoss);
COPYRIGHT 2014 @ UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES
ЕЩЕ БОЛЕЕ HIGH LEVEL
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
ИГРОКИ
• 1 клиент == 1+ игроков
• Игрок — особый объект, который может общаться
с сервером
public void OnConnected(NetworkMessage netMsg)
{
ClientScene.AddPlayer(netMsg.conn, 0);
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
NETWORK IDENTITY
• Компонент, который отмечает объект как
контролируемый сервером
• NetworkServer.Spawn( … )
• ClientScene.RegisterPrefab( ... )
ClientScene.RegisterSpawnHandler( ... )
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
NETWORKBEHAVIOUR
MyScript -> NetworkBehaviour -> MonoBehaviour
• Объекты с NetworkIdentity
• Синхронизация переменных
• Сетевые колбэки
• Серверные и клиентские функции
• Команды
• RPC вызовы
• Сетевые события
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
SYNCVAR
• Синхронизация server -> client*
public class SpaceShip : NetworkBehaviour
{
[SyncVar]
public int health;
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
NETWORK CALLBACKS
Виртуальные методы NetworkBehaviour
• OnStartServer
• OnStartClient
• OnSerialize(NetworkWriter writer, bool initialState)
• OnDeSerialize(NetworkReader reader, bool initialState)
• OnNetworkDestroy
• OnStartLocalPlayer
• …
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
КЛИЕНТСКИЕ И СЕРВЕРНЫЕ МЕТОДЫ
public class SimpleSpaceShip : NetworkBehaviour {
[Server]
public void TakeDamage(int amount) { ... }
[Client]
void ShowExplosion() { ... }
[ClientCallback]
void Update() { ... }
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
КЛИЕНТ <-> СЕРВЕР
• Команды: игрок -> сервер
(только игрок)
• RPC: сервер -> клиентский объект
• События: сервер -> клиентский объект
• Сообщения: сервер <-> клиент
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
КОМАНДЫ
public class SpaceShip : NetworkBehaviour {
[Command]
public void CmdRotate(float angle) {
this.angle += angle;
}
[ClientCallback]
void Update() {
CmdRotate(Input.GetAxis("Vertical")); // this will be called on the server
}
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
RPC
public class Rpc : NetworkBehaviour {
[ClientRpc]
public void RpcDoOnClient(float value) { ... }
[ServerCallback]
void Update() {
RpcDoOnClient(Time.time);
}
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
СОБЫТИЯ
public class MyCombat : NetworkBehaviour {
public delegate void RespawnDelegate();
[SyncEvent]
public event RespawnDelegate EventRespawn;
[Server]
void Respawn() {
alive = true;
EventRespawn();
}
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
СООБЩЕНИЯ
public class MyMsgType {
public static short Score = MsgType.Highest + 1;
};
public struct ScoreMessage {
public int score;
public Vector3 scorePos;
public int lives;
}
public void SetupClient() {
myClient = new NetworkClient();
myClient.RegisterHandler(MyMsgType.Score, OnScore);
myClient.Connect("127.0.0.1", 4444);
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
СООБЩЕНИЯ
public void SendScore(int score, Vector3 scorePos, int lives) {
ScoreMessage msg;
msg.score = score;
msg.scorePos = scorePos;
msg.lives = lives;
NetworkServer.SendToAll<ScoreMessage>(MyMsgType.Score, msg);
}
public void OnScore(NetworkMessage netMsg) { … }
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
NETWORKBEHAVIOUR
MyScript -> NetworkBehaviour -> MonoBehaviour
• Меньше порог входа
• Генерация кода при компиляции
• Не используется reflection в рантайме
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
КОМПОНЕНТЫ: NETWORK MANAGER
• Центральный компонент для
конфигурации сетевого взаимодействия
• Написан на HLAPI
• Содержит базовую функциональность:
• Управление без скриптинга
• Game state management
• Scene management
• Spawning
• Debugging
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
КОМПОНЕНТЫ: NETWORK MANAGER
public class MyNetManager : NetworkManager
{
public override void OnServerAddPlayer(
NetworkConnection conn, short playerControllerId)
{ … }
OnServerConnect(UConnection conn);
OnServerDisconnect(UConnection conn);
OnClientConnect(UConnection conn);
OnClientDisconnect(UConnection conn);
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
КОМПОНЕНТЫ
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
MATCHMAKING
NetworkMatch <-> Relay Server (LLAPI) <-> Clients
Обход закрытых сетей
CreateMatch
ListMatches
JoinMatch
DestroyMatch
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
MATCHMAKING
SetProgramAppID( … )
https://unet.unity3d.com/
COPYRIGHT 2014 @ UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES
UNITY В РОССИИ
unity_ru
unityrussia
unity3dengine
blogs.unity3d.com/ru
Unity3DRU

Unity Networking: new possibilities

  • 1.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES UNITY NETWØRK1NG: НØВЫЕ ВØ3МØЖНØСТИ Валентин Симонов Field Engineer @ Unity Technologies E-mail: val@unity3d.com Skype: simonov.valentin
  • 2.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES Валентин Симонов Field Engineer @ Unity Technologies • Помогаю разработчикам выжимать максимум из Unity • Рассказываю про Unity • Перевожу книги по Unity • Веду курсы по Unity • Поддерживаю open source проекты: • https://github.com/TouchScript/TouchScript E-mail: val@unity3d.com Skype: simonov.valentin
  • 3.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES ПРОШЛОЕ: RAKNET • Стороннее решение • Для небольших мультиплеер игр • Акцент на простоту интеграции в IDE • Нет low-level доступа • Не предназначено для ММО с авторитарным сервером
  • 4.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES БУДУЩЕЕ: UNITY NETWORKING • Производительное, стабильное и удобное решение • Рассчитано на самые разные типы игр • Client hosted и server based • Большое количество одновременных подключений • Native в Unity • High Level и Low Level API • Match making, relay server для обхода NAT • Серверные библиотеки и simulation server
  • 5.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES НАСТОЯЩЕЕ 5.1: http://unity3d.com/unity/beta • Протокол на основе UDP • Multi-channel дизайн • Разные уровни QoS (Quality of Service) на канал • Поддержка peer-to-peer и client-server • High Level и Low Level API • Relay/match making сервер
  • 6.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES
  • 7.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES http://forum.unity3d.com/threads/networking-sample-projects.325096/
  • 8.
    COPYRIGHT 2014 @UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES LOW LEVEL API
  • 9.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES LOW LEVEL API config = new ConnectionConfig(); channel = config.AddChannel(QosType.Reliable); NetworkTransport.Init();
  • 10.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES КАНАЛЫ Каналы — логическое разделение потока сообщений для соединения QoS: • Unreliable, Unreliable Fragmented, Unreliable Sequenced • Reliable, Reliable Fragmented, Reliable Sequenced • State Update, All Cost Delivery
  • 11.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES // server HostTopology topology = new HostTopology(config, 12); host = NetworkTransport.AddHost(topology, port, null); // client host = NetworkTransport.AddHost(topology, 0); connection = NetworkTransport.Connect(host, ip, port, 0, out error);
  • 12.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES NetworkEventType recData = NetworkTransport.Receive( … ); switch (recData) { case NetworkEventType.Nothing: break; case NetworkEventType.ConnectEvent: break; case NetworkEventType.DataEvent: break; case NetworkEventType.DisconnectEvent: break; }
  • 13.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES NetworkTransport.Send(host, connection, channel, bytes, bytes.Length, out error); NetworkTransport.Shutdown();
  • 14.
    COPYRIGHT 2014 @UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES HIGH LEVEL API
  • 15.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES HIGH LEVEL API • Простое API для основных задач • На основе Low Level API • Набор компонентов и атрибутов • Авторитарный сервер • Игрок может быть сервером
  • 16.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES P2P/НЕАВТОРИТАРНЫЙ СЕРВЕР
  • 17.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES АВТОРИТАРНЫЙ СЕРВЕР
  • 18.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES // Server NetworkServer.Listen(4444); // Client myClient = new NetworkClient(); myClient.RegisterHandler( MsgType.Connect, OnConnected); myClient.Connect("127.0.0.1", 4444); NetworkServer.SendToAll( ... ); public void OnConnected(NetworkMessage netMsg) { ... }
  • 19.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES
  • 20.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES SIMULATOR ConnectWithSimulator( string serverIp, int serverPort, int latency, float packetLoss);
  • 21.
    COPYRIGHT 2014 @UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES ЕЩЕ БОЛЕЕ HIGH LEVEL
  • 22.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES ИГРОКИ • 1 клиент == 1+ игроков • Игрок — особый объект, который может общаться с сервером public void OnConnected(NetworkMessage netMsg) { ClientScene.AddPlayer(netMsg.conn, 0); }
  • 23.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES NETWORK IDENTITY • Компонент, который отмечает объект как контролируемый сервером • NetworkServer.Spawn( … ) • ClientScene.RegisterPrefab( ... ) ClientScene.RegisterSpawnHandler( ... )
  • 24.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES NETWORKBEHAVIOUR MyScript -> NetworkBehaviour -> MonoBehaviour • Объекты с NetworkIdentity • Синхронизация переменных • Сетевые колбэки • Серверные и клиентские функции • Команды • RPC вызовы • Сетевые события
  • 25.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES SYNCVAR • Синхронизация server -> client* public class SpaceShip : NetworkBehaviour { [SyncVar] public int health; }
  • 26.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES NETWORK CALLBACKS Виртуальные методы NetworkBehaviour • OnStartServer • OnStartClient • OnSerialize(NetworkWriter writer, bool initialState) • OnDeSerialize(NetworkReader reader, bool initialState) • OnNetworkDestroy • OnStartLocalPlayer • …
  • 27.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES КЛИЕНТСКИЕ И СЕРВЕРНЫЕ МЕТОДЫ public class SimpleSpaceShip : NetworkBehaviour { [Server] public void TakeDamage(int amount) { ... } [Client] void ShowExplosion() { ... } [ClientCallback] void Update() { ... } }
  • 28.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES КЛИЕНТ <-> СЕРВЕР • Команды: игрок -> сервер (только игрок) • RPC: сервер -> клиентский объект • События: сервер -> клиентский объект • Сообщения: сервер <-> клиент
  • 29.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES КОМАНДЫ public class SpaceShip : NetworkBehaviour { [Command] public void CmdRotate(float angle) { this.angle += angle; } [ClientCallback] void Update() { CmdRotate(Input.GetAxis("Vertical")); // this will be called on the server } }
  • 30.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES RPC public class Rpc : NetworkBehaviour { [ClientRpc] public void RpcDoOnClient(float value) { ... } [ServerCallback] void Update() { RpcDoOnClient(Time.time); } }
  • 31.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES СОБЫТИЯ public class MyCombat : NetworkBehaviour { public delegate void RespawnDelegate(); [SyncEvent] public event RespawnDelegate EventRespawn; [Server] void Respawn() { alive = true; EventRespawn(); } }
  • 32.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES СООБЩЕНИЯ public class MyMsgType { public static short Score = MsgType.Highest + 1; }; public struct ScoreMessage { public int score; public Vector3 scorePos; public int lives; } public void SetupClient() { myClient = new NetworkClient(); myClient.RegisterHandler(MyMsgType.Score, OnScore); myClient.Connect("127.0.0.1", 4444); }
  • 33.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES СООБЩЕНИЯ public void SendScore(int score, Vector3 scorePos, int lives) { ScoreMessage msg; msg.score = score; msg.scorePos = scorePos; msg.lives = lives; NetworkServer.SendToAll<ScoreMessage>(MyMsgType.Score, msg); } public void OnScore(NetworkMessage netMsg) { … }
  • 34.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES NETWORKBEHAVIOUR MyScript -> NetworkBehaviour -> MonoBehaviour • Меньше порог входа • Генерация кода при компиляции • Не используется reflection в рантайме
  • 35.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES КОМПОНЕНТЫ: NETWORK MANAGER • Центральный компонент для конфигурации сетевого взаимодействия • Написан на HLAPI • Содержит базовую функциональность: • Управление без скриптинга • Game state management • Scene management • Spawning • Debugging
  • 36.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES КОМПОНЕНТЫ: NETWORK MANAGER public class MyNetManager : NetworkManager { public override void OnServerAddPlayer( NetworkConnection conn, short playerControllerId) { … } OnServerConnect(UConnection conn); OnServerDisconnect(UConnection conn); OnClientConnect(UConnection conn); OnClientDisconnect(UConnection conn); }
  • 37.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES КОМПОНЕНТЫ
  • 38.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES MATCHMAKING NetworkMatch <-> Relay Server (LLAPI) <-> Clients Обход закрытых сетей CreateMatch ListMatches JoinMatch DestroyMatch
  • 39.
    COPYRIGHT 2014 @UNITY TECHNOLOGIES MATCHMAKING SetProgramAppID( … ) https://unet.unity3d.com/
  • 40.
    COPYRIGHT 2014 @UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES UNITY В РОССИИ unity_ru unityrussia unity3dengine blogs.unity3d.com/ru Unity3DRU

Editor's Notes

  • #2 Привет, мол, мы Unity. Кто уже что-то делал на юнити? Кто давно хотел начать делать какую-то игру, но почему-то не задалось до сих пор?