Как узнать реальное время в Unity 5 при помощи ntp сервера
В этом уроке мы разберем, как узнать реальное время в Unity 5 при помощи ntp сервера. Для того, чтоб получить реальное время нам необходимо подключиться к ntp серверу, лежащему в сети. Для этого создадим скрипт и назовем его TimeScript и сделаем в нем метод для получения времени из сети:
public static class TimeScript
{
public static DateTime GetNetworkTime()
{
//Ссылка на наш ntp сервер
const string ntpServer = "ntp.ix.ru";
//Размер данных, получаемых от ntp сервера
var ntpData = new byte[48];
//выставляем Leap Indicator, Version Number and Mode values
ntpData[0] = 0x1B; //LI = 0 (без предупреждений), VN = 3 (только IPv4), Mode = 3 (Клиент)
//получаем адрес от днс сервера
var addresses = Dns.GetHostEntry(ntpServer).AddressList;
//Выставляем порт 123 для NTP
var ipEndPoint = new IPEndPoint(addresses[0], 123);
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
//Открываем подключение
socket.Connect(ipEndPoint);
socket.ReceiveTimeout = 3000;
//отсылваем запрос
socket.Send(ntpData);
//Получаем ответ
socket.Receive(ntpData);
socket.Close();
}
//Смещение для перехода в отсек с временем
const byte serverReplyTime = 40;
//получаем первую часть запроса и переводим биты в числа
ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);
//Получаем следующую часть и переводим биты в числа
ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);
//меняем порядок байтов big-endian в little-endian
intPart = SwapEndianness(intPart);
fractPart = SwapEndianness(fractPart);
//получаем кол-во миллисекунд, прошедшее с 1900 года
var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
//переводим время в **UTC**
var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);
return networkDateTime.ToLocalTime();
}
static uint SwapEndianness(ulong x)
{
return (uint)(((x & 0x000000ff) << 24) +
((x & 0x0000ff00) << 8) + ((x & 0x00ff0000) >> 8) +
((x & 0xff000000) >> 24));
}
}
Теперь при вызове метода GetNetworkTime мы будем получать данные с ntp сервера вот, что находится в выводе у меня:

Получение времени с сервера важно для того, чтоб избежать "Читерства " в вашей игре припомощи простого изменения времени на локальном телефоне. Но используя данный код вы лишаете возможности играть в вашу игру тех, у кого нет интернета.
Итак, в данном уроке мы разобрали как узнать реальное время в Unity 5 при помощи ntp сервера для избежания "читерства" при помощи изменения времени на телефоне.
