Избранное Все заметки GitHub icon Мой Github Обо мне
14 заметок с тегом

с#

Позднее Ctrl + ↑

SSL/TLS в Unity

А сегодня мы будем шифровать весь трафик. А зачем? А чтобы усложнить жизнь читерам.

Если у вас мультиплеер на авторитарном сервере, естественно все действия должны контролироваться на нем. Но зная, какие команды отправлять, можно легко написать бота, который автоматизирует некоторые процессы, нарушая баланс и игру «правильных» игроков. Конечно, если сильно захотеть, можно сломать все что угодно, но усложнить жизнь взломщикам и читерам тоже можно. Будем использовать SSL.

Ничего изобретать не буду, потому что «все уже придумано до нас» :)
Для теста серверной части (на node.js) и генерации ключей используем эти скрипты. Единственное, чего там нет — это как из сертификата и ключа сделать PFX файл:

openssl pkcs12 -export -in client.crt -inkey client.key -out mycert.pfx

Этот файл понадобится для клиента. Для проверки SSL соединения берем пример с сокетами с MSDN и немного переделываем его. Получаем поток и прокидываем его через SSL.

IEnumerator UseSSL () {
	NetworkStream stream = new NetworkStream (socket);
	SslStream sslStream = new SslStream (stream, false, new RemoteCertificateValidationCallback (CertificateValidationCallback), new LocalCertificateSelectionCallback (CertificateSelectionCallback));
	bool authenticationPassed = true;		
	#if UNITY_EDITOR
		X509Certificate2 cert = new X509Certificate2(certPath, certPassword);
	#elif UNITY_ANDROID || UNITY_IOS
		WWW reader = new WWW (certPath);
		while (!reader.isDone) 
			yield return null;
		X509Certificate2 cert = new X509Certificate2 (reader.bytes, certPassword);
	#endif
	X509Certificate2Collection certs = new X509Certificate2Collection();
	certs.Add (cert);
	sslStream.AuthenticateAsClient (server, certs, SslProtocols.Tls, true);
	authenticationPassed = sslStream.IsAuthenticated;
	if (authenticationPassed) {
              ///
	}
	yield break;
}

Вот и весь квест. Теперь трафик между игровым сервером и клиентом зашифрован.

Ccылка на Github

2017   git   unity   разработка   с#

Система плагинов для iOS и Android

Простая система плагинов для мобилок. Контроллер инициализирует все плагины и обрабатывает приходящие сообщения. Обмен данными в формате JSON.

Вообще, печаль конечно, что Unity не реализует даже самые простые варианты работы с мобильными платформами, тот же браузер или камера. Может когда-нибудь...

Ссылка на Github

2017   android   ios   plugin   unity   разработка   с#

Cериализация в XML и обратно

Обновлено 17.04.17
Продвинутая версия сериализации в XML, работает в несколько раз быстрее штатной

Как преобразовать объект в строку, например для сохранения или передачи, а потом обратно? Есть две простые функции, которые я использовал в одном из Unity проектов:

public static object Deserialize<T> (string toDeserialize) {
	XmlSerializer xmlSerializer = new XmlSerializer (typeof (T));
	StringReader textReader = new StringReader (toDeserialize);
	return xmlSerializer.Deserialize (textReader);
}

public static string Serialize<T> (T toSerialize) {
	XmlSerializer xmlSerializer = new XmlSerializer (typeof (T));
	StringWriter textWriter = new StringWriter ();
	xmlSerializer.Serialize (textWriter, toSerialize);
	return textWriter.ToString ();
}

Использовать очень просто:

Vectror3 vector = new Vector3 (10f, 10f, 10f); // какой-то объект
string data = Serialize<Vector3> (vector); // преобразовываем в строку
vector = (Vector3) Deserialize<Vector3> (data); // обратно из строки в объект
2017   unity   разработка   с#