COPYRIGHT 2014 @ UNITY TECHNOLOGIES
UNITY NETWØRK1NG:НØВЫЕ ВØ3МØЖНØСТИ
Валентин СимоновField Engineer @ Unity TechnologiesE-mail: [email protected]
Skype: simonov.valentin
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
Валентин СимоновField Engineer @ Unity Technologies
• Помогаю разработчикам
выжимать максимум из Unity
• Рассказываю про Unity
• Перевожу книги по Unity
• Веду курсы по Unity
• Поддерживаю open source проекты:• https://github.com/TouchScript/TouchScript
E-mail: [email protected]
Skype: simonov.valentin
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
ПРОШЛОЕ: RAKNET
• Стороннее решение
• Для небольших мультиплеер игр
• Акцент на простоту интеграции в IDE
• Нет low-level доступа
• Не предназначено для ММО с авторитарным
сервером
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
БУДУЩЕЕ: UNITY NETWORKING
• Производительное, стабильное и удобное решение
• Рассчитано на самые разные типы игр
• Client hosted и server based
• Большое количество одновременных подключений
• Native в Unity
• High Level и Low Level API
• Match making, relay server для обхода NAT
• Серверные библиотеки и simulation server
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
НАСТОЯЩЕЕ
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
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
http://forum.unity3d.com/threads/networking-sample-projects.325096/
COPYRIGHT 2014 @ UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES
LOW LEVEL API
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
LOW LEVEL API
config = new ConnectionConfig();
channel = config.AddChannel(QosType.Reliable);
NetworkTransport.Init();
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
КАНАЛЫ
Каналы — логическое разделение потока сообщений для соединения
QoS:• Unreliable, Unreliable Fragmented, Unreliable
Sequenced• Reliable, Reliable Fragmented, Reliable Sequenced• State Update, All Cost Delivery
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
// 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
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
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
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
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
Text Styles
key to switch
between levels
24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
HIGH LEVEL API
• Простое API для основных задач
• На основе Low Level API
• Набор компонентов и атрибутов
• Авторитарный сервер
• Игрок может быть сервером
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
P2P/НЕАВТОРИТАРНЫЙ СЕРВЕР
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
АВТОРИТАРНЫЙ СЕРВЕР
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
// ServerNetworkServer.Listen(4444);
// ClientmyClient = 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
Text Styles
key to switch
between levels
24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
SIMULATOR
ConnectWithSimulator(
string serverIp,
int serverPort,
int latency,
float packetLoss);
COPYRIGHT 2014 @ UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES
ЕЩЕ БОЛЕЕ HIGH LEVEL
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
ИГРОКИ
• 1 клиент == 1+ игроков• Игрок — особый объект, который может общаться
с сервером
public void OnConnected(NetworkMessage netMsg){
ClientScene.AddPlayer(netMsg.conn, 0);}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
NETWORK IDENTITY
• Компонент, который отмечает объект как
контролируемый сервером
• NetworkServer.Spawn( … )
• ClientScene.RegisterPrefab( ... )
ClientScene.RegisterSpawnHandler( ... )
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
NETWORKBEHAVIOUR
MyScript -> NetworkBehaviour -> MonoBehaviour
• Объекты с NetworkIdentity• Синхронизация переменных• Сетевые колбэки• Серверные и клиентские функции• Команды• RPC вызовы• Сетевые события
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
SYNCVAR
• Синхронизация server -> client*
public class SpaceShip : NetworkBehaviour
{
[SyncVar]
public int health;
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
NETWORK CALLBACKS
Виртуальные методы NetworkBehaviour
• OnStartServer• OnStartClient• OnSerialize(NetworkWriter writer, bool initialState)• OnDeSerialize(NetworkReader reader, bool initialState)• OnNetworkDestroy• OnStartLocalPlayer• …
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
КЛИЕНТСКИЕ И СЕРВЕРНЫЕ МЕТОДЫ
public class SimpleSpaceShip : NetworkBehaviour {
[Server]public void TakeDamage(int amount) { ... }
[Client]void ShowExplosion() { ... }
[ClientCallback]void Update() { ... }
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
КЛИЕНТ <-> СЕРВЕР
• Команды: игрок -> сервер(только игрок)
• RPC: сервер -> клиентский объект
• События: сервер -> клиентский объект
• Сообщения: сервер <-> клиент
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
КОМАНДЫ
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
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
RPC
public class Rpc : NetworkBehaviour {
[ClientRpc]public void RpcDoOnClient(float value) { ... }
[ServerCallback]void Update() {
RpcDoOnClient(Time.time);}
}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
СОБЫТИЯ
public class MyCombat : NetworkBehaviour {
public delegate void RespawnDelegate();
[SyncEvent]public event RespawnDelegate EventRespawn;
[Server]void Respawn() {
alive = true;EventRespawn();
}}
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
СООБЩЕНИЯ
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
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
СООБЩЕНИЯ
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
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
NETWORKBEHAVIOUR
MyScript -> NetworkBehaviour -> MonoBehaviour
• Меньше порог входа
• Генерация кода при компиляции
• Не используется reflection в рантайме
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
КОМПОНЕНТЫ: NETWORK MANAGER
• Центральный компонент для
конфигурации сетевого взаимодействия
• Написан на HLAPI
• Содержит базовую функциональность:• Управление без скриптинга
• Game state management
• Scene management
• Spawning
• Debugging
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
КОМПОНЕНТЫ: 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
Text Styles
key to switch
between levels
Level 1 = Bullet 24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
КОМПОНЕНТЫ
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
MATCHMAKING
NetworkMatch <-> Relay Server (LLAPI) <-> Clients
Обход закрытых сетей
CreateMatchListMatchesJoinMatchDestroyMatch
COPYRIGHT 2014 @ UNITY TECHNOLOGIES
Text Styles
key to switch
between levels
24 pt.
Level 2 = Bullet 24 pt.
Level 3 = Bullet 20 pt.
Level 5 = Bullet 16 pt.
To get bullet / plain text
list
MATCHMAKING
SetProgramAppID( … )
https://unet.unity3d.com/
COPYRIGHT 2014 @ UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES
UNITY В РОССИИunity_ruunityrussiaunity3dengineblogs.unity3d.com/ruUnity3DRU