Jump to content

Константин Орлов

Administrators
  • Content Count

    1177
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by Константин Орлов

  1. Константин Орлов

    C# как сделать парсер в Visual Studio

    AngleSharp - операторы Что и как можно изъять из ссылки? У вас есть некий тип IElement, который получается, если спарсить IHtmlDocument iHtmlDocument (первое тип, второе имя переменной). В foreach вы можете обратиться так: foreach (IElement element in iHtmlDocument.QuerySelectorAll("a")) { ShowContent(element.Text()); ShowContent(element.GetAttribute("href")); ShowContent(element.TextContent); ShowContent(element.InnerHtml); break; } ShowContent моя функция, аналог вывода на консоль. В данном примере я спарсил html-документ, и через цикл обращаюсь к каждому тегу "a" этого документа. Вот что возвращает каждый из них: //Заголовок ссылки element.Text(); //Власти Петербурга объявили конкурс на реконструкцию СКК //URL ссылки element.GetAttribute("href"); //https://www.google.com/url?rct=j&sa=t&url=https://tass.ru/ekonomika/6962147&ct=ga&cd=CAAYADIZYjJmNjRkMWRiZjlhZjBmOTpydTpydTpSVQ&usg=AFQjCNFv6VH4P64l-HFUtm-BENZDLMkBTg //весь текс (в данном случае это тоже заголовок) element.TextContent; //Власти Петербурга объявили конкурс на реконструкцию СКК //HTML который находится внутри элемента element.InnerHtml; //Власти Петербурга объявили конкурс на <b>реконструкцию</b> СКК //HTML который находится вокргу элемента element.OuterHtml; // <a class="result_title_link" href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://tass.ru/ekonomika/6962147&amp;ct=ga&amp;cd=CAAYADIZYjJmNjRkMWRiZjlhZjBmOTpydTpydTpSVQ&amp;usg=AFQjCNFv6VH4P64l-HFUtm-BENZDLMkBTg" tabindex="0" target="_blank">Власти Петербурга объявили конкурс на <b>реконструкцию</b> СКК</a> Сложные запросы LINQ C# AngleSharp Пример: var resultParsing = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("result_title_link")); //получаем из HTML-документа все теги нужного типа private IEnumerable<AngleSharp.Dom.IElement> ParseAllHeaders(IHtmlDocument document) { //ищем все теги "a" (ссылки) var resultParsing = document.QuerySelectorAll("a") //проверка на Null, что у ссылки есть поле "class" .Where(item => item.ClassName != null //выбираем только ссылки с классом из такого названия && item.ClassName.Contains("result_title_link")); //возвращаем результат return resultParsing; }
  2. Константин Орлов

    C# как сделать парсер в Visual Studio

    В данный момент я пишу парсер C# на Selenium, довольно тормозная штука, если необходимо спарсить со страницы несколько тысяч элементов. У меня страница на 3800 ссылок. Уже минут 20 Селением занимается следующей штукой - находит по заголовкам ссылку, переходит на 2 родительских элемента вверх, и добавляет этот элемент в список List<IWebElement>. Это прямо капец как медленно, но причина в том, что элементов много и делается это как бы не напрямую через код, а как бы через драйвер. По крайней мере мне кажется, что в этом причина. Ну и еще в том, что каждый раз, чтобы найти нужную ссылку ему приходится брать заголовок (их 2200 уникальных) и сравнивать со всеми 3800 ссылкам на странице, и так 2200 раз. А еще Selenium WebDriver мне не нравится тем, что он, сцука, найдя элемент (например, блок div или ссылку) не может просто ее сохранить в виде кода, то есть как бы кешировать для своей дальнейшей работы (сам код он может предоставить). И если я обращаюсь к элементу, то он заново опрашивает браузер, то есть он хранит лишь ссылку на элементы (IWebElement), но не сами элементы. И еще - основные посты про Selenium в интернете за 2012-14 годы...
  3. Выпадающий список в Visual Studio Windows Forms называется ComboBox. Как создать перечисление в коде C#? Вы можете создать перечисление в "public partial class FormMain : Form", например: public enum ParsingMode { AllHeaders = 0, AllTagA = 1, Test = 2 }; Как выставить значение в комбобокс по енам? Создать в редакторе форм выпадающий список, а потом в коде задать, чтобы его пункты были составлены из enum: //установить в выпадающий список варианты выбора типа парсинга comboBoxTypeParsing.DataSource = Enum.GetValues(typeof(ParsingMode)); Как считать с комбо бокса, какой пункт был выбран в форме? Вот пример из моего парсера, функция, которая возвращает один из "перечислителей" (один из вариантов) перечисления: /// <summary> /// Считать значение с выпадающего меню с выбором типа парсинга /// </summary> /// <returns>Перечислитель вариантов</returns> private ParsingMode ReadComboBoxTypeParsing() { //создаем переменную, куда считаем данные с выпадающего списка с типом парсинга ParsingMode selectedTypeParsing; //читаем, что выбрал пользователь в выпадающем меню типа парсинга Enum.TryParse(comboBoxTypeParsing.SelectedValue.ToString(), out selectedTypeParsing); //возвращаем, что выбрал пользователь return selectedTypeParsing; }
  4. Программа подсчитывает, что будет, если каждое поколение будет рожать определенное количество детей. При условии, что люди не умирают от болезней и т.п. Для простоты подсчета считается, что родители тут же умирают, как дают потомство. Настраивается количество детей, изначальное количество пар и продолжительность одного поколения. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Globalization; //для языков namespace Generation_Human_Count { public partial class GenNumanCount : Form { public GenNumanCount() { InitializeComponent(); } private void GenNumanCount_Load(object sender, EventArgs e) { /// <summary> /// Всего человек (1 пара - 2 человека) /// </summary> decimal population = 24; /// <summary> /// Продолжительность поколения в годах /// </summary> int generationLength = 25; /// <summary> /// Количество детей в семье /// </summary> int childCount = 4; /// <summary> /// Количество шагов размножения /// </summary> int generationCount = 80; //очистить текст из текстбокса textBox.Text = ""; //вывест входную информацию расчетов textBox.Text += "Изначально человек: " + population + ".\nПродолжительность поколения: " + generationLength + ".\nКол-во детей в семьях: " + childCount + ".\nПодсчитано поколений: " + generationCount + "\n\n"; //проходим все поколения и подчитываем численность for (int i = 1; i < generationCount + 1; i++) { //увеличиваем популяцию (делим на пары и умножаем на кол-во детей) //для простоты считается, что родители сразу умирают при рождении детей population = (population / 2) * childCount; //закоменчено так как просто сохранил такой формат, может пригодится. //string populationText = population.ToString("N3", CultureInfo.GetCultureInfo("ru-RU")); //вывести количество людей в популяции на текущем шаге textBox.Text += "Поколение " + i + ") " + i * generationLength + " год. Чел: " + population.ToString("N0") + "\n"; } } } } Для установки программы в Visual Studio - создайте приложение Windows Form, в форме сделайте Label для ввода текста. Скопируйте код в свой проект, и настройте переменную textBox, чтобы она принимала текст для вывода (возможно, вам нужно будет указать вместо textBox свой Label). Либо просто скачайте готовое решение для VS. Generation Human Count.rar
  5. Константин Орлов

    Unity: Инвентарь и крафт

    Привет! Все пропало, я со временем (если будет время) все выложу, и с видео и скрипты инвентаря нормальные. Когда напишу...)
  6. Константин Орлов

    Unity: Инвентарь и крафт

    Два урока по Unity, как сделать инвентарь с крафтом, использованием и одеванием предметов. Первый о том, как установить готовый скрипт, второе видео с разбором кода скриптов. Скачать скрипты и префабы https://yadi.sk/d/Qf1FHNkr3YjZgK или InventoryCraft.rar 1:36 Установка инвентаря в Unity 2:57 Как спозиционировать предметы в руке (детальней это объяснено в видео от Стрима) 3:47 Как сделать свою поднимаемую вещь 0:18 InventoryPickUp.cs - скрипт для игрока с OnCollisionEnter 1:36 InventoryManager.cs - главный скрипт инвентаря 2:20 переменная с предметами инвентаря и ее методы ("свойства") 3:40 переменные скрипта 8:81 метод Start() 11:43 PickUpOnCollisionEnter() и PuckUpItemRaycastMouse() (да-да, pUckup) - поднимание по соприкосновению и райкасту 18:53 метод Update() 19:15 OpenInventor() и CloseInventory () открытие и закрытие (+ про паузу) 21:06 FillCellsUIFromList() и ClearCellUI() - заполнение и очищение UI от иконок предметов 25:27 RemoveItemInventory() выкидывание 27:50 DropZone() зона выброса предметов 29:48 UseItemInventory() использовать/одеть предмет 34:02 TakeInHand() взять предмет в руку 38:06 InventoryIcon.cs - иконки в инвентаре 40:40 интерфейсы для UI-элементов 41:35 IBeginDragHandler - OnBeginDrag 44:49 IDragHandler - OnDrag 45:04 IEndDragHandler - OnEndDrag 47:56 IPointerClickHandler - OnPointerClick 49:41 InventoryCell.cs - для ячеек (места под иконки) инвентаря 49:58 интерфейс IDropHandler (OnDrop) 52:39 InventoryItem.cs - для поднимаемых предметов 53:00 enum перечисления типов предметов 54:20 InventoryItemHand.cs - для предметов, которые можно взять в руку 55:00 InventoryCraft.cs - крафт 58:26 UpdateCraft() функция крафта Видеоуроки Стрима по созданию инветаря на Unity с нуля: Как сделать игру на Unity 5 #16 создание инвентаря - https://www.youtube.com/watch?v=Y-OpWcRhgJ0 Как сделать игру на Unity 5 #17 Инвентарь и предметы - https://www.youtube.com/watch?v=wgl69JPczG0 Unity 5, уроки по заявкам #1 крафт - https://www.youtube.com/watch?v=_syz8dGJ5yk Эти уроки полезно изучить дополнительно, так как там рассказываются некоторые детали создания UI-инвентаря, которые не раскрыты в двух видео выше. По этим урокам я сделал инвентарь, а потом улучшил его и исправил баги, поэтому чтобы лучше понимать базовые принципы работы инвентаря, стоит посмотреть и их (для новичков). Ознакомление с кодом скриптов (для работы инвентаря в Unity3d нужна еще настройка UI (создание панели с ячейками и т.п.), ее префаб можно скачать выше вместе со скриптами). А тут просто выложен код для ознакомления: InventoryManager.cs InventoryPickUp.cs InventoryItem.cs InventoryItemHand.cs InventoryIcon.cs InventoryCell.cs InventoryCraft.cs
  7. Простой скрипт с префабом, который создает как бы робота пылесоса. Ничего особо не делает, просто ходит по комнате и при встрече с коллайдером меняет направление движения. Для установки просто вынесите префаб на сцену, и выставьте положение над полом (по наклонным поверхностям не ездит). Баг - иногда может пройти сквозь стены. Скрипт. Можно самому сделать на основе скрипта объект, а может скачать ассет. using UnityEngine; using System.Collections; /// <summary> /// Робот пылесос, тупо ходит по комнате и отскакивает от препятствий /// </summary> public class RobotVacuumCleaner : MonoBehaviour { /// <summary> /// скорость передвижения /// </summary> public float speed = 3.0f; /// <summary> /// расстояние до препятствия, когда робот повернется /// </summary> public float obstacleRange = 5.0f; void Update() { //передвигает робота вперед transform.Translate(0, 0, speed * Time.deltaTime); //пускаем луч, чтобы определить препятствие впереди Ray ray = new Ray(transform.position, transform.forward); RaycastHit hit; //если впереди по определенной окружности луча что-то есть if (Physics.SphereCast(ray, 0.75f, out hit)) { //если дистанция ниже минимальной допустимой if (hit.distance < obstacleRange) { //выбираем случайно на какой градус повернуться float angle = Random.Range(-110, 110); //поворачиваемся transform.Rotate(0, angle, 0); } } } } RobotVacuumCleaner Робот пылесос.unitypackage
  8. Если в Unity консоль спамит - is never assigned to, and will always have its default value null, то значит, что Юнити думает, что переменной никогда не присваивается значение, хотя оно может присваиваться в инспекторе. Чтобы избежать этого просто изначально присвойте значение, например, даже тот же null. Вроде такого Вместо /// <summary> /// Ссылка на элемент текста в префабе для вывода контента /// </summary> [SerializeField] private Text textContent; Поставьте так /// <summary> /// Ссылка на элемент текста в префабе для вывода контента /// </summary> [SerializeField] private Text textContent = null;
  9. Константин Орлов

    Unity: UI шпаргалка по скриптам интерфейса

    Не позволяет окнам выходить за разрешение экрана Алгоритм не самый удачный, но сохраню это здесь, вдруг приходится. //сколько пикселей от конца экрана безопасная зона, куда будет возвращено окно //при перетаскивании за край экрана int pixeSafeZone = 35; //скрипт должен быть на объекте, и вызываться должна эта функция дял проверки выхода за экран private void CheckOutScreen() { #region //не позволяет окнам выходить за разрешение экрана //если окно вышло по иску за пределы экрана вправо if (transform.position.x > Screen.width) { //возвращаем его в пределы экрана transform.position = new Vector3(Screen.width - pixeSafeZone, transform.position.y); } //если окно вышло по иску за пределы экрана влево else if (transform.position.x <= 0) { //возвращаем его в пределы экрана transform.position = new Vector3(pixeSafeZone, transform.position.y); } //если окно вышло по игреку за пределы экрана вверх if (transform.position.y > Screen.height) { //возвращаем его в пределы экрана transform.position = new Vector3(transform.position.x, Screen.height - pixeSafeZone); } //если окно вышло по игреку за пределы экрана вниз else if (transform.position.y <= 0) { //возвращаем его в пределы экрана transform.position = new Vector3(transform.position.x, pixeSafeZone); } }
  10. Константин Орлов

    Unity: UI шпаргалка по скриптам интерфейса

    В этой теме публикуются интересные и полезные функции UI скриптов в Unity (Unity3d). UI - User Interface.
  11. Константин Орлов

    Unity: UI шпаргалка по скриптам интерфейса

    Как изменить позицию UI-элемента (окна, кнопки т.п.) в Юнити? gameObject.transform.position = new Vector2(transform.position.x + 190, transform.position.y); Пример кода, который по иксу двигает элемент пользовательского интерфейса на 190 пикселей. Y остается таким же (так как туда вводится та же координата, которой Y сейчас соответствует). Но при смене разрешения такой подход может привести к тому, что элемент окажется за экраном, так как это позиция в пикселях. Второй способ перетаскивания в UI Есть второй способ, который считывает движение мыши (я так понимаю мыши передает лишь +1 либо -1), но окно движется очень медленно и ускорение мышки влияет так, что окно отстает: transform.position += new Vector3(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); Нормальный способ перетащить окно в Unity А вот это похоже на что-то вменяемое, нужно реализовать интерфейс (ищите инфу что за интерфейсы по началу перетаскивания, в процессе и в конце): public void OnDrag(PointerEventData eventData) { transform.position += (Vector3)eventData.delta; }
  12. Скрипт, который позволяет стрелять различными примитивами, просто вешайте на камеру. В инспекторе можно выбрать тип снаряда и также тип полета (полет по физике или сразу появление снаряда в нужной точке). Также есть галочка с настройкой свечения (лапочка) у снарядов (просто по приколу). Первый скрипт вешайте на камеру, больше ничего не нужно. Со вторым ничего делать не надо, просто положить в проект. Не забудьте назвать файлы по названию скриптов. Код откомментирован, поэтому также может научить вас пользоваться выстрелами, создавать примитивы (без префабов), настраивать их немного в коде. Первый. Скрипт выстрела using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// стеляет снарядами из примитивов, учит создавать примитивы без префабов /// и выбирать их через enum. тип снаряда выбирается в инспекторе, /// вешается на камеру. /// </summary> public class FoamShootPrim : MonoBehaviour { /// <summary> /// Все возможные снаряды /// </summary> enum TypeShell { Cube = PrimitiveType.Cube, Sphere = PrimitiveType.Sphere, Cylinder = PrimitiveType.Cylinder, Capsule = PrimitiveType.Capsule, } /// <summary> /// Какой снаряд выбран для стрельбы в данный момент /// </summary> [SerializeField] TypeShell typeShell = TypeShell.Cylinder; /// <summary> /// Все возможные типы стрельбы /// </summary> enum TypeShooting { Fly, Teleport } /// <summary> /// Какой тип стрельбы выбран сейчас (задается в редакторе) /// </summary> [SerializeField] TypeShooting typeShooting = TypeShooting.Fly; /// <summary> /// камера игрока, откуда пускаем луч (для типа стрельбы Teleport) /// </summary> private Camera cameraPlayer; /// <summary> /// Светиться ли снарядам /// </summary> [SerializeField] bool isLuminescent = false; void Start() { //найти камеру cameraPlayer = GetComponent<Camera>(); } void Update() { //если нажата левая кнопка мышки if (Input.GetMouseButtonDown(0)) { //стреляем Shooting(); } } /// <summary> /// выстрел, создает объект (снаряд) /// </summary> private void Shooting() { //выбираем, какой снаряд создавать switch (typeShell) { case TypeShell.Cube: CreateShell(PrimitiveType.Cube); break; case TypeShell.Sphere: CreateShell(PrimitiveType.Sphere); break; case TypeShell.Cylinder: CreateShell(PrimitiveType.Cylinder); break; case TypeShell.Capsule: CreateShell(PrimitiveType.Capsule); break; default: Debug.Log("Поступил некорректный снаряд, выбрана Sphere"); CreateShell(PrimitiveType.Sphere); break; } } /// <summary> /// Создает снаряд /// </summary> /// <param name="shell">тип примитива (снаряда)</param> void CreateShell(PrimitiveType shell) { //выбираем тип стрельбы if (typeShooting == TypeShooting.Fly) { Fly(shell); } if (typeShooting == TypeShooting.Teleport) { Teleport(shell); } } void Fly(PrimitiveType shell) { //создаем примитив снаряда GameObject shellInstantiate = GameObject.CreatePrimitive(shell); //выставляем ей позицию как у игрока, но на 1 метр вперед, чтобы не цеплялась за его коллайдер shellInstantiate.transform.position = transform.position + transform.forward; //выставляем градус направления shellInstantiate.transform.rotation = transform.rotation; //делаем объект физическим shellInstantiate.AddComponent<Rigidbody>(); //добавляем на него скрипт с его поведением shellInstantiate.AddComponent<FoamShellPrim>(); //если надо подсвечивать снаряд if (isLuminescent) OnLuminescent(shellInstantiate); } void Teleport(PrimitiveType shell) { //определяем центр экрана, откуда стрелять Vector3 point = new Vector3(cameraPlayer.pixelWidth / 2, cameraPlayer.pixelHeight / 2, 0); //пускаем луч оттуда Ray ray = cameraPlayer.ScreenPointToRay(point); //сюда сохраним инфу о попадании луча RaycastHit hit; //если луч куда-то попал if (Physics.Raycast(ray, out hit)) { //создаем примитив GameObject shellInstantiate = GameObject.CreatePrimitive(shell); //переносим в нужное место shellInstantiate.transform.position = hit.point; //если надо подсвечивать снаряд if (isLuminescent) OnLuminescent(shellInstantiate); } } void OnLuminescent (GameObject shellInstantiate) { //делаем объект маленьким shellInstantiate.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f); //добавляем свечение shellInstantiate.AddComponent<Light>(); } } Второй (скрипт снаряда) using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// скрипт для снаряда, прилипающего к коллайдерам, имеет импульс (выстрел) /// учит пользоваться импульсом и всякой хрени /// </summary> public class FoamShellPrim : MonoBehaviour { /// <summary> /// скорость полета снаряда /// </summary> private float speedShell = 15; void Start() { //придать импульс GetComponent<Rigidbody>().AddForce(transform.forward * speedShell, ForceMode.Impulse); } //при соприкосновении прилипнуть (заморозиться) private void OnCollisionEnter(Collision collision) { //игнорируем касания игрока (снаряд от него отскакивает, а не проходит сквозь) if (collision.transform.tag != "Player") { //замораживаем снаряд Destroy(gameObject.GetComponent<Rigidbody>()); } } // Update is called once per frame void Update() { } } FoamShellPrim.cs FoamShootPrim.cs
  13. Константин Орлов

    Unity: шпаргалка по тексту и String

    Метод String.Trim () Полезная штука, если нужно удалить из текстовой переменной лишние символы, вроде лишних пробелов на начале или конце строки текстового файла, либо любые другие символы, хоть звездочки, хоть кавычки.
  14. Константин Орлов

    Unity: UI шпаргалка по скриптам интерфейса

    Видеоуроки по UI в Unity: Динамический список со скроллом. Unity3d UI (ScrollView Adapter) Перемещение UI объектов мышкой
  15. Константин Орлов

    Unity: UI шпаргалка по скриптам интерфейса

    Как масштабировать UI в Юнити под разрешение экрана? В Canvas необходимо выбрать режим Scale With Screen Size. На любом канвасе автоматически есть компонент Canvas Scaler, режим выставляется там. После этого все дочерние элементы пользовательского интерфейса будут уменьшаться пропорционально Y-разрешению экрана. В самих элементах, возможно, нужно будет поколдовать с RectTransform, точно не помню, вроде что-то с Pivot и привязкой (попробуйте привязать изначально к верху середины).
  16. Константин Орлов

    Unity: UI шпаргалка по скриптам интерфейса

    Дочерние окна тоже цепляются мышкой, что делать? Перетаскивание окон в Юнити можно сделать круче и исправить некоторые недостатки, что есть в движке. Например, если сделать у окна лишь определенную зону, за которую можно цепляться (например, заголовок окна), и у этой зоны сделать дочерним объект (любой элемент, например, Panel), то панель тоже будет цепляться курсором, что далеко не всегда нужно. Исправляется это так: Задача: сделать так, чтобы только один элемент (заголовок) был зоной для перетаскивания, а его дочерние UI-элементы нет. Решение: вешаем этот скрипт на нужный элемент для перетаскивания, а также на тот, который перетаскивать не надо (он будет перетаскиваться вместе с родительским (заголовком)), но у дочернего убираем галочку на isDragging: Окно в Unity вышло за пределы экрана, как вернуть назад? Вышеописанный скрипт также содержит метод, который возвращает в зону разрешения экрана окно, если оно вышло за пределы координат. Срабатывает проверка автоматически при завершении перетаскивания.
  17. Константин Орлов

    Unity: UI шпаргалка по скриптам интерфейса

    Как сделать, чтобы в Unity окно можно было перетаскивать? Перетаскивание окон. Это работает не только с окнами, но и любыми элементами интерфейса (UI). Нужно просто реализовать интерфейс (термин из C#) и событие. Вот самый простой пример: Вешаете этот скрипт на UI-элемент в Юнити, и теперь при перетягивании его мышкой он будет менять свое положение на экране.
  18. Константин Орлов

    Полезные ссылки для Unity (видеоуроки и скачка)

    Новые полезные ссылки для Unity 2019: Скрипт для редактора - устанавливает Pivot модели с мешем. Добавляем субтитры в игру Создание игровых уровней: советы и хитрости (часть 2) - еще не читал, но выглядит очень грамотной статьей Unity3D Editor: советы и трюки - в конце про подписчиков на событие в инспекторе УЧЕБНИК ПО НОВОМУ GUI В UNITY. ЧАСТЬ 1. Создание панели умений. Часть 1. Работа с Unity UI.
  19. Полезные ресурсы для изучения Unity и c# Статьи по Unity и C# Статьи, которые мне захотелось сохранить, чтобы прочитать потом, либо потому, что очень полезные:
  20. Константин Орлов

    Unity методы доступа к скриптам и объектам

    Как получить ссылку на объект, имеющий определенный скрипт //покажу на примере, как я находил скрипт контроллера игрока на сцене, //в другом скрипте (который хочет получить ссылку на контроллер) пишем: FirstPersonAIO firstPersonAIO; //ссылка на скрипт контроллера от первого лица void Start() { //берем переменную, которая будет ссылкой на нужный нам объект //присваиваем ей значение (=) такое: найти объект типа FirstPersonAIO (FindObjectOfType(typeof(FirstPersonAIO))) //после чего привести его в этот же тип ( as FirstPersonAIO) firstPersonAIO = FindObjectOfType(typeof(FirstPersonAIO)) as FirstPersonAIO; } //после этого переменная firstPersonAIO будет ссылаться на компонент FirstPersonAIO, находящийся на вашем объекте //учтите, что этот способ находит первый попавшийся объект типа FirstPersonAIO (FirstPersonAIO.cs), если он //всего один на сцене, то проблем не будет. Также он должен быть активен.
  21. Рассмотрим, как в Unity на языке C# получать доступ из одного скрипта к переменным и функциям других скриптов. Юнити: Как обратиться к другому скрипту на том же объекте GetComponent<DrygoiScript>().peremennayaScripta = 5; Эта "команда" обращается к другому скрипту, который в виде компонента висит на том же объекте, что и скрипт, где вы это пишете. У этого скрипта есть переменная с именем peremennayaScripta, ей присваивается значение 5. Так можно обращаться к любым компонентам вашего игрового объекта, начиная от ваших скриптов, висящих на нем, и заканчивая обычными юнитивскими компонентами - Rigitbody, Animator, Transform и прочими. Unity: Как получить ссылку на другой скрипт с одного объекта Но вы можете не писать каждый раз "команду" GetComponent<>, а создать переменную для ссылки на компонент. Пишете: DrygoiScript peremennayaSsilkaNaDrygoiScript = GetComponent<DrygoiScript>(); Вы тут сначала создали переменную с именем peremennayaSsilkaNaDrygoiScript и тип переменной DrygoiScript (что означает, что туда можно поместить только ссылку на DrygoiScript, но не на любой другой скрипт). Потом вы через знак "=" присвоили этой переменной ссылку на DrygoiScript, который висит на том же объекте, что и этот скрипт с кодом. Теперь вы можете написать: peremennayaSsilkaNaDrygoiScript.peremennayaScripta = 5; Через peremennayaSsilkaNaDrygoiScript произойдет обращение к тому скрипту (это аналогично GetComponent<DrygoiScript>()), и его переменная peremennayaScripta установится в значение 5. Unity3d: как получить ссылку на другой объект На другом объекте может висеть нужный вам скрипт, и вы хотите изменить его переменные или вызвать его функцию из другого скрипта? Тогда сначала нужно получить ссылку на него. Для этого создаете переменную в исходном скрипте: public GameObject ssilkaNaObject; Тут вы создали публичную переменную (теперь она будет видна в инспекторе) с типом GameObject (это базовый тип для любого объекта на сцене) и именем ssilkaNaObject. Теперь в инспектор вы можете перетянуть в нее нужный вам объект. Но надо еще получить ссылку на конкретный компонент (скрипт или еще что-либо навешанное на него) этого объекта. Например, на объекте висит скрипт с именем DrygoiScript, и вы хотите получить к нему доступ: ssilkaNaObject.GetComponent<DrygoiScript>().peremennayaScripta = 5; Тут вы по ссылке ssilkaNaObject обращаетесь к объекту, который перетянули в инспекторе в переменную ssilkaNaObject, и далее обращаетесь к конкретному компоненту GetComponent<DrygoiScript>(), это нужный вам скрипт, и меняете у этого скрипта переменную под названием peremennayaScripta на 5. Аналогично с вызовом какой-либо функций: ssilkaNaObject.GetComponent<DrygoiScript>().MyFuction(); Тут вы вызвали функцию с именем MyFuction() в скрипте DrygoiScript, который висит на ssilkaNaObject. Юнити: как кешировать ссылку на ваш скрипт Но GetComponent<> ресурсозатратная операция, поэтому лучше сразу создать переменную, чтобы положить туда ссылку на конкретный компонент (ваш скрипт). Ссылку на объект мы уже получили, и она называется ssilkaNaObject, но не получили ссылку на скрипт DrygoiScript, поэтому и приходится каждый раз писать GetComponent<DrygoiScript>(). DrygoiScript peremennayaSsilkaNaDrygoiScript = ssilkaNaObject.GetComponent<DrygoiScript>(); Теперь переменная peremennayaSsilkaNaDrygoiScript будет содержать ссылку на ваш скрипт, который висит на объекте, на который ссылается ssilkaNaObject. И можно без всяких GetComponent писать: peremennayaSsilkaNaDrygoiScript.peremennayaScripta = 5; // изменение значения переменной в другом скрипте peremennayaSsilkaNaDrygoiScript.MyFuction(); // вызов функции другого скрипта Это называется кеширование. Мы с вами закешировали, как сам объект, на котором скрипт, так и ссылку на скрипт. Грубо говоря - кеширование это создание ссылки на нужную вещь, по которой потом можно обращаться к объекту, чтобы не приходилось каждый раз его искать заново. Юнити3Д: как получить доступ к объекту из другого скрипта До этого мы нужный нам объект переносили вручную через инспектор Unity в переменную ssilkaNaObject , но получить к нему доступ из кода можно несколькими способами. public GameObject ssilkaNaObject; // не забывайте создавать переменную, которая будет ссылкой на объект ssilkaNaObject = GameObject.Find("ИмяОбъектаПоИерархии"); // поиск объекта по имени Тут в переменную ssilkaNaObject мы заносим то, что найдет компьютер по имени в иерархии сцены Unity. Минус в том, что придется запоминать, что переименовывать объект нельзя. ssilkaNaObject = GameObject.FindGameObjectWithTag("Player"); // поиск объекта по тегу Так мы получим ссылку на первый объект, который найдет компьютер по тегу Player (задается в инспекторе). Если объектов несколько с одним тегом, то в ссылку компьютер положит первый попавшийся. Советы Все операции, когда вы переменной присваиваете ссылку на объект или компонент (скрипт) проводят, как правило, в методе Start. Сами переменные создаются вне методов, чтобы они были доступны по всему скрипту, а не были локальными в каком-то методе. А значения им присваиваются в методе Start, который срабатывает когда запускается сцена, тогда Unity3d и найдет нужный объекты, и запишет в ваши переменные ссылки на них. Например: using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestPoiskObjectov : MonoBehaviour { // это место вне каких-либо методов public GameObject ssilkaNaObject; // не забывайте создавать переменную, которая будет ссылкой на объект public DrygoiScript peremennayaSsilkaNaDrygoiScript; // переменная для ссылки на конкретный скрипт void Start () { // поиск объекта по имени ssilkaNaObject = GameObject.Find("ИмяОбъектаПоИерархии"); // получение ссылки на компонент с другого объекта DrygoiScript peremennayaSsilkaNaDrygoiScript = ssilkaNaObject.GetComponent<DrygoiScript>(); } void Update () { } }
  22. Константин Орлов

    Полезные ссылки для Unity (видеоуроки и скачка)

  23. Константин Орлов

    Cinema 4d как сбросить настройки рендера

    Как в Cinema 4d сбросить настройки рендера? Я так понял, что в новых версиях не работают фишки выложенные на Ютубе (удаление папки prefs), но настройки рендеринга в синема 4д можно сбросить до заводских следующим способом. Как показано на скрине - нажмите "Настройки рендера" (это кнопка в окне настроек рендера, внизу) и выберете пункт меню "новый". Тогда у вас создастся новый профиль настроек, которые будут стандартными. После этого вы можете создать свой профиль настроек на разные случаи жизни. Данная статья ответила на вопрос, который формулируют так: как вернуть заводские настройки рендера Cinema 4d; как восстановить параметры рендера в Синема 4д; настройки рендера по умолчанию в Cinema4d; базовые настройки рендеринга в Синема4д;
  24. Константин Орлов

    Шаблоны текста Sony Vegas Pro

    Как сделать красивый текст в Sony Vegas? Несколько эффектов для текста в Вегас - эффект печатания, эффект появления. Футаж фона для текста, и немного озвучки. Скачать шаблон Vegas яндекс диск: https://yadi.sk/d/eZzfBNigrtkCdQ Скачать гугл диск https://drive.google.com/open?id=14XKqmYMZhAFuK8luZ-_xyl1KUtJ-GEn8 Работает только на 16 версии и выше. Также смотрите: Красивый шаблон видео Vegas 16 Как сделан красивый шаблон Vegas 16 Скачать MAGIX Vegas Pro v16.0 Build 307 (x64) Final https://rutracker.org/forum/viewtopic.php?t=5605945 Другие материалы на канале https://www.youtube.com/channel/UCSY1GRav8mpqkO7EpSbICWQ/?sub_confirmation=1 И группе https://vk.com/o_smi Видеомонтаж: Константин Орлов vk.com/orkons, orkons.ru, orkons@ya.ru, skype orlovkonst
  25. Константин Орлов

    Красивый шаблон видео для Sony Vegas Pro 16

    Видео о том, как пользоваться этим шаблоном Этот шаблон позволяет получить красивое видео в Вегасе без особых знаний. Достаточно просто перенести на определенную дорожку видео или картинки. Также есть шаблон с титрами. Особенно хорошо улучшает слайд-шоу, когда у вас одни картинки, благодаря эффектам они смотрятся, как живое видео. Скачать шаблон для Vegas Pro 16: яндекс https://yadi.sk/d/WSC7XvtwtWdvFA или гугл https://drive.google.com/open?id=1kY6wlJ-GgXNrMXfaFRNLriV7M7TzUQgD О том, как он сделан технически: Работает только на 16 версии и выше. Другие материалы на канале https://www.youtube.com/channel/UCSY1GRav8mpqkO7EpSbICWQ/?sub_confirmation=1 Также смотрите Инструкция по Sony Vegas https://forum.orkons.ru/topic/287-instrukciya-po-sony-vegas/ Как скачать фрагмент видео с Youtube https://forum.orkons.ru/topic/176-kak-skachat-fragment-video-s-youtube/ Photoshop 2017 (взломанный, русифицированный) https://forum.orkons.ru/topic/114-photoshop-2017-vzlomannyy-rusificirovannyy/

Powered by Invision Community
Поддержка Invision Community в России