Unity3d - Простой AI
Данный урок является результатом поставленной задачи в этом посте.
Сначала немного теории. Прежде всего, чтобы понять, как правильно создавать игровой мир в Unity3d, стоит рассказать о его составляющих. Первое на что стоит обратить внимание – это объект игры (GameObject). Это основной элемент игрового мира, который содержит в себе компонент по умолчанию Transform, определяющий положение, размер и ориентацию объекта в сцене. Каждый объект игры может содержать любое количество компонентов (можно их назвать скриптами), которые определяют поведение данного объекта в сцене. Некоторые компоненты могут требовать наличие других компонентов для правильной работы. Например, в прошлой статье я приводил пример назначения компонента Rigid Body кубикам, которые уже имели компонент Box Collider. Взаимодействие между данными компонентами позволяло кубику вести себя в сцене как физическому объекту, который может падать и сталкиваться с другими кубиками и другими объектами сцены, имеющими компоненты Collider. Как я уже говорил, каждый объект игры может иметь компоненты, определяющие его поведение. Поведение может быть не явное, как в приведенном выше примере, а выполнять какие-то действия разово или на протяжении какого-то времени. Например, игровой объект может создавать другие объекты при запуске сцены, играя роль «инициализатора» игрового мира; может выполнять какие-то действия периодически, например, уничтожил ли игрок всех врагов в сцене или нет, и если уничтожил, то выполнить действия по завершению уровня. Префаб (Prefab) – подготовленный заранее объект игрового мира. Он может содержать в себе любой сложности заготовленную структуру. Создается он очень просто: 1) В сцене создается игровой объект любой сложности; 2) в окне Project создается Prefab так же как и создается любой скрипт; 3) перетаскиванием из окна сцены созданного игрового объекта на созданный в окне Project префаб в сцене этот объект становится экземпляром префаба, а та пустая заготовка ранее созданная в окне Project становится заготовленным объектом. Здесь следует отметить, что если префабами являются игровые объекты, содержащие в себе компоненты для визуализации моделей (Mesh Filter и Mesh Renderer), то Unity3d автоматически использует технологию инстансинга для визуализации групп одинаковых объектов. Думаю, данного введения будет достаточно для понимания данного урока, поэтому перейдем к практической части. Начинаем делать заготовки.
Должно получиться примерно так, как показано на следующем скриншоте: Мы сначала реализуем поведение игрока, потом сделаем заготовку для поведения врага. Итак, переходим в выбранный вами редактор кода (в моем случае Visual Studio) двойным щелчком по скрипту «Player» и помещаем в него следующий код: PHP код:
PHP код:
На данном этапе Вы уже должны понимать, как работают скрипты поведения каждого из трех объектов, назначение каждого из используемых окон среды. Если что-то осталось непонятно, то попробуйте перечитать эту статью или вернуться к предыдущей статье.
Как всегда результат. |
Ответ: Unity3d - Простой AI
Помогите пожайлуста разобраться с синтаксисом, тяжело, я с блитца перехожу..
Пойду прямо по примеру. private Transform _thisTransform; private CharacterController _controller; Так объявляются компоненты объектов? _controller = GetComponent<CharacterController>(); Вот здесь вообще не понял, почему не в скобках, а рядом с ними и в треугольных. Нельзя както так писать _controller = This.GetComponent(CharacterController) ?? _thisTransform = transform; переменной присвается трансформация понятно, но чья? самого себя? Т.е. можно написать _thisTransform = This.transform Player player = (Player)FindObjectOfType(typeof(Player)); Здесь вообще не понял, 1-й Player что означает, это чтото типа CharacterController или что?? 2-й player (понятно что переменная)! 3-й (Player) тоже не понял, почему он в скобках? 4-й typeof(Player) это что значит, под типом подразумевается объект к которому скрипт с названием Player прикреплён ?? float angle = Vector3.Angle(_thisTransform.forward, playerDirection); Vector3 означает взять 3-й компонент вектора чтоли? т.е. z или как?? _thisTransform.forward - это берется вектор в прямом направлении? Ответь Пожалуйста кто на что сможет БУДУ ОЧЕНЬ БЛАГОДАРЕН |
Ответ: Unity3d - Простой AI
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Ответ: Unity3d - Простой AI
СПАСИБО БОЛЬШОЕ!! Хоть чтото прояснилось.
Можете еще ссылку на пример или пример написать Как можно создать массив и вего поместить какие-нибудь объекты (например кубики) и произвольно со временем удалять объекты. |
Ответ: Unity3d - Простой AI
Тоже прокомментирую
1. В данном случае поля класса объявляются синтаксисом: модификатор тип имя_переменной. private значит не публичное поле класса, Transform или CharacterController это типы, _thisTransform и _controller имена переменных. Подробнее тут, потом можно почитать тут, но уже сложнее. 2. Метод GetComponent<CharacterController>(); шаблонный. Подробнее тут. В угловых скобках указывается тип (в данном случае тип компонента, который надо найти на объекте). 3. _thisTransform = transform; тоже самое что и _thisTransform = this.transform; Т.е. переменной присваивается значение свойства transform. Это свойство, хоть и выглядит как переменная, выполняет действие подобное описанному в пункте 2 - получает с объекта компонент типа Transform. Т.е. запись _thisTransform = GetComponent<Transform>(). Подробнее о свойствах тут. Какие свойства есть у скрипта тут. 4. Player player = (Player)FindObjectOfType(typeof(Player)); Все что перед "равно" это объявление переменной player типа Player. Справа выполняется функция поиска объекта типа Player в сцене (скрипт на каком-либо объекте сцены). Но так как функция возвращает тип UnityEngine.Object от которого наследуются все объекты Unity (в том числе и скрипты - MonoBehaviour унаследован от Component, Component от UnityEngine.Object) - чтобы присвоить полученное значение переменной типа Player, полученное значение нужно привести к типу Player - это как раз (Player). Подробнее об этом тут. C# это строго типизированный язык. Все переменные должны иметь тип и могут содержать экземпляры данных, соответствующие этим типам. Еще почитать. 5. float angle = Vector3.Angle(_thisTransform.forward, playerDirection); дословно: посчитать угол между двумя векторами _thisTransform.forward и playerDirection. UPD: тут я приводил пример создания поля из объектов, сохраняя ссылки на них в думерном массиве |
Ответ: Unity3d - Простой AI
Спасибо за помощь! не думал, но оказывается приколько когда язык известный - можно пользоваться в разных движках, буду учиться )
Поможете разобраться с примером, взял с Юнити, писал своими словами, но смысл тот же. Но почему то ругается что я пытаюсь конвертировать UnityEngine.Object в UnityEngine.Rigidbody. Я понимаю что это компонент объекта, а не объект. Но подскажите плиз, как сделать чтоб не ругался. Как я понял в примере должны появляться копии каждые две секунды в рандомных позициях Код:
using UnityEngine; |
Ответ: Unity3d - Простой AI
И еще вопросик )
А можно в консоле отображать данные - использовать как дебагер, или еще куда-нибудь в другое место печатать? Я себя чуствую как полный нуб! Не думал что так сложно будет перейти с блитца на с# ... |
Ответ: Unity3d - Простой AI
PHP код:
|
Ответ: Unity3d - Простой AI
PHP код:
PHP код:
Про консоль: Debug.Log(данные); или print(данные); Цитата:
|
Ответ: Unity3d - Простой AI
Начал с нуля всё изучать, т.е. смотреть как типы даных объявляются и заодно для себя начал выкидывать инфу в chm. Как думаете, нужны такие наработки, или уже хватает?
Если да, то подскажите какой адрес надо писать для внутренних гиперссылок Вот наброски: http://www.sendspace.com/file/j9g31y Жмём Click here to start download from sendspace ЮХУУУ, уже начинаю потихоньку втягиваться, сам догадался boole=!boole; )) |
Ответ: Unity3d - Простой AI
Чёт тишина, так делать справку или нет?
Еще вопросик Как задавать значения вручную для Vector2,Vector3,Color Только не так Vector2.x=1; Vector2.y=2; А типо так Vector2=Vector2(1,2); Подскажите |
Ответ: Unity3d - Простой AI
Vector2 myVec= new Vector2(1,2);
|
Ответ: Unity3d - Простой AI
Привет всем! Хочу сделать не большой проект в жанре FPS на Unity. До этого я не программировал, занимался только моделированием. Сейчас в сцене у меня Player у которого стандартный FPS_Controller и Enamy(Модель бота с анимацией, он может следовать за Player'ом с помощью NavMeshAgent и ему присвоен тэг "Enamy"), также есть перфаб Bullet(Игрок может стрелять физическими сферами) у Bullet есть скрипт:
void OnCollisionEnter(Collision collision){ if(collision.gameObject.tag=="Enamy" ){ Destroy(collision.gameObject); Destroy(gameObject); } } Т.Е. Игрок "выпускает" пулю и если она сталкивается с объектом у которого есть тэг "Enamy", тогда пуля и объект очищается. Вопрос: Как мне реализовать смерть "Enamy"( добавить ему жизни и при столкновение ее вычитать?)? |
Ответ: Unity3d - Простой AI
Цитата:
Просто делать new в цикле по 500 раз и так каждый кадр - выглядит довольно страшно. А по инету сорсы гуляют и куда не глянь всюду ехал new через new. Понятно, что структуры копеечные, но если их скапливается достаточно много, то потом GC не охреневает с такого хламушника? |
Ответ: Unity3d - Простой AI
|
Часовой пояс GMT +4, время: 06:26. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot