Unity 5 UNET Chat Example Пример чата

Решил я попробовать написать что-нибудь на низком уровне, так называемом low-level UNET. Попытался смастерить на NetworkConnection-ах сервер и клиент, но не тут-то было… Клиент не отправляет данные и все тут. Начал копать глубже и оказалось, что канал сообщений не отправляется(флешится), т.к. метод этот internal и все тут. Пришлось искать что-то другое. И так я пришел к NetworkServer и NetworkClient.

Первый реализует логику сервера — прослушивает порт и обрабатывает события подключения, отключения, получения данных и их рассылку.

Второй класс — клиент. Подключаемся к серверу, работаем с ним, отключаемся.

В целом, выглядит все хорошо. Чат получилось сделать:)

Unity 5 UNET Урок 2: Синхронизация позиции

Во втором уроке по UNet рассмотрим синхронизацию позиции.

Для синхронизации данных используются переменные с атрибутом SyncVar. Такие переменные можно изменять только на сервере, и изменения рассылаются всем клиентам.

Поэтому, чтобы игрок как отправить изменения позиции на сервер, мы используем команды.

Команды — это методы, которые вызываются на стороне клиента, но исполняются на стороне сервера. Чтобы объявить команду нужно добавить префикс Cmd в названии и атрибут Command. Параметром может быть сколь угодно.

Кроме SyncVar можно использовать сообщения. О них мы поговорит в будущих уроках.

Зарабатываем на рекламе с Unity3D и Appodeal

Каждый хочет получить вознаграждение за проделанную работу. Кто-то монетизирует приложение через встроенные покупки, кто-то делает приложение платным, а кто-то добавляет рекламу. Последний случай очень геморойный — нужно выбрать площадки, с которых брать рекламу; проинтегрировать для каждой площадки СДК; заботиться о fill-rate(заполняемость рекламы). В итоге казалось бы тривиальная задача превращается в рутинный процесс на несколько дней, а то и недель.



К счастью, в последнее время, стали получать распространение площадки-агрегаты. Они сами подключают нужные вам рекламные сети и выдают рекламу через единственное API.

Читать дальше →

Unity3D UNET Урок 1 Подготавливаем проект

Первый урок(не считая вводный конечно) посвящен базовой настройке проекта. Все начинается с того, что нужно добавить стандартный ассет Characters, из которого возьмем в дальнейшем FpsController. Но ближе к телу сети…

Общая концепция UNET такая — есть сервер, а есть клиенты.


Сервером может быть как выделенная машина, так и обычный игрок. Во втором случае его называет хостом(host) — т.е. клиент+сервер.

Остальные игроки присоединяются к серверу и передают все данные через него. Это главное отличие от старой сети, где игроки обменивались данными напрямую.

Читать дальше →

Unity3D UNet Урок 0 Введение

Всем привет! Наконец-то дошли руки записать уроки по UNET. Вообще, сеть хорошая, но пока сырая. Однако знакомиться нужно уже сейчас. Дальше будет много вкусных плюшек от юнитястов, так что нужно подготовиться и заучить азы сети.

Коротко в уроке:
  • Где найти материал
  • Какая версия Unity3D подходит для UNET

Первый урок тут

Extensions методы для Photon Cloud и Unity3D

Одно из самых популярных свойств в PhotonCloud является CustomProperties для игроков и комнат.

Обычно их используют вот так:

        PhotonNetwork.player.SetCustomProperties(new Hashtable
        {
            {"points", 0},
            {"name", Storage.PlayerName},
        });


Здесь есть много минусов:
1. Всегда нужна задавать новое имя для синхронизации(+1 переменная)
2. Дублировать код для получения и записи значения
3. Приведение типов…

Воспользуемся методами расширений. Пишем enum и сами методы:

//список свойств для каждого игрока, которые нужно синхронизировать по сети
public enum PlayerProperty
{
    Kills,
    Dies,
    Name,
    Skin,
    WeaponLeft,
}

//методы расширения для PhotonPlayer
public static class PhotonPlayerExtensions
{
    //установить значение
    public static void Set<T>(this PhotonPlayer player, PlayerProperty prop, T val)
    {
        var props = new Hashtable();
        props["p" + (int)prop] = val;
        player.SetCustomProperties(props);
    }
    //получить значение
    public static T Get<T>(this PhotonPlayer player, PlayerProperty prop)
    {
        object val;
        if (player.customProperties.TryGetValue("p" + (int)prop, out val))
        {
            return (T)val;
        }

        return default(T);
    }
}


Очень просто расширять, никогда не будет дублирования ключа и удобно. Кому надоедает делать приведение типов, можете добавить пару тех же методов установки и получения значения.

Пример где-то в коде игры:


var kills = photonView.owner.Get<int>(PlayerProperty.Kills);
kills++;
photonView.owner.Set(PlayerProperty.Kills, kills);


Я привел пример для игроков, но таким же образом можно добавить методы и для комнат.

Удачи!

Размер admob bannera в Unity3D

Привет. Пока не забыл что и как делал, поделюсь хаком:)

В адмобе есть баннер 320х50 dp. Нам нужно отобразить его вверху экрана, а под ним кнопку. Если баннера нет, то сдвигаем кнопку вверх.

Вроде все просто, так? Знаем, осталось перевести по формуле в пиксели:

var pixelsHeight = 50 * Screen.dpi / 160f;

Но хер там! Есть еще кое что, о чем не написано(или я плохо искал). Если запустить этот код на смартфоне 480 х 800 с dpi 160, то ничего работать не будет:) Потому что теперь баннер стал 480x75dp. На планшетах всегда берется баннер 320х50 dp. Потратив на танцы с бубном не один час времени, делюсь решением проблемы:

Где то в и-нетах ходит вот такой классик:

using System;
using UnityEngine;
using System.Collections;

public static class DisplayUtils
{
    private const float DEFAULT_DPI = 160.0f;

    private const float MIN_TABLET_INCHES = 6.8f;

    public static int DpToPixel(this int dp)
    {
        // Convert the dps to pixels
        return (int)(dp * GetScale() + 0.5f);
    }

    public static int DpToPixel(this float dp)
    {
        // Convert the dps to pixels
        return (int)(dp * GetScale() + 0.5f);
    }

    public static int PixelToDp(this int px)
    {
        // Convert the pxs to dps
        return (int)(px / GetScale() - 0.5f);
    }

    public static int PixelToDp(this float px)
    {
        // Convert the pxs to dps
        return (int)(px / GetScale() - 0.5f);
    }

    private static float GetDPI()
    {
        return Screen.dpi == 0 ? DEFAULT_DPI : Screen.dpi;
    }

    private static float GetScale()
    {
        return GetDPI() / DEFAULT_DPI;
    }

    public static bool DeviceIsTablet()
    {
        float inches = (float)Math.Sqrt(Math.Pow(Screen.width / GetDPI(), 2) + Math.Pow(Screen.height / GetDPI(), 2));
        return inches > MIN_TABLET_INCHES;
    }
}


Наша логика:

    private float GetHeight(float pixelsScaler)
    {
        float w = Mathf.Min(Screen.height, Screen.width);//screen width

        float halfBannerSize = new Vector2(160,25);// --> 320x50 / 2

        float scaledHeight = Mathf.Floor(w / halfBannerSize.x) * halfBannerSize .y; //узнаем во сколько раз заскейлился баннер по горизонтали, т.к. скейлиться он кратно 160.

        //tablet
        if (DisplayUtils.DeviceIsTablet())
            return pixelsScaler * (halfBannerSize .y * 2f).DpToPixel();

        //phone
        return pixelsScaler * scaledHeight;
    }


pixelsScaler — это множитель. Я использовал ngui и у меня была жестко задана высота в 1136 пикселей. Так что я передавал в функцию значение:

    float h = Mathf.Max(Screen.height, Screen.width);
    float adj = 1136f / h;//1136 - UI высота

    var height = GetHeight(adj);//это уже UI координаты

    


Странно то, как скейлится баннер и что приходится делить пиксели на dp(когда считаем scaledHeight). Может кто-то нашел вариант лучше? или хотя бы объяснит почему так оно работает?)

Подробнее о сетевом протоколе передачи данных в Unity3D

Примечание от автора:
Вольный перевод статьи с блога

О том, что такое UNET можно прочесть здесь. В этой статье рассмотрим протокол передачи данных в UNET.

Когда мы начали проектировать новую сетевую библиотеку для Unity, мы хотели понять, какой она должна быть в идеале. Мы разделили наших пользователей на две группы:

1. Пользователи, которые хотят получить инструмент для настройки сети, требующий минимум усилий и затрат для настройки (в идеале, без усилий вообще).

2. Пользователи, которые работают с сетевыми играми и желающие иметь мощный и гибкий инструмент.

Основываясь на этих группах, мы разделили нашу сетевую библиотеку на две различные части: HLAPI (high-level(высокоуровневый) API) и LLAPI (low-level(низкоуровневый) API).

Читать дальше →

NGUI Next-Gen UI 3.8.0



В данной теме буду публиковать обновления для плагина NGUI для Unity3. Если хотите получать сообщение об обновлении, подписывайтесь на тему.

Ссылка на assetstore — перейти

NGUI 3.8.0: скачать

Если вам понравился плагин, рекомендую купить его!