public override void AddComponent(Abstract.IComponent component) { if (AdditionalComponents == null) { AdditionalComponents = new System.Collections.Generic.List <Abstract.IComponent> { component }; } else { AdditionalComponents.Add(component); } }
/// <summary> /// This function is called when the window becomes enabled and active. /// </summary> public static void OnEnable() { properties = new WeaponProperties(); delay = new EditorDelay(0.1f); toolbarItems = new string[] { "First Person Weapon", "Pickable Weapon" }; Transform player = UEditorInternal.FindPlayer(); if (player != null) { inventory = UEditorInternal.FindComponent <AdvancedInventory>(player); } additionalComponents = new List <AdditionalComponents>() { new AdditionalComponents { name = "Crosshair", component = typeof(Crosshair), isActive = true }, new AdditionalComponents { name = "Camera Zoom", component = typeof(FPCameraZoom), isActive = true } }; additionalComponentsRL = new ReorderableList(additionalComponents, typeof(AdditionalComponents), true, true, false, false) { drawHeaderCallback = (rect) => { EditorGUI.LabelField(new Rect(rect.x, rect.y + 1, 200, EditorGUIUtility.singleLineHeight), "Additional Components"); }, drawElementCallback = (rect, index, isActive, isFocused) => { AdditionalComponents additionalSystem = additionalComponents[index]; EditorGUI.LabelField(new Rect(rect.x, rect.y + 2, 100, EditorGUIUtility.singleLineHeight), additionalSystem.name); additionalSystem.isActive = EditorGUI.Toggle(new Rect(rect.width + 10, rect.y + 2, 30, EditorGUIUtility.singleLineHeight), additionalSystem.isActive); additionalComponents[index] = additionalSystem; } }; }
// метод обработки сообщений public static void handleResults(byte[] data, IPEndPoint remoteIp) { // если мы не закончили работу if (!done) { // отправитель string sender = remoteIp.Address.ToString(); // полученное сообщение string message = Encoding.Unicode.GetString(data); string[] msgArr = message.Split('~'); // тип сообщения messageType type = AdditionalComponents.stringToMessageType(msgArr[1]); // текст сообщения message = msgArr[0]; // получатель сообщения string _receiver = msgArr[2]; // если тип сообщения - Join (клиент подключился) if (type == messageType.Join) { // добавляем адрес клиента в список clientAddresses.Add(sender); // увеличиваем счетчик количества подключившихся клиентов clientCount++; // сообщаем о подключении Console.WriteLine("UDP >> Клиент " + sender + " успешно подключен!"); // если все клиенты подключились if (clientCount == clientCountMax) { // ввод с клавиатуры количества массивов для генерации Console.Write(">> Введите количество массивов, которые нужно сгенерировать: "); count = int.Parse(Console.ReadLine()); // отправляем клиентам сообщение о необходимости начала генерации (количество массивов делим на количество клиентов) if (clientAddresses.Count > 0) { //Console.WriteLine(">> Отправка запросов генерации " + (1.1 * count / clientCountMax) + " (+10%) массивов..."); Console.WriteLine(">> Отправка запросов генерации " + (count / clientCountMax) + " массивов..."); for (int i = 0; i < clientAddresses.Count; i++) { //SendMessage((1.1 * count / clientCount).ToString() + "|" + i.ToString(), messageType.TransmissionBegin, clientAddresses[i]); SendMessage((count / clientCount).ToString() + "|" + i.ToString(), messageType.TransmissionBegin, clientAddresses[i]); } } } } // если мы - получатели if (_receiver == AdditionalComponents.LocalIPAddress()) { // если тип сообщения - Data (получили сгенерированные массивы) if (type == messageType.Data) { // разбиение полученного пакета на отдельные (каждый кусок соответствует одному сгенерированному массиву) string[] energyDataStr = message.Split('/'); for (int i = 0; i < energyDataStr.Length - 1; i++) { // содержимое каждого сгенерированного массива List <double> energyData = new List <double>(); // извлечение данных из сообщения string[] energyValues = energyDataStr[i].Split('|'); // конвертация for (int j = 0; j < energyValues.Length - j; j++) { energyData.Add(Convert.ToDouble(energyValues[j])); } // добавление сгенерированного массива в список generatedData.Add(new EnergyInput(energyData)); // сохранение в файл StreamWriter sw = new StreamWriter("generatedData.txt", true); sw.WriteLine(energyDataStr[i].Replace('|', ';')); sw.Close(); } Console.WriteLine("UDP >> Получен пакет данных от " + sender + " длиной " + data.Length + " байт; массивов в пакете: " + (energyDataStr.Length - 1)); } // если тип сообщения - TransmissionEnd (сообщение об окончании передачи) else if (type == messageType.TransmissionEnd) { // извлекаем из сообщения время генерации double time = Math.Round(Convert.ToDouble(message), 2); // если этот клиент потратил на генерацию больше времени, чем какой-либо другой, то записываем это время как новое if (time > totalClientTime) { totalClientTime = time; } // отмечаем в массиве флагов, что клиент закончил генерацию doneByClients[clientAddresses.IndexOf(sender)] = true; Console.WriteLine("UDP >> Клиент " + sender + " завершил передачу данных, сгенерированных за " + time + " секунд!"); // проверяем, все ли клиенты закончили генерацию int c = 0; foreach (bool client in doneByClients) { if (client) { c++; } } // если все клиенты закончили if (c == clientAddresses.Count) { // отмечаем флаг завершения работы done = true; /*double lost = 1.1 * count - generatedData.Count(); * double lostp = 110 * lost / generatedData.Count();*/ // выводим информационные сообщения Console.WriteLine(">> Все клиенты завершили передачу данных!"); Console.WriteLine(">> Сгенерировано массивов: " + count); //Console.WriteLine(">> Сгенерировано массивов: " + generatedData.Count() + " / " + count); //Console.WriteLine(">> Потеряно при передаче: " + Math.Round(lost, 0) + " (" + Math.Round(lostp, 2) + "%)"); /*if (generatedData.Count > count) * { * Console.WriteLine(">> Компенсационные излишки: " + (generatedData.Count() - count)); * generatedData.RemoveRange(count, generatedData.Count - count); * Console.WriteLine(">> Итого массивов: " + generatedData.Count()); * }*/ Console.WriteLine(">> Потрачено времени на выполнение: " + Math.Round(totalClientTime, 2) + " секунд"); Console.WriteLine(">> Нажмите любую клавишу для выхода..."); // выход из программы Console.ReadKey(); Environment.Exit(0); } } } } }
/// <summary> /// Create new weapon by properties. /// </summary> private static GameObject CreateFPWeapon(WeaponProperties properties) { // Initialize gameobjects. GameObject weapon = GameObject.Instantiate <GameObject>(properties.GetWeapon(), Vector3.zero, Quaternion.identity); weapon.name = properties.GetName(); weapon.tag = TNC.WEAPON; weapon.layer = LayerMask.NameToLayer(LNC.WEAPON); for (int i = 0, length = weapon.transform.childCount; i < length; i++) { weapon.transform.GetChild(i).gameObject.layer = LayerMask.NameToLayer(LNC.WEAPON); } // Initialize weapon components. Animator animator = UEditorInternal.AddComponent <Animator>(weapon); WeaponIdentifier weaponIdentifier = UEditorInternal.AddComponent <WeaponIdentifier>(weapon); WeaponAnimationSystem weaponAnimationSystem = UEditorInternal.AddComponent <WeaponAnimationSystem>(weapon); switch (properties.GetWeaponType()) { case WeaponProperties.Type.Gun: { WeaponShootingSystem weaponShootingSystem = UEditorInternal.AddComponent <WeaponShootingSystem>(weapon); WeaponReloadSystem weaponReloadSystem = UEditorInternal.AddComponent <WeaponReloadSystem>(weapon); break; } case WeaponProperties.Type.Melee: { WeaponMeleeSystem weaponMeleeSystem = UEditorInternal.AddComponent <WeaponMeleeSystem>(weapon); break; } case WeaponProperties.Type.Throw: { ThrowingWeaponSystem throwingWeaponSystem = UEditorInternal.AddComponent <ThrowingWeaponSystem>(weapon); WeaponReloadSystem weaponReloadSystem = UEditorInternal.AddComponent <WeaponReloadSystem>(weapon); break; } } AudioSource audioSource = UEditorInternal.AddComponent <AudioSource>(weapon); // Setup Animator component. if (properties.GetController() != null) { animator.runtimeAnimatorController = properties.GetController(); } // Setup WeaponID component. if (properties.GetWeaponID() != null) { weaponIdentifier.SetWeapon(properties.GetWeaponID()); } // Apply components position. UEditorInternal.MoveComponentBottom <Animator>(weapon.transform); UEditorInternal.MoveComponentBottom <WeaponIdentifier>(weapon.transform); UEditorInternal.MoveComponentBottom <WeaponAnimationSystem>(weapon.transform); switch (properties.GetWeaponType()) { case WeaponProperties.Type.Gun: { UEditorInternal.MoveComponentBottom <WeaponShootingSystem>(weapon.transform); UEditorInternal.MoveComponentBottom <WeaponReloadSystem>(weapon.transform); break; } case WeaponProperties.Type.Melee: { UEditorInternal.MoveComponentBottom <WeaponMeleeSystem>(weapon.transform); break; } case WeaponProperties.Type.Throw: { UEditorInternal.MoveComponentBottom <ThrowingWeaponSystem>(weapon.transform); UEditorInternal.MoveComponentBottom <WeaponReloadSystem>(weapon.transform); break; } } for (int i = 0, length = additionalComponents.Count; i < length; i++) { AdditionalComponents component = additionalComponents[i]; if (component.isActive) { weapon.AddComponent(component.component); } } UEditorInternal.MoveComponentBottom <AudioSource>(weapon.transform); return(weapon); }
// метод обработки сообщений private static void ReceiveMessage() { // UdpClient для получения данных UdpClient receiver = new UdpClient(localPort); // подключаемся к широковещательной рассылке receiver.JoinMulticastGroup(serverAddress, 20); // адрес отправителя IPEndPoint remoteIp = null; try { // бесконечный цикл while (true) { // получение сообщения в виде массива байтов byte[] data = receiver.Receive(ref remoteIp); // отправитель string sender = remoteIp.Address.ToString(); // полученное сообщение string message = Encoding.Unicode.GetString(data); string[] msgArr = message.Split('~'); // тип сообщения messageType type = AdditionalComponents.stringToMessageType(msgArr[1]); // текст сообщения message = msgArr[0]; // получатель сообщения string _receiver = msgArr[2]; // мы - получатели if (_receiver == AdditionalComponents.LocalIPAddress()) { // если тип сообщения - TransmissionBegin (начало передачи) if (type == messageType.TransmissionBegin) { // сохраняем IP-адрес сервера serverIP = sender; // извлекаем из сообщения количество массивов для генерации и порядковый номер клиента string[] msg = message.Split('|'); count = Convert.ToInt32(msg[0]); clientNum = Convert.ToInt32(msg[1]); // выводим информационное сообщение Console.WriteLine("UDP >> Получен запрос генерации " + count + " массивов данных от " + sender + ", запуск"); // начинаем генерацию beginGeneration(); } } // если все потоки завершили работу if (abortFlag) { Console.WriteLine(">> Нажмите любую клавишу для выхода..."); Console.ReadKey(); break; } } } catch (Exception ex) { Console.WriteLine("UDP >> " + ex.Message); } finally { receiver.Close(); } }