Пример кода на Unity
Код — это класс основного бота из мульти-аккаунтного Steam-бота. Здесь используется многопоточность которая позволяет распараллелить несколько задач.
using System; using System.Threading; using SteamApi; namespace TestBot < /// /// Handler сообщений /// /// Уровень логгирования /// Тело сообщения с Markdown разметкой public delegate void TelegramMessageHandler(Telegram.TelegramLog log, string message); /// /// Основной Steam бот /// public class MainBot : SteamBot < private bool working = true; private Thread confirmationThread; /// /// Handler сообщений /// public TelegramMessageHandler MessageHandler; /// /// Инициализирует новый экземпляр класса MainBot /// /// Файл с данными о боте /// Имя бота /// Уровень логгирования public MainBot(string dataFile, string name, LogOptions logging) : base(dataFile, name, logging) < confirmationThread = new Thread(confirmationThreadVoid); >/// /// Запускает поток подтверждений /// public void StartConfirm() < SteamApi.DoLog(«Confirming through proxy»); confirmationThread.Start(); >private void confirmationThreadVoid() < try < while (working) < SteamApi.DoDebug(«Fetching confirmations»); var mainConf = SteamConfirm.GetConfirmations(); foreach (var c in mainConf) < SteamConfirm.AcceptConfirmation(c); >SteamApi.DoDebug(«Confirmation have fetched»); Thread.Sleep(10000); > > catch (Exception e) < SteamApi.DoLog(«EXCEPTION: » + e.Message); SteamApi.DoLog(«EXCEPTION STACK TRACE: » + e.StackTrace); MessageHandler(Telegram.TelegramLog.Errors, string.Format(«Ошибка:n«`n«`», e)); Thread.Sleep(10000); Environment.Exit(-1); > > protected override void mainThreadVoid() < try < while (working) < var incoming = SteamTrade.GetIncomingTradeoffers(); foreach (var offer in incoming) < if (offer.ItemsTo.Count == 0 offer.ItemsFrom.Count >0) < SteamApi.DoDebug(«Got new items from main bot. Accepting. «); SteamTrade.AcceptIncomingTrade(offer.ID.ToString()); SteamApi.DoDebug(«Updating bot inventory»); >else < SteamApi.DoDebug(string.Format(«Strange tradeto satelite from: . Declining. «, offer.From)); SteamTrade.DeclineIncomingTrade(offer.ID.ToString()); > Thread.Sleep(10000); > > > catch (Exception e) < SteamApi.DoLog(«EXCEPTION: » + e.Message); SteamApi.DoLog(«EXCEPTION STACK TRACE: » + e.StackTrace); MessageHandler(Telegram.TelegramLog.Errors, string.Format(«Ошибка:n«`n«`», e)); Thread.Sleep(10000); Environment.Exit(-1); > > /// /// Остановка всех потоков бота (без ожидания завершения) /// public void Stop() < working = false; >> >
Пример 2
MyEvent и EventManager эти скрипты работают в паре друг с другом. Это собственная реализация ивентов. PanelActivityController — демонстрирует работу MyEvent и EventManager. Скрипт принимает конкретный ивент и выполняет указанный набор действий.
Вот как Создать Простую Игру за 10 минуток на Unity / Unity 2d / C# / Как создать игру
Учим Unity за 1 час! #От Профессионала
А конкретно включение отключение панелей.
using UnityEngine; using System.Collections.Generic; using System.Runtime.InteropServices; public class EventManager < //UI public static string SHOW_ERROR_TEXT = «SHOW_ERROR_TEXT»; public static string SET_ACTIVE_PANEL = «SET_ACTIVE_PANEL»; public static string UPDATE_SELECTED_OBJECT_STATS = «UPDATE_SELECTED_OBJECT_STATS»; // GAME public static string SHOW_UNPARRENT_WALL = «SHOW_UNPARRENT_WALL»; public static string CHECK_PARENT_TO_CALC = «CHECK_PARENT_TO_CALC»; public static string UPDATE_MAP_LINE = «UPDATE_MAP_LINE»; public static string DELETE_MENU_OBJ = «DELETE_MENU_OBJ»; public static string CLEAR_ALL_STAFF = «CLEAR_ALL_STAFF»; public static string DELETE_OBJ = «DELETE_OBJ»; public static string SAVE_OBJ = «SAVE_OBJ»; public static string SAVE_OBJ_LOCAL = «SAVE_OBJ_LOCAL»; public static string PARAM_SOURCE = «PARAM_SOURCE»; public static string PARAM_VALUE = «PARAM_VALUE»; public static string PARAM_ACTION = «PARAM_ACTION»; public class EventWrapper < public EventWrapper (OnEvent onEvent) < this.onEvent = onEvent; >public OnEvent onEvent; public delegate void OnEvent (MyEvent myEvent); > public static EventManager instance = new EventManager (); public Dictionary> listeners = new Dictionary> (); void Dispatch (MyEvent customEvent) < ListtempList = new List (); tempList.AddRange (listeners [customEvent.type]); foreach (EventWrapper listener in tempList) < listener.onEvent (customEvent); >> void AddListener (string type, EventWrapper listener) < if (!listeners.ContainsKey (type)) < listeners.Add (type, new List()); > listeners [type].Add (listener); > public void DestroyAllListeners (string type) < if (listeners.ContainsKey (type)) < listeners [type].Clear (); >> void RemoveListener (string type, EventWrapper wrapper) < if (listeners.ContainsKey (type)) < listeners [type].Remove (wrapper); >> public void FireEvent (string type, object parameter) < if (listeners.ContainsKey (type)) < MyEvent event1 = new MyEvent (type, parameter); Dispatch (event1); >> public void FireEvent (string type) < FireEvent (type, null); >public void Listen (string type, EventWrapper handler) < AddListener (type, handler); >public void DestroyListener (string type, EventManager.EventWrapper wrapper) < if (wrapper != null) < RemoveListener (type, wrapper); >else < Debug.Log ( «Null listener for destroy type «); >> >
using UnityEngine; using System.Collections; public class MyEvent < public string type; public object parameter; public MyEvent (string type, object parameter) < this.type = type; this.parameter = parameter; >public MyEvent (string type) < this.type = type; >>
using UnityEngine; using System.Collections; [SerializeField] public enum MenuState < Logo = 0, Enter = 1, Work = 2, Order = 3, Export = 4 >public class PanelActivityController : MonoBehaviour < public MenuState panel; protected GameObject content; EventManager.EventWrapper setPanelActivity; bool isActive = false; void OnEnable() < setPanelActivity = new EventManager.EventWrapper(delegate (MyEvent myEvent) < MenuState sentPanel = (MenuState)myEvent.parameter; UpdatePanelActivity(sentPanel); >); EventManager.instance.Listen(EventManager.SET_ACTIVE_PANEL, setPanelActivity); > void OnDisable() < EventManager.instance.DestroyListener(EventManager.SET_ACTIVE_PANEL, setPanelActivity); >void Start() < content = transform.GetChild(0).gameObject; if (panel == MenuState.Logo) < content.SetActive(true); >else < content.SetActive(false); >> void UpdatePanelActivity(MenuState sentPanel) < if (isActive == false) < if (sentPanel == panel) < content.SetActive(true); isActive = true; >else < content.SetActive(false); isActive = false; >> else < content.SetActive(false); isActive = false; >> >
Источник: appfox.ru
Демонстрационные проекты
Learn more about building ambitious multiplayer games using ECS for Unity and Unity Gaming Services (UGS) with a third-person multiplayer action sample that supports 64+ players.
Enemies
В этом кинематографическом тизере значительно улучшена фотореалистичность глаз, волос, кожи и многого другого — все они прорисовываются в реальном времени и работают в разрешении 4K.
Skid Loader GX7 Configurator
This fully customizable configurator of a GX7 Skid Loader showcases the possibilities of interactive 3D marketing powered by real-time 3D.
Gigaya
Gigaya — это пример игры, созданный командой Unity на базе технологий Unity.
Large scale battle royale with Photon Fusion
This battle royale sample shows how to create and implement the latest features of fast paced multiplayer games.
Boss Room
Создайте небольшую кооперативную игру на основе нашего проекта Boss Room, демонстрирующего возможности сетевой системы.
WiNDUP
Режиссер Ибин Цзян (Yibing Jiang) наполняет жизнью отношения между отцом и его больной дочерью, чтобы подчеркнуть хрупкую природу жизни и любви и целительную силу музыки.
The Heretic
The Heretic — это демофильм с рендерингом в реальном времени, в котором используется множество графических решений Unity, включая все возможные аспекты High Definition Render Pipeline (HDRP).
Megacity
Футуристический живой город с летающими автомобилями, сотнями тысяч высокодетализированных игровых объектов и уникальных источников звука, демонстрирующий достижения DOTS в Unity 2019.1.
Пример шутера от первого лица FPS
Проект многопользовательского шутера от первого лица с полным доступом к исходному коду для изучения или создания собственных игр на его основе.
Книга мертвых
Book of the Dead — это интерактивный фильм от первого лица с рендерингом в реальном времени, созданный демокомандой Unity. Он демонстрирует разработчикам игр возможности Unity 2018 по созданию высококачественной графики.
Neon
В окружении используются модели, загруженные исключительно из Asset Store. Создано с помощью Unity 2017.1, первой версии стека постобработки и пакета объемного освещения.
Adam
Adam — это короткометражка от разработчиков демонстраций Unity с рендерингом в реальном времени. Она была создана для демонстрации и тестирования возможностей графики Unity еще в 2016 году!
The Blacksmith
Blacksmith — короткометражка с рендерингом в реальном времени на основе скандинавских мифов.
Courtyard
Отличный пример возможностей глобального освещения в реальном времени от Unity, доступный для изучения в AssetStore.
Bedroom
Пример архитектурной визуализации, проект для исследования глобального освещения и первый взгляд на технологию отражений в экранном пространстве с трассировкой лучей в Unity.
Viking Village
Готовое для использования в играх окружение, созданное на основе физических шейдеров Unity и библиотеки сканированных текстур Megascans от Quixel. Это окружение также использовалось для тестирования процессов разработки освещения в Unity 5. Проект доступен в AssetStore.
Источник: unity.com