Перейти к содержанию
Технологии манипуляции СМИ

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

Administrators
  • Публикаций

    1 074
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

Константин Орлов стал победителем дня 5 апреля

Константин Орлов имел наиболее популярный контент!

Репутация

2 Neutral

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

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

    Мой подход к изучению C# и Unity3d

    Два с половиной месяца изучая Unity и C# я сформировал для себя принципы эффективного обучения. Описано в формате советов (так удобней читать), но руководствоваться ими или нет, решайте сами. Это мое мнение, как эффективно учиться, а не как сделать супер-игру. Не зацикливайтесь, если что-то не получается Бывает, что в Unity вы не можете реализовать то, что хотите, например, не знаете, как это делать, или что-то не работает и непонятно почему. Не стоит тратить на это весь день, лучше это за время изучите 10 не менее важных, но других аспектов движка. Просто возьмите другой видеоурок, и прорабатывайте другую тему. Например, я как-то потратил полдня в поисках, как отредактировать Read-Only анимацию. А через пару недель в случайном ролике увидел, как это делается. При наличии урока решение проблемы занимает 2 минуты, без него — несколько часов. Это иллюзия, что пока вы несколько часов тратите на это, вы изучаете редактор Unity. КПД такого «изучения» крайне низко по сравнению с просмотром конкретных видеоуроков (особенно от Stream). Боритесь с этой иллюзией, и не зацикливайтесь, вас никто не заставляет реализовывать что-либо сейчас — ваша основная задача научиться вообще, а не сделать игру к какому-то сроку. Главная задача научиться, а не сделать игру Возможно, кому-то это покажется нелогичным, но пока вы учитесь ваша главная задача научиться, а не сделать игру! Разница в том, что при подходе «главное сделать игру» вы делаете то, что мало полезно для обучения и занимает много времени, но необходимо для создания игры. Например, несколько дней делаете 150 разных визуализаций скиллов для нескольких классов вашей RPG, но если каждый раз с каждым новым скиллом вы применяете одни и те же знания, то развития почти нет. Это просто рутина. Есть и другой, более страшный случай, допустим, вы 2 дня кодили что-то объемное, а потом узнали, что это можно сделать в 10 раз проще, но вам мешало незнание возможностей языка C#. А вы как лесоруб, у которого нет времени заточить топор, торопитесь и рубите тупым топором. Поэтому точите топор, и помните во главе угла обучение (узнавание новых функций Unity3d и C#), а не создание игры. Ваши идеи не украдут Многие новички считают, что они придумали гениальную идею, за которой позарятся профессиональные акулы игростроя. Но не стоит бояться быть «обворованным», как правило, идеи новичков такие, что у профессионалов они вызывают лишь фейспалм. Проблема тут в том, что вы можете год втихую разрабатывать игру, а после релиза понять, что она никому не нужна. Так будет в 95% случаев, но вы могли бы сэкономить время, если бы просто описали идею игры на форуме, и попросили советов более опытных разработчиков. Есть шанс, что они вам объяснят, почему на это не стоит тратить времени, а также подскажут, как сделать лучше. В итоге вы повысите шансы на успех игры, и сэкономите время. Мой совет — не бойтесь делиться своими идеями, это даст обратную связь, как от игроков, так и от более опытных разработчиков. Ваша задача научиться, а навыку придумывать стреляющие идеи нужно учиться точно также, как и программированию. Но иллюзия о гениальности своей новичковской идеи это очень мощный стереотип, сидящий в фундаменте мировоззрения многих людей. Поэтому детально останавливаться на объяснении не буду, тут и целой статьи мало. Просто ответьте на вопрос — нужны ли профессиональному игроделу идеи нуба, который ни одной успешной игры не выпустил, или профессионал даже время не будет тратить, чтобы выслушать идею? Используйте готовые модели, карты, текстуры и т.п. чтобы ускорить релиз прототипа Если вы хотите сделать прототип, чтобы протестировать зайдет ли ваша идея игры, то это подразумевает уже меньше обучения, и больше рутинной работы. В таком случае используйте все готовое: ассеты, текстуры, модели, карту, музыку и прочее, чтобы избавиться от тонны рутинной работы, и ускорить в разы релиз прототипа. Не волнуйтесь, обучение не пострадает, вы сэкономите много времени, которое сможете потом потратить на обучение, просто сейчас вы получите релиз за 3 месяца, а не за 12 или 18. Но помните, быстрота создания прототипа должна быть за счет умения находить готовые ресурсы, а не за счет повышения пропорций рутинной работы в ущерб обучению новому. Зачем нужен релиз быстрее? Чем быстрее у вас будут выходить релизы прототипов, тем больше вы протестируете идей, тем больше у вас будет опыта за счет обратной связи. После сможете приступить к следующей игре, если эта не зайдет (а она не зайдет с вероятностью 95%). Например, не разрабатывайте свою систему смены дня и ночи, возьмите уже готовый ассет. А сэкономленное время потратьте на обучение и реализацию того, чего у вас нет в готовом виде (при наличии хорошего видеоурока или книги по этому, не забывайте про пункт "не зацикливаться", чтобы не тратить время с низким КПД). Конечно, готовые ресурсы с авторскими правами нельзя использовать в коммерции, но вероятность коммерческого успеха первой игры новичка низка, поэтому я бы сразу делал ставку на свободное распространение с целью получить обратную связь. А если ваша игра получит какой-то спрос, тогда и будет смысл заменить чужие ассеты на сделанные самостоятельно. Поясню - вы не потеряете ничего в плане обучения. Просто вы сейчас экономите время и не делаете то, что уже есть в готовом виде, а когда (и если!) вам понадобится научиться этому, тогда и приступите к его изучению. Изучите C# - это база Чем больше вы понимаете в C#, тем больше вы можете сделать. Пропорции изучения Unity и C# должны быть где-то 50 на 50. Если книги по C# для вас пока слишком трудны, то можете начать с видеоуроков, например, с видеокурса C# для маленьких и тупых. После него вы уже не будете испытывать такой страх перед книгами, и будете достаточно в теме, чтобы их читать. Лучшая книга по C# на данный момент это Язык программирования C# 5.0 и платформа .NET 4.5 (Эндрю Троелсен), уже вышла новая версия книги, но в интернете я ее не нашел, но и старая еще актуальна. По Unity3d рекомендую книгу Алон Торн - Искусство создания сценариев в Unity. Если при просмотре видеоурока по C# вам что-то непонятно, то просто найдите видео на эту тему от другого автора. Комбинируйте видеоуроки по Unity и C# с чтением книг и статей в удобном для вас порядке и чередовании, но помните, книга по C# это база, и основные ее главы нужно знать обязательно, если хотите не «с трудом делать легкие вещи», а «легко делать трудные вещи». Как читать книги по программированию Основная проблема это въехать в терминологию, чтобы понять, что написано. Даже если вы уже получили определение термина, то из-за их обилия и из-за того, что эти понятия для вас пока весьма абстрактны, предложения приходится перечитывать помногу раз. Читайте книги вслух. Не знаю с чем это связано, но бывает, что зачитывание книги в слух с интонированием, как будто пишешь аудиокнигу, упрощает понимание. Возможно, это помогает не отвлекаться на другие мысли и концентрироваться на тексте. Объясняйте понятое. Если вы поняли какой-то момент, то объясните его (можно вслух на запись, как-будто делаете видеоурок). Так вы лучше запомните. И сработает принцип из анекдота про учителя: «Я ученикам сто раз объяснил, уже сам понял, а они все не понимают». Объясняйте в правильных терминах. Так вы лучше их запомните, это поможет дальше читать книгу и правильно формулировать мысли на форумах. Объясняя термины и принципы работы языковых конструкций старайтесь находить максимально подходящие аналогии из других сфер, это поможет уложить в голове новую информацию. Объясняйте каждый пример кода из книги. В книге встречаются иллюстрирующие куски кода. Объясняйте, что делает каждая «команда» (оператор) и ключевое слово, причем в правильных терминах, чтобы привыкнуть. Например, это может выглядеть так: «Создаем экземпляр (объект) класса MyClass с именем Vas9, присваиваем ему значение с помощью конструктора, в который в качестве параметра передаем переменную 25», это все вы поняли из этой строчки: MyClass Vas9 = new MyClass (25); Потом идете туда, где описан класс MyClass, и смотрите, что там происходит, и объясняете это, например, так: «Используется перегруженный конструктор класса, принимающий в параметры одну переменную типа int, и устанавливающий ее в приватное поле age. Конструктор по умолчанию не используется». Пример кода этого конструктора приводить уже не буду. Объясняете всю логику программы, рассказываете, почему что-то делается и что именно делается. Говорите так, как будто пытаетесь объяснить новичку. Старайтесь формулировать максимально точно в терминах, но дублируйте их и объяснением своими словами с аналогиями, чтобы термины лучше осели в голове. Делайте это со всем кодом каждого примера, даже если что-то новое представлено лишь в части кода. Так вы всегда будете понимать всю суть программы, и будете чувствовать себя уверено. Объясняйте себе весь код до тех пор, пока какие-то конструкции языка не станут для вас насколько очевидны, что просто посмотрев на них вы поймете про них все. Изучайте английский Если вы решили изучить C# и Unity, то у вас появилась отличная возможность выучить и английский язык. Называйте объекты на английском. Объекты - это классы и переменные в коде на C#, а также объекты в иерархии Unity. Просто выбираете максимально логичное имя для переменной на русском языке, идете в Яндекс-переводчик и вводите фразу. Не бойтесь запутаться, как правило, из контекста будет понятно значение, а если вы забыли, то это хороший повод повторить перевод слова. Переводите слова из Unity и C#. Смотрите, что значат в переводчике настройки, меню и прочий интерфейс Unity, а также ключевые слова C#. Это позволит понять, что делает конкретная настройка, и выучить слова. Нажимайте несколько раз на кнопку озвучивания в переводчике, чтобы запомнить, как слово воспринимается на слух, а лучше даже повторить за роботом, стараясь правильно произнести. Нехорошо знать значение слова «options», но называть это «оптионс», а не «опшенс». Говорят, лучший способ выучить язык — это поехать в соответствующую страну и там общаться на нем. Это работает за счет постоянного и всестороннего взаимодействия со словами на другом языке. Вы можете сделать нечто похожее, и взаимодействовать с английскими словами называя ими свои объекты. С одной стороны это замедляет изучение C# и Unity, так как приходится переключаться на переводчик, прослушивать звучание слов, но со временем вы выучите больше слов, что наоборот ускорит развитие. Релизьте свои скрипты и префабы Если вы сделали какой-то универсальный игровой элемент (например, полоску здоровья с регенерацией или ходьбу NPC), то опубликуйте его, чтобы им могли воспользоваться другие. Так вы можете получить обратную связь о вашем коде, вам подскажут, что можно улучшить. Сделайте видеоурок, как установить вашу разработку, а также отдельно без воды, пространных рассуждений и отвлеченных тем объясните, как работает код. Постарайтесь делать максимально кратко, точно по терминам, но понятно для других новичков. Объясняя другим — сами лучше поймете. Только не делайте плохие видеоуроки. Яндексите (гуглите) Если что-то не получается, то не ковыряйтесь больше нескольких минут, нередко в поисковике можно найти готовый ответ на ваш вопрос. Бывает обидно провозиться минут 20-30, думая, что в поисковике нет ответа, а потом загуглить и почти сразу найти ответ. Если в поисковике ответа нет, тогда обратитесь на форумы gcup и unity3d, только не забудьте сначала пройтись местным поиском по форуму. Изучайте горячие клавиши и Visual Studio Это из разряда «точить топор лесоруба», очень экономит время. Вот неплохое видео «15 советов, ускоряющих работу в Unity», но ищите и другие. В Visual Studio узнайте, как делать рефакторинг (например, переименование одной переменной сразу во всех скриптах) и прочее. Современные среды разработки имеют большой функционал, поэтому если вам чего-то не хватает, то, скорее всего, это уже реализовано, надо только узнать, как им пользоваться. Почему изучать Unity и C# полезно? Это поможет выучить английский язык. Вы сможете делать не только 3D-игры, но и немного научитесь работать с 3D-редактором. Конечно, Unity3d не для того, чтобы редактировать 3D (внезапно!), но, например, сделать какой-нибудь лесок с моделькой горящей машины, и в кустах модельку медведя, вы сможете без проблем из скачанных ассетов. Это может понадобиться для видеомонтажа, когда нужна соответствующая сцена, ведь и мультики на Unity рисуют. Сделаете, к примеру, и макет города, даже физика есть в Unity. Но все-таки это движок для создания игр, поэтому все вышеописанное доступно на примитивном уровне по сравнению со специализированными программами. Язык C# полезен, как таковой, он используется не только для Unity. Вы сможете писать программы на C# под Windows. Unity позволит вам без особого труда делать игры и просто софт под мобильные телефоны на Android. Достаточно просто перекомпилировать проект под Android, также можно скомпилировать проект под работу в браузере (WebGL). В данный момент Unity это самый популярный игровой движок среди инди-разработчиков, а C# популярный язык программирования, который многим не раз пригодится за их долгую жизнь. Если не знаете с чего начать, то тут я для себя собирал все интересные видеоуроки, статьи и прочие полезные ссылки по C# и Unity. Такое мое мнение, не претендую на истину, но я делаю так, как описал.
  2. Константин Орлов

    Unity: как сделать пианино

    Очень простой скрипт, который позволит сделать пианино на игровом движке Unity. Скачать скрипт и префаб пианино https://yadi.sk/d/nQsME47c3Z673H PianoKey.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class PianoKey : MonoBehaviour { // звук для воспроизведения при нажатии клавиши (нота пианино) public AudioSource sound; // ссылка на главный скрипт, чтобы брать из него инфу public PianoManger Manager; // при нажатии на клавишу void OnMouseDown() { // утапливаем ее transform.position -= Manager.pressureDegree; // активируем звук клавиши sound.Play(); } // при отпускании мыши void OnMouseUp() { // возвращаем клавишу на место transform.position += Manager.pressureDegree; } void Start () { // проверка, что вы не повесили два раза скрипт на клавишу PianoKey[] countScript = GetComponents<PianoKey>(); if (countScript.Length > 1) Debug.LogWarning("На клавише больше 1-го экземляра скрипта! " + transform.name); // проверки есть ли ссылка на аудио сурс и есть ли в аудио сурсе аудиоклип if (sound == null) Debug.LogWarning("Укажите, какой AudioSource будет для кнопки! " + transform.name); if (sound.clip == null) Debug.LogWarning("Задайте Clip в AudioSource в инспекторе! " + transform.name); } void Update () { } } PianoManger.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class PianoManger : MonoBehaviour { // степень нажатия клавиш [Tooltip("Укажите, насколько смещать клавиши при нажатии")] public Vector3 pressureDegree = new Vector3(0, 0.002f, 0); // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
  3. Константин Орлов

    Что такое хороший юмор?

    После этого видео, где я показал, что на самом деле юмор в комедиях Гайдая весьма примитивен, и что скрывать - часто откровенно глуп, стали поступать вопросы - что тогда хороший юмор? Юмор в комедиях Гайдая Конкретно объяснить все критерии юмора в коротком виде трудно, а сходу подобрать достаточно количество идеальных образцов невозможно, так как их мало, и еще не вспомнишь. Но главный критерий озвучить можно - юмор должен быть полезным. Естественно, не бессмысленно нравоучительным, занудно повторяя, что такое хорошо и плохо, а по-нормальному полезным. Задача юмора не в том, чтобы человек убил время своей бесценной жизни за просмотром комедии, а в том, чтобы развивать через него. Сейчас минимум 90% юмора в СМИ наоборот ведут к деградации. Чтобы понять, что такое польза в юморе, приведу несколько примеров, это далеко не идеальные и найденные на быструю руку примеры. Конечно, кому-то зайдут описанные шутки, кому-то нет, это нормально. Разговор не о вкусах на юмор - я же не говорю, что является смешным, а что нет. Я говорю, что является юмором (полезным), а что является дуристикой, формирующей из человека односложную инфузорию. Это не методичка, всеобъемлюще объясняющая все про настоящий юмор. Цель материала - всего лишь донести, что юмор может быть полезным, и немного раскрыть, какая конкретно может быть от него польза. Примеры КВН С 3:11 по 3:20. Просто мини-шутка впроброс, но эта мини-шутка пример нормального (полезного) юмора. Сама суть шутки (т.е. то отчего смешно) одновременно учит зрителя принципу, что можно формально говорить одно, и этим же разговором делать другое. Например, когда в кино якобы против алкоголя показывают сценку, а на самом деле во всей красе его демонстрируют для пропаганды. Так и в этой шутке - на самом деле акцентировали внимание на мэре, хотя формально нет. Шутка не до конца доделанная (очень слабая, да и логика хромает), но хотя бы похожа на нормальный юмор. Анекдот 1 Вроде просто анекдот, а позволяет посмотреть с другой стороны на привычные вещи. Все мы не раз слышали от кого-то, как хорошо быть домашним питомцем - ничего делаешь. Вот только мало кто до конца додумывает, как им живется на самом деле. Юмор должен помогать осознавать, что человек делает. Анекдот 2 Позволяет задуматься, а ведь в самом деле, что делать чтобы это не восприняли, как передразнивание? Так сказать, небольшая логическая загадка. Юмор должен ставить вопросы, над которыми нужно подумать. Анекдот 3 Позволяет задуматься, что лучше суровая правда или быть счастливым, но в иллюзиях? Вопрос глубокий, если человек примет решение руководствоваться вторым вариантом, то где-то на горизонте уже маячат зависимости от наркотиков, компьютерных игр и прочие "иллюзорные миры", где все хорошо. А еще бывают случаи, когда человек думает, что у него все идет хорошо (например, при планировали бизнес-проекта), но потом находит ошибку в своих планах. Вроде только что у него все было отлично, ожидались большие прибыли, а тут он узнает, что это не сработает - облом. Вопрос: это хорошо, что он узнал об ошибке, и помог ли ему тот, кто сообщил об ошибке или наоборот навредил? Только что был успешным, и тут - облом. Полноценный серьезный философский вопрос, а казалось бы просто шутка. Кстати, юмор может не только ставить вопросы для разминки мозгов, но и избавлять от вполне конкретных иллюзий и заблуждений. В этом случае его польза возрастает многократно. Когда найду такой пример, опубликую. Анекдот 4 Одновременно и анекдот и басня. Так как передает "жизненный опыт" поведения в некоторых ситуациях - хотел показаться глупым, чтобы откосить, а это поведение наоборот говорит о его предрасположенности. Напомню, что это лишь по-быстрому найденные примеры, но, думаю, всем очевидно, что они имеют некоторую пользу. Естественно, у каждого свой вкус, и на разную аудиторию должны быть разные шутки, но всегда нормальный юмор содержит что-то полезное. Он чему-то научит, что-то поможет осознать, о чем-то поможет задуматься. Это и есть настоящий юмор, возможно, называть его хорошим неправильно, понятие хорошего в юморе относительно (каждому свое смешно), но это именно юмор. А то, что мы видим в 90%+ случаев в комедиях это суррогат юмора, и называть это плохим юмором тоже неправильно, так как это вообще не юмор, а дуристика. Что такое дуристка в юморе? Это тема отдельной статьи, если кратко, то например, такой юмор, как: кому-то отвесили пинок; кто-то ударился; мультяшная подзвучка; глупая рожа; смех, основанный на том, что персонаж просто глупый; и еще, что пока мне не пришло в голову, либо не добавлено потому, что долго описывать. Основа комедий Гайдая это глупые персонажи, и смех строится на том, как глупо они поступают. Но это не только бесполезный юмор, но еще и вредный. Почти все персонажи у Гайдая клинически глупые судя по их поведению. Клинические - это значит, что место им с соответствующих заведениях. Что хорошего смеяться над больными? Где-то 10% "юмора" в любых комедийных фильмах/передачах является юмором хотя бы с натяжкой. Без натяжки только 5%. Это значит, что только каждая 20-я шутка юмор, а остальное... буду откровенен и прямолинеен - глупая фигня для стада (извините за грубость ), на которую у него сформировали условный рефлекс. Именно рефлекс, и именно сформировали! Постоянным повторением, об этом в видео про иллюзию хорошего. На этом все, возможно, далее в эту тему буду добавлять найденные примеры настоящего юмора, с описанием, что в нем полезного.
  4. Константин Орлов

    Юмор в комедиях Гайдая

    Разборы фильмов Гайдая: Иван Васильевич спаивает нацию (озвучка А.Кофанов) За спичками уехал в Америку (Разбор К. Орлова) Долгий Путь - первый фильм Гайдая 1956 Бриллиантовая рука Кавказская пленница, или Новые приключения Шурика
  5. Константин Орлов

    Юмор в комедиях Гайдая

    Разберем типичные заблуждения (иллюзии) о фильмах Леонида Гайдая. Считается, что у него: нормальный юмор, а не тупой американский юмор, где шутка строится на глупой роже; юмор для мозгов, а не односложные современные шутки стиля камеди-клаб; Так ли это? Проведем анализ. Также проверим действительно ли в комедиях Гайдая нет пошлости, насколько уникальный юмор, действительно ли фильмы добрые и жизненные, а сценарии хорошие. И ответим на вопрос - почему фильмы Гайдая так легко смотрятся? Рекомендовано к просмотру в качестве дополнительных материалов: Veritasium: иллюзия правды Текст из видео (со сценария):
  6. Константин Орлов

    Veritasium: иллюзия правды (иллюзия хорошего)

    Почему у нашего народа такая любовь к фильмам Гайдая, Рязанова и тому подобным режиссерам? Почему эти фильмы считаются старыми добрыми и душевными? Ответ прост - практически каждый из нас видел эти фильмы по телевизору десятки раз (те, кому за 30). Хотя фильмы на самом деле весьма невысокого качества - например, притянутые за уши сюжеты. Как в "Кавказская пленница", где Шурик пил каждый раз, собирая каждый тост. Или слабая актерская игра, например, в том же фильме у Натальи Варлей, которую не имевшую актерского образования и взятую из цирка, поставили на главную роль. Что и объясняет ее нередкое переигрывание. А про юмор в комедиях Гайдая вообще отдельная тема. Если кратко, то там юмор уровня Tom & Jerry. Но большинство людей ничего этого не видят, для них эти фильмы - святые. Чем это объясняется? Очень просто - есть такая штука, в чем-то близкая с принципом "Ложь повторенная тысяч раз становится правдой", называется она - иллюзия правды или иллюзия хорошего.
  7. Константин Орлов

    Unity: скрипт на инвентарь от Stream

    Тема неактуальна, есть новая версия: Unity: Инвентарь и крафт
  8. Константин Орлов

    Unity: программа угадывает числа (угадыватель)

    Скрипт для Unity, который использует трюк числами, когда за 5 вопросов, компьютер угадывает, какое число в пределах 1-30 загадал игрок. Можно интегрировать в любой проект, достаточно вынести префаб на сцену. Скачать https://yadi.sk/d/Y47u1vzk3Ynr6t 280 кб Код скрипта с# для Unity3d (для работы необходим префаб по ссылке выше): using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; // для работы с текстом /// <summary> УГАДЫВАНИЕ ЗАГАДАННОГО ИГРОКОМ ЧИСЛА с помощью 5 карточек </summary> public class GuessNumber : MonoBehaviour { // Алгоритм угадывания - пользователю показывают 5 карточек с разными числами, если на карточке есть загаданное число, он // нажимает согласие, если нет, то отрицание. Числа на карточках подобраны так, что зная, на какой из карточек есть, а на // какой нет загаданного числа, можно вычислить, какое число загадно. [Tooltip("Какой символ будет заполнять полосу загрузки?")] public string loadingSymbol = "00 "; [Tooltip("Продолжительность эмуляции загрузки между панелями (секунды)")] public float loadingDelay = 1; [Tooltip("Количество делений у полосы загрузки")] public float countDivisionLoadBar = 10; // заглавная панель с предложением загадать число public GameObject panelChange; // массив панелей (5 шт) с опросом есть ли на экране загаданное число public GameObject[] panelsGuess; // панель выводящая, какое число загадано public GameObject panelResult; // текст сообщения с информацией о загаданном числе public Text textResult; // текст для симуляции процесса загрузки public Text loadingBar; // алгоритм программы сюда записывает загаданное пользователем число int guessNubmer = 0; // если на панели есть загаданное число, то в ButtonStart сюда прибавляет соответствующее значение (для каждой панели разное) // если нет (когда пользователь нажимает кнопку отрицания), то ничего не добавляется public void ButtonStart() { panelChange.SetActive(false); // выкл панель выбора числа panelsGuess[0].SetActive(true); // выкл первую угадывательную панель } // КНОПКА ДА, когда пользователь подтверждает, что на панели есть загаданное число // (вызывается кнопкой на экране, кнопка передает в качестве параметра номер текущей панели) public void ButtonYes(int numberCurrentPanel) { // если это панель под номером таким-то то добавляем к загаданному числу соответствующее значение // далее переходим к другой панели через корутину с задержкой if (numberCurrentPanel == 0) { guessNubmer += 1; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); } if (numberCurrentPanel == 1) { guessNubmer += 2; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); } if (numberCurrentPanel == 2) { guessNubmer += 4; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); } if (numberCurrentPanel == 3) { guessNubmer += 8; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); } if (numberCurrentPanel == 4) { guessNubmer += 16; StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); } } // КНОПКА НЕТ, когда пользователь не видит своего числа на панели public void ButtonNo(int numberCurrentPanel) { StartCoroutine(GoToNextPanelDelay(numberCurrentPanel)); // переходим к следующей панели с задержкой } // переход к следующей панели и задержка, чтобы видна была анимация эмуляции загрузки protected IEnumerator GoToNextPanelDelay(int numberCurrentPanel) { // закрывает текущую панель panelsGuess[numberCurrentPanel].SetActive(false); // запускаем "анимацию" эмуляции загрузки StartCoroutine(LoadingBar()); // задержка в секундах, чтобы видеть анимацию yield return new WaitForSeconds(loadingDelay); // если активировать нужно не 5 панель (5-я результирующая), то активируем (нумерация с 0) if (numberCurrentPanel != 4) panelsGuess[numberCurrentPanel + 1].SetActive(true); // если это пятая панель, то выводим результат if (numberCurrentPanel == 4) Result(); // завершаем корутину yield break; } // "анимация" полосы загрузки protected IEnumerator LoadingBar() { loadingBar.text = ""; // ставим в ноль полосу загрузки (очищаем) int i = 0; // количество циклов (шагов загрузки) while (i < countDivisionLoadBar) // пока 5 раз не изменим полосу { // увеличиваем длинну полосы прибавляя символ загрузки к строке loadingBar.text += loadingSymbol; // чтобы из цикла выйти i++; // задержка в секундах между добавлением делений к полосе загрузки // делится общее время задрежки при загрузке на количество делений yield return new WaitForSeconds(loadingDelay / countDivisionLoadBar); } } // когда опрос закончен, вывод числа на экран void Result() { panelResult.SetActive(true); // вкл панель результата // если получилось от 1 до 30 if (guessNubmer > 0 & guessNubmer < 31) { textResult.fontSize = 300; // на случай если else изменил размер шрифта (число большим шрифтом эпичней выглядит) textResult.text = guessNubmer.ToString(); // заносим результат просчета алгоритма для вывода на экран } else // если пользователь вводил ошибочные ответы { textResult.fontSize = 70; // чтобы текст влез textResult.text = "Ошибка! Будьте внимательней! Попробуйте еще."; } } // кнопка на последней панели, перезапускает программу public void ButtonRestart() { guessNubmer = 0; // очищение переменной для угадывания panelResult.SetActive(false); // выкл результирующую панель panelChange.SetActive(true); // активация стартовой панели } // Use this for initialization void Start() { if (panelChange == null) Debug.LogError("Потеряна ссылка на panelChange"); if (panelsGuess == null) Debug.LogError("Массив панелей null"); if (panelResult == null) Debug.LogError("Потеряна ссылка на panelResult"); if (textResult == null) Debug.LogError("Потеряна ссылка на textResult"); if (loadingBar == null) Debug.LogError("Задайте текст в loadingBar"); } // Update is called once per frame void Update() { } }
  9. Константин Орлов

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

    Unity HP-bar и health-system для мобов и NPC

    Скрипт на отображение хп-полоски и имени моба в игре + скрипт на регенерацию ХП с остальной системой здоровья. Скачать скрипт и демо-сцену Unity: https://yadi.sk/d/C_EREeAM3YSs35 (архив HPbarLivingNoPass.rar) Как установить: Как устроен код скрипта: Эти видео попутно помогут слегка разобраться в темах C#: делегаты и события корутины наследование в Unity
  11. Константин Орлов

    Манипуляции камерой

    Примеры того, что профессиональная фотография — сплошной обман
  12. Константин Орлов

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

    Также смотрите тему с видео: Unity как из скрипта получить доступ к другом скрипту?
  13. Константин Орлов

    Unity как из скрипта получить доступ к другом скрипту?

    Также смотрите тему, где разжевано чуть по-другому, и чуть больше информации Unity методы доступа к скриптам и объектам
  14. Константин Орлов

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

    Рассмотрим, как в 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 () { } }
  15. Константин Орлов

    Unity Как редактировать анимацию (Read-Only)

    Рассмотрим, как отредактировать анимацию, которая в Unity помечена, как (Read-Only). Анимация, встроенная в FBX-файл не поддается редактированию, например, скачав с Asset Store ассет воина, где есть анимация и моделька, в префабе вы увидите множество анимаций: Чтобы отредактировать анимацию только для чтения, необходимо выделить нужный элемент (или через shift сразу все), и нажать CLTR+D. Таким образом вы сделаете дубликат, и он уже доступен для изменения в окне Animation. Как редактировать анимацию Анимация доступна для редактирования, и дальше, надеюсь, вы знаете, что делать. Если не знаете, то разберем пример редактирования анимации. Теперь необходимо взять модельку, к которой вы хотите добавить анимацию, вывести ее на сцену, и повесить ей компонент Animator (при переносе префаба на сцену Animator уже может быть на игровом объекте). Далее создать контроллер анимации (Create > Animator Controller), и в компоненте его перенести в переменную Controller. На скрине контроллер называется WarriorAnimControl. Выделяете в иерархии нужный объект (в нашем случае WarriorMy), и в окно Animator (Window > Animator) переносите нужные дубликаты анимации. Теперь в окне Animation (Window > Animation не спутайте его с Animator), у вас будут доступны для редактирования анимации, перенесенные в Animator. На этом скрине сначала был создан аниматор с Read-Only анимацией, а потом одну из анимаций я заменил на редактируемую. Теперь могу применять к ней Add Prorerty. Как заменить нередактируемую анимацию на редактируемую в готовом аниматор-контроллере? Выделяете нужный аниматор-контроллер. В окне Аниматор выделяете нужную анимацию. В инспекторе в переменную Motion перетягиваете новую редактируемую анимацию (например, которую мы дублировали из префаба). Мы рассмотрели лишь то, как сделать анимацию Read-Only редактируемой, подробную информацию по редактированию анимаций можно получить, если поискать соответствующие уроки на ютубе, можно заглянуть в мой плелист уроков по Unity:
×