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
С английским как и с другими языками кроме русского и русского матерного, очень плохо, за код спасибо, по поводу других примеров, естественно я разбираю другие коды и не только на вашем форуме, видеуроки и руководства но... как я уже описывал выше не всегда удается найти даже что то отдаленно похожее на нужную тему(к примеру те же гайды по 2D их много, но они почти все про платформеры и только)