Jump to content

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

Administrators
  • Content count

    1129
  • Joined

  • Last visited

  • Days Won

    2

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

  1. This post cannot be displayed because it is in a password protected forum. Enter Password
  2. Константин Орлов

    C#: работа с текстовыми файлами

    Как выбрать кодировку при чтении файла в C# Если нужно выбрать кодировку при чтении файла (варианты кодировок не знаю, вот пример с одной): string text = File.ReadAllText(fileAdres, Encoding.GetEncoding(1251));
  3. C#: как подсчитать количество строк в текстовом файле Консольное приложение, которое из текстового файла на жестком диске подсчитывает количество строк, и выводит это в консоль. Для работы скопируйте код в Visual Studio в консольном проекте. class Program { static void Main(string[] args) { //считать в массив все строки из файла string[] NewFile = File.ReadAllLines(@"C:\1.txt"); //счетчик количества строк int Count = 0; //проходим все строки в массиве foreach (string str in NewFile) { //выводим на консоль каждую строку Console.WriteLine(str); //повышаем счетчик Count++; } //вывести на экран инфу с количеством строк Console.WriteLine("Количество строк в документе равно {0}.", Count); //чтобы консоль сама не закрывалась Console.ReadKey(true); } }
  4. Константин Орлов

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

    Selenium WebDriver Операторы, полезные для работы с управлением браузером через Селениум Узнать если нужный текст на странице: //собщит, есть ли нужный текст на странице (но не более, этот оператор не умеет находить по тексту нужный элемент) //browser - переменная IWebDriver bool info = browser.PageSource.Contains("текст для поиска"); Найти нужный элемент по тексту внутри него: //создать переменную типа IWebElement, в которую будет помещен span, содержащий текст - нужный текст IWebElement myElement = browser.FindElement(By.XPath("//span[contains(text(), 'нужный текст')]")); Если тип HTML-тега контейнера не известен (div, span, li, ul и т.п.), то вместо него в Xpath ставьте звездочку *. Тогда найдется любой тег, содержащий данный текст. Получить HTML-код элемента Если вы нашли нужный элемент (IWebElement) через Selenium, то можете получить, как весь его код (включая сам элемент), так и только тот код, что он содержит внутри себя. Делается это через обращение к элементу, истребование его атрибута и нужно передать ему outerHTML либо innerHTML: //вернет код в виде string всего элемента, включая его самого textBox1.Text = tag1.GetAttribute("outerHTML"); //вернет только тот код, что находится внутри tag1 (не включая его самого) textBox1.Text = tag1.GetAttribute("innerHTML"); Как в URL Selenium передать ссылку на файл на жестком диске? Синтаксис такой: browser.Navigate().GoToUrl("file:///D:/testparser/Эта_неделя_без_повторов.html"); Закрыть браузер browser.Quit();
  5. Сделать парсер HTML-страниц на c# с хорошим функционалом не просто, надеюсь вам помогут статьи и прочие материалы, которые я нашел, пока разбирался в этой теме. Что нужно знать для начала? AngleSharp - библиотека для парсинга (устанавливается в Visual Studio и подключается через using), собирает данные со страниц не открывая браузер. Selenium WebDriver - штука для управления браузером через код (устанавливается в Visual Studio и подключается через using), это не парсер в полном смысле слова, а лишь некий интерфейс, который может делать клики, искать элементы и т.п. При работе Селениум открывается браузер, которым управляет программа. И это не браузер в Visual Studio, а обычный Chrome. Может выполнять и JavaScripts код, и понимает XPath. Вообще это драйвер для браузера (т.е. штука, позволяющую им управлять), а не парсер, и не кликер. XPath - язык запросов, чтобы найти конкретный элемент на странице (div, a, li, ul и т.п.), этим языком может пользоваться Selenium, чтобы обратиться к конкретному элементу. LINQ C# - для прямо конкретной работы с информацией (сортировка, преобразование, выборка из массивов и списков) необходимо знать линк, можно и без него, просто кода будет больше и придется напрягаться. JavaScript - код, который выполняется в браузере. Типо как C# только его выполнением и компиляцией занимается браузер. XPath [C#] Введение в XPath на примере простого парсера - про то, как использовать выражения XPath, чтобы найти нужный элемент на странице. Примеры xpath-запросов к html - поможет немного въехать в синтаксис Введение в XPath (часть 1). Поддержка XPath в Selenium и инструментальные средства и Введение в XPath (часть 2). Основы построения запросов - похоже для JavaScript, но может пригодится (с C# синтаксис похожий) AngleSharp Помогите написать самый простой парсер на AngleSharp [дубликат] - пример кода, как запустить парсер на AngleSharp (я не тестировал) Спарсить нужные теги C# AngleSharp? - "Но как мне спарсить все<img> теги, в которых атрибут src заканчивается на _200x300.jpg" Парсинг с C# AngleSharp - как получить URL из ссылки Как парсить страницу на AngleSharp? - чей-то консольный проект с рабочим парсером Как правильно парсить с помощью AngleSharp? Selenium WebDriver Selenium WebDriver: поиск элементов на странице - похоже для JavaScript, но пригодиться может. Выберите родительский элемент известного элемента в Selenium - вопрос с ответом на каком-то из форумов WebDriver: характеристика основных команд Selenium 2.0 — WebDriver. Впечатления, проблемы и советы по использованию - для тех, кто использует Селениум для тестирования интерфейсов сайтов. Автоматизированное тестирование веб-приложения (MS Unit Testing Framework + Selenium WebDriver C#). Часть 2.2: Selenium API wrapper — WebElement Selenium 2.0 и WebDriver Про Selenium и один «велосипед» - опять для тестировщиков Парсинг сайтов на C# - Selenium и HtmlAgilityPack JavaScript [Урок 3] . Получение любой информации со страницы при помощи Javascript Как скрыть элемент? LINQ C# LINQ C# - в работе навороченного парсера не обойтись без знания ЛИНК. Линк на professorweb.ru - неплохой сайт. Уроки C# – LINQ – Where, Select, GroupBy, AsParallel, x.Key – C# - отличный видеоурок по линк Массивы и списки Убрать дубликаты из List - как при помощи linq удалить дубликаты из списка, в котором каждый элемент имеет свои поля, и необходимо сравнивать не сами объекты, а одно из их полей С# всякое полезное Как удалить часть строки до определенного слова C# WebBrowser - браузер встроенный в C# Visual Studio, позволяет прямо в формах открывать браузер Парсинг сайтов на c#. Часть 1. Использование WebBrowser C#, способы хранения настроек программы - сериализация или сохранение данных на HDD Разное C# htmlagilitypack пример простого проекта - еще один парсер на си-шарп C# Agility pack HTML Парсер Разработка веб-скрапера для извлечения данных с портала открытых данных России data.gov.ru
  6. Константин Орлов

    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; }
  7. Константин Орлов

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

    В данный момент я пишу парсер C# на Selenium, довольно тормозная штука, если необходимо спарсить со страницы несколько тысяч элементов. У меня страница на 3800 ссылок. Уже минут 20 Селением занимается следующей штукой - находит по заголовкам ссылку, переходит на 2 родительских элемента вверх, и добавляет этот элемент в список List<IWebElement>. Это прямо капец как медленно, но причина в том, что элементов много и делается это как бы не напрямую через код, а как бы через драйвер. По крайней мере мне кажется, что в этом причина. Ну и еще в том, что каждый раз, чтобы найти нужную ссылку ему приходится брать заголовок (их 2200 уникальных) и сравнивать со всеми 3800 ссылкам на странице, и так 2200 раз. А еще Selenium WebDriver мне не нравится тем, что он, сцука, найдя элемент (например, блок div или ссылку) не может просто ее сохранить в виде кода, то есть как бы кешировать для своей дальнейшей работы (сам код он может предоставить). И если я обращаюсь к элементу, то он заново опрашивает браузер, то есть он хранит лишь ссылку на элементы (IWebElement), но не сами элементы. И еще - основные посты про Selenium в интернете за 2012-14 годы...
  8. Выпадающий список в 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; }
  9. Программа подсчитывает, что будет, если каждое поколение будет рожать определенное количество детей. При условии, что люди не умирают от болезней и т.п. Для простоты подсчета считается, что родители тут же умирают, как дают потомство. Настраивается количество детей, изначальное количество пар и продолжительность одного поколения. 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
  10. Константин Орлов

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

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

    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
  12. Простой скрипт с префабом, который создает как бы робота пылесоса. Ничего особо не делает, просто ходит по комнате и при встрече с коллайдером меняет направление движения. Для установки просто вынесите префаб на сцену, и выставьте положение над полом (по наклонным поверхностям не ездит). Баг - иногда может пройти сквозь стены. Скрипт. Можно самому сделать на основе скрипта объект, а может скачать ассет. 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
  13. Если в 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;
  14. Константин Орлов

    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); } }
  15. Константин Орлов

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

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

    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; }
  17. Скрипт, который позволяет стрелять различными примитивами, просто вешайте на камеру. В инспекторе можно выбрать тип снаряда и также тип полета (полет по физике или сразу появление снаряда в нужной точке). Также есть галочка с настройкой свечения (лапочка) у снарядов (просто по приколу). Первый скрипт вешайте на камеру, больше ничего не нужно. Со вторым ничего делать не надо, просто положить в проект. Не забудьте назвать файлы по названию скриптов. Код откомментирован, поэтому также может научить вас пользоваться выстрелами, создавать примитивы (без префабов), настраивать их немного в коде. Первый. Скрипт выстрела 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
  18. Константин Орлов

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

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

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

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

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

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

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

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

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

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

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

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

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

    Как получить ссылку на объект, имеющий определенный скрипт //покажу на примере, как я находил скрипт контроллера игрока на сцене, //в другом скрипте (который хочет получить ссылку на контроллер) пишем: FirstPersonAIO firstPersonAIO; //ссылка на скрипт контроллера от первого лица void Start() { //берем переменную, которая будет ссылкой на нужный нам объект //присваиваем ей значение (=) такое: найти объект типа FirstPersonAIO (FindObjectOfType(typeof(FirstPersonAIO))) //после чего привести его в этот же тип ( as FirstPersonAIO) firstPersonAIO = FindObjectOfType(typeof(FirstPersonAIO)) as FirstPersonAIO; } //после этого переменная firstPersonAIO будет ссылаться на компонент FirstPersonAIO, находящийся на вашем объекте //учтите, что этот способ находит первый попавшийся объект типа FirstPersonAIO (FirstPersonAIO.cs), если он //всего один на сцене, то проблем не будет. Также он должен быть активен.
×