Буратино, видишь у него на скрине в нижнем правом углу Select Skin: GMGreen, GMHTMK5, GM8? Надо выбрать GM8, нажать "ОК" в левом углу и перезапустить GameMaker.
Как уже сказал LunarPixel: это просто соковыжималка. Кто хотел купить игру - купил её без скидок, кто сомневался - купил её при первой же скидке (неважно насколько она актуальна), и наконец, некоторые из тех, кто просто слышал о игре - покупают её по очень низкой цене, даже если она им не нужна. Поэтому такие скидки подстёгивают покупку даже ненужного хлама - психология современного покупателя, эффект выгодного предложения. Акции во всех Океях, Ашанах, Лентах строятся именно по этому принципу.
last2424, size камеры должен быть равен половине высоты разрешения (то есть, при 1024x768, size должен быть 3.84, учитывая что PuP = 100). Чем больше ставишь значение size, тем больше камера пытается записать информации в один юнит, от чего и получается такая "дичь". Надо либо увеличивать PixelPerUnit у спрайта, либо уменьшать size камеры.
VerdCS, боюсь, что я не тот, кто заслужил сокрушительный гнев Немезиды, посланной новичками Запереться и игнорировать - не вариант, особенно когда есть желание помочь. Вот только помочь готовым решением можно очень редко. И чем малоопытней новичок, тем бесполезней окажутся для него эти решения. Но я вас понял. Приятно осознавать, что всё-таки есть общий ход мыслей. Что-то мы совсем от темы далеко отошли, предлагаю вернуться в струю.
Kxarog, для того, чтобы реализовать свою задумку малой кровью, присмотритесь к словам VerdCS'а и используйте Rigidbody2D и Collider2D. К примеру, для воплощения данного функционала:
достаточно проделать следующие шаги.
1. Добавить в сцену спрайт фона (назовём, Backgound). 2. Добавить пустой Game Object (назовём, InvisibleWalls) с компонентом PolygonCollider2D. Чтобы настроить коллайдер, достаточно нажать кнопку Edit Collider в инспекторе и проделать следующие манипуляции:
3. Персонаж. Для простоты описания процесса возьмём простой статичный sprite и разместим его в сцене (назовем, Player). Ему необходимо добавить два компонента: Rigidbody2D и BoxCollider2D. Основные настройки этих компонентов должны соответствовать следующему виду:
Настройка BoxCollider2D будет по тому же принципу, что и выше, с помощью кнопки Edit Collider:
Мы уменьшаем коллайдер, чтобы при перемещении коллизия происходила не со всем телом персонажа (в таком случае игрок не сможет подойти к "верхней" границе комнаты, а будет упираться в неё головой), а с участком равным площади изометрической проекции его ног. 4. Завершающим этапом будет добавление собственного скрипта нашему персонажу. Текст скрипта:
void FixedUpdate () { // Создаём вектор движения на основе "осей" манипулятора и умножаем на скорость (скаляр). Vector2 move = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")) * speed;
// Булевая переменная moving обозначает: равен вектор движения нулевому вектору или // нет (вркатце, стоим или идём). bool moving = (move != Vector2.zero);
if (moving) { // Если есть движение по X, то отражаем спрайт по горизонтали в нужную нам сторону. if (move.x != 0) sr.flipX = move.x < 0;
// Фиксируем длину вектора в пределах speed (чтобы по диагонали персонаж // не двигался быстрей, чем по прямой) и отвязываем скорость от FPS. move = Vector2.ClampMagnitude(move, speed) * Time.deltaTime;
// Перемещаем Rigidbody2D!!! (перемещние срабатывает только на следующий // тик, чтобы физика успела обработать коллизии и т.д.) rb2d.MovePosition(rb2d.position + move); }
// Для анимации. Устанавливаем переменную moving (внутреннюю для Mecanim) в // нужное значение для переключения анимации (idle <-> run). anim.SetBool("moving", moving); }
void LateUpdate() { // Меняем порядковый номер объекта при отрисовке (согласно его Y-координате), // чтобы можно было проходить "перед" и "позади" объектов. sr.sortingOrder = (int)(transform.position.y * -100);
// Примечание: у остальных объектов тоже должен быть настроен порядковый номер // для корректной отрисовки. } }
Проделанных манипуляций будет достаточно, чтобы получить желаемую функциональность. Расстановка декораций, настройка sortingOrder, генерация облаков - это уже тема для нового обсуждения Чтобы создать по-настоящему живой и красивый мир - придётся разбираться. Вы сэкономите своё же время, если возьмётесь за это раньше. Я бы порекомендовал разбирать чужие примеры. Как у вас с английским? Достаточно "чтение со словарём".
Сообщение отредактировал Rean - Воскресенье, 12 Февраля 2017, 22:53
URGINSAN, есть грешок. А ещё периодически окончания прилагательных, как у гостей из центральной Азии: хороший девочка. "Какой шустрый мух - то на ВАМ, то на МНУ!"
Позволю себе не согласиться. Мы пользуемся велосипедом не потому что не можем сделать свой или не понимаем как он работает, а потому что экономим своё время и ценим успешный труд других. Но допустим мы взяли велосипед. Сам по себе велосипед нам не нужен, да и удовольствие от его использования мы особо не испытываем. Основное его назначение для нас, к примеру, - добраться из пункта А в пункт Б. Если мы не умеем кататься на велосипеде, то мы вполне можем попросить кого-нибудь отвезти нас на нашем велосипеде в нужное место. Подобная разовая акция вполне имеет место. Но практика показывает (особенно на этом форуме), что если человек взял себе велосипед, то он собирается не один раз прокатиться из А в Б, а грезит себя финалистом "Тур де Франс". И вот тут уже, хочешь-не хочешь, а научиться кататься придётся. А коль вообще нет желания учиться, то вполне можно делегировать эту "задачу" кому-нибудь другому. Кто за какие-нибудь коврижки согласиться катать тебя взад-вперёд. Так и сейчас. Сомневаюсь, что автору темы необходим лишь описанный функционал и не более. Даже если и найдётся "добрый самаритянин", готовый отвечать на все вопросы автора на этом форуме, то ничего хорошего (в плане результата) из этого не выйдет. Как говорится: плавали - знаем.
Сообщение отредактировал Rean - Суббота, 11 Февраля 2017, 20:46
Kxarog, солидарен с коллегами выше. Суть в том, чтобы разобраться самому, так как если простейшие задачи вызывают сложность и порождают вопросы, то в дальнейшем, при более серьёзных задачах, сложность и вопросы будут расти в геометрической прогрессии. И уже вряд ли кто-то на форуме сможет/захочет помогать.
ЦитатаKxarog ()
Я вроде все объяснил что гайдов, уроков и примеров по данной интересующей меня теме нет
Если вы ищите конкретную реализацию - вполне возможно, что её нет. Уроки и документация, как правило, дают не конкретные рецепты (за исключением различных CookBook'ов), а понимание инструмента. А судя по:
Цитата
я даже не уверен возможна ли вообще моя идея
понимание инструмента отсутствует. Я сам не сторонник нравоучений. Всё что говорю - говорю из благих побуждений, не пытаюсь кого-либо принизить или послать, но призываю вдумчиво разобраться в вопросе в общем и инструменте - в частности.
ЦитатаKxarog ()
одна бредовая идея, повесить на все спрайты коллайдеры, а некоторые из них повесить тег, и персонаж проверяет этот коллайдер с таким тегом? если да - можешь идти, нет - стоять
Отчего же она бредовая? Вполне себе идея. Надо брать её и реализовывать. Чтобы её реализовать - достаточно знать основные инструменты Unity. Про инструменты - выше.
Цитата
Извините конечно что наглею, а есть еще варианты реализации этой идеи?
Есть. Ограничены они лишь фантазией разработчика и средствами разработки. Последнее у Unity в достатке. Как вариант: создаём объект с полигональным коллайдером. Определяем его поведение как "триггер". Придаем коллайдеру форму требуемой зоны и назначаем объекту тег, к примеру, "MoveArea". Объекту игрока тоже добавляем коллайдер и Rigidbody2D. Коллайдер настраиваем так, чтобы он был только в нижней части спрайта (где ноги); в Rigidbody убираем все физические воздействия и замораживаем вращение. Остаётся только в скрипте игрока прописать два ключевых момента: движение с помощью Rigidbody (MovePosition) в FixedUpdate и проверку на выход из триггера с тегом MoveArea в событии OnTriggerExit2D (при выходе возвращаем на прежнюю позицию). Не исключены нюансы, но смотреть надо по факту. Это что касается метода без множества сущностей. Хотя VerdCS будет проще именно в плане реализации стандартными методами.
Kxarog, я рад, что вас позабавил ответ. Забавный он потому, что если вопрос сформулирован как:
Цитата
как создать зону по которой можно ходить
то он уже содержит в себе ответ:
Цитата
нужно сделать зону по которой можно ходить
Отталкивайтесь от того, как бы вы это реализовали с помощью псевдокода. Далее, просто реализуем это в рамках определенной среды. Несмотря на то, что это выглядит как:
На самом деле, решение скрывает за собой то, что вы уже изложили в своём вопросе выше. Используйте триггеры (если хотите, можно и коллайдеры) и слои/теги. Или вам нужен конкретный пример и способ решения?
Kxarog, задача достаточно простая. Попробуй отталкиваться не от того, где ходить нельзя, а от того - где ходить можно. Создай специальные зоны, внутри которых игрок может передвигаться. Физика здесь не нужна, можно обойтись достаточно примитивными средствами.
priestevi, не совсем понятно относительно чего выбирается направление: камеры, персонажа или фиксированные направления. В большинстве согласен с Wite. Не совсем корректно используются углы Эйлера и/или перемещение.
Ниже приведу два варианта.
1. Камера фиксирована, персонаж перемещается в направлении нажатой клавиши (W, A, S, D - вверх, влево, вниз, вправо соответственно): Пример:
Код:
Код
Vector3 dir = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")) * moveSpeed; dir = Vector3.ClampMagnitude(dir, moveSpeed);
if (dir != Vector3.zero) { rb.MovePosition(transform.position + dir * Time.deltaTime); rb.MoveRotation(Quaternion.LookRotation(dir)); }
2. Камера фиксирована, перемещение персонажа при помощи вращения и движения прямо/назад (W, S - прямо и назад; A, D - поворот влево и вправо соответственно) Пример:
Код:
Код
// Вынести за функцию float rotSpeed = 3f;
// Внутри функции float rotation = Input.GetAxis("Horizontal") * rotSpeed; float move = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;
ASH2, на движимом объекте обязательно должен стоять Rigidbody2D с включенной симуляцией. Для того, чтобы всегда срабатывал OnTriggerStay2D, нужно режим сна у Rigidbody2D установить в Never Sleep, либо использовать конструкцию, которую описал XanKriegor. У тому же, движение физических объектов желательно производить в FixedUpdate и через компонент RigidBody2D. Если делать движение через transform, то при быстром перемещении будут "пролёты" - не будет фиксироваться коллизия.
Сообщение отредактировал Rean - Воскресенье, 29 Января 2017, 20:09
Варианта два: вернуть к прежнему выравниванию сразу после конструкции switch { }, либо непосредственно перед отрисовкой в игровой комнате. P.S. GameMaker'а сейчас нет под рукой, но насколько я помню, для выравнивания по вертикали используются fa_top, fa_middle, fa_bottom; значение fa_center используется для выравнивания по горизонтали (draw_set_halign).
Добавлено (29 января 2017, 20:01) --------------------------------------------- Собственно, выше уже ответили)