GalaxyServer:GalaxyNetID

Материал из GreatGalaxy
Перейти к: навигация, поиск

Описание

Сетевой объект - это любой игровой объект (GameObject) , даже пустой, имеющий компонент GalaxyNetID.

Префабы сетевых объектов должны находиться в корне папки /Resources


Параметры GalaxyNetID

Получить доступ к параметрам сетевого объекта: gameObject.GetComponent<GalaxyNetID>().netObject.

  • netObject.id - уникальный идентификатор (в пределах текущей комнаты)
  • netObject.owner_id - владелец объекта
  • netObject.isMy - это ваш объект. На других клиентах этот параметр будет = false.
  • netObject.isHost - этот объект принадлежит хосту комнаты
  • object[] netObject.data - любые пользовательские данные, которые можно передать при создании объекта через api.
  • Vector3 position - положение, последнее присланное сервером значение
  • Quaternion rotation - поворот, последнее присланное сервером значение
  • inited - объект инициализировался сервером, можно с ним работать.

Внимание! Некоторые параметры доступны напрямую, например gameObject.GetComponent<GalaxyNetID>().isMy

Внимание! Любые параметры можно считывать только после того, как объект проинициализируется сервером, узнать это можно: if(inited == true)...

Создание сетевого объекта

Внимание! Сетевой объект не может быть дочерним другого сетевого объекта. Это серьездный недочет, который нужно исправить.


Стандартный способ

Instantiate(GameObject prefab_name, Vector3 position, Quaternion rotation);

На префабе обязательно должен находиться компонент GalaxyNetID


Через API (SendOperation)

GalaxyNetwork.SendOperation.NetObjects.Instantiate(string prefab_name, Vector3 position, Quaternion rotation, object[] data)


Удаление сетевого объекта

Стандартный способ

Destroy(gameObject);


Через API (SendOperation)

// Удаление, указав объект
GalaxyNetwork.SendOperation.NetObjects.Destroy(GGObject netObject);
// Удаление, указав уникальный идентификатор объекта
GalaxyNetwork.SendOperation.NetObjects.Destroy(ushort id);


Перемещение и вращение

Стандартный способ

// Перемещаем
gameObject.Transform.position(Vector3 position);

// Вращаем
gameObject.Transform.rotation(Quaternion rotation);

Так же, можно перемещать и вращать объекты любым возможными в Unity способом


Через API (SendOperation)

// Перемещаем
GalaxyNetwork.SendOperation.NetObjects.Position(GGObject netObject, Vector3 position);
// Вращаем
GalaxyNetwork.SendOperation.NetObjects.Rotation(GGObject netObject, Quaternion rotation);
// Перемещаем и Вращаем
GalaxyNetwork.SendOperation.NetObjects.PositionAndRotation(GGObject netObject, Vector3 position, Quaternion rotation);


Пример

bool setted = false;
GalaxyNetID netId;
void Awake()
{
    netId = GetComponent<GalaxyNetID>();
}
void Update()
{
    if(netId.inited && !setted)
    {
         if(netId.isMy)
         {
             // Это наш объект. Инициализируем.
             //.....
             GetComponent<Rigidbody>().isKinematic = false;
         }
         else
         {
             // Это другой сетевой объект. Инициализируем.
             //.....
             GetComponent<Rigidbody>().isKinematic = true;
         }
            setted = true;
    }
}


Синхронизация переменных

Любую пользовательскую переменную можно сделать синхронизируемой по сети. Т.е. изменение переменной владельцем - отразится на всех клиентах.

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

Способ и скорость синхронизации равен компоненту GalaxyNetID. Интерполяция на синхронизации переменных не влияет.

Способ синхронизации

Для включения синхронизации переменной, всего лишь нужно пометить ее атрибутом NetVar.


Пример

using GalaxyLib;
public class MyScript
{
   int R = 3;   // обычная переменная

   [NetVar]
   int Q = 5;   // синхронизируемая переменная
}

Нюансы. При изменении синхронизируемой переменной, ее состояние не отправляется сразу. Максимальное время ожидания 0..sendRate.

Синхронизировать структуры типа Quaternion, Vector и т.п. на прямую не получится, необходимо синхронизировать каждые элемент структуры:

Пример

public class MyScript
{
   Vector3 myVec;

   [NetVar]
   float MyVec_X;
   [NetVar]
   float MyVec_Y;
   [NetVar]
   float MyVec_Z;
}

void Update()
{
    if(new Vector3(MyVec_X, MyVec_Y, MyVec_Z) != myVec)
    {
        myVec = new Vector3(MyVec_X, MyVec_Y, MyVec_Z);
    }

}

(В разработке) Общение с другими объектами

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

На данный момент общение между объектами в разработке.


Отправка данных

 // Отправляем сообщение любого типа (в данном примере - строка)
 GalaxyNetId.SendData("Hello"));

Где GalaxyNetId это любой сетевой объект (даже не наш), которому мы хотим отправить сообщение.

Так же можно отправлять массив данных.

Чтение данных

if(GalaxyNetId.sendedDataCount > 0)
{
     // читаем одно сообщение
      object data = sendedDataRead;

      // преобразуем в нужный нам тип
      string mes = (string)data;
}

Передача объекта другому клиенту

// Передаем свой объект другому игроку
GalaxyNetwork.SendOperation.NetObject.Transfer(GGObject netObject, uint client_owner_id);

При успешной передаче, произойдет вызов события OnGalaxyObjectTransfer(GGObject netObject);


События

События перемещения и вращения объектов отключены, для повышения производительности. Остальные события работают.




Диаграмма алгоритма




Назад