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 сервер
14. COPYRIGHT 2014 @ UNITY TECHNOLOGIESCOPYRIGHT 2014 @ UNITY TECHNOLOGIES
HIGH LEVEL API
15. COPYRIGHT 2014 @ UNITY TECHNOLOGIES
HIGH LEVEL API
• Простое API для основных задач
• На основе Low Level API
• Набор компонентов и атрибутов
• Авторитарный сервер
• Игрок может быть сервером
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;
}
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);
}