Як зробити керування персонажем на Unity 3D та 2D.
Ми покажемо, як запрограмувати рух персонажа у 2D- та 3D-проектах на Unity.
Розробляти ігри на движку Unity можуть діти вже з 10 років. Unity Школа програмування для дітей «Піксель» підготувала докладний урок про те, як навчити персонажа рухатися в 2D-і 3D-ігри на Unity.
Опрацювання рухів персонажа у 3D
Почнемо урок з Unity з поділу ігрової сцени на два компоненти, де перший - це майданчик, яким персонаж буде переміщатися Інакше кажучи, це Plane Другий компонент - об'єкт самого героя, Sphere.
Далі переходимо до пожвавлення об'єктів. Управління персонажем на Юніті має бути фізично правильним.
Як ви змусите об'єкти існувати за своїми законами? Саме ви є творцем свого світу і вільні самі задавати йому фізику.
Створюємо порожній скрипт і прописуємо змінні, які будуть відповідати за швидкість руху, швидкість повороту, пересування по вертикалі та горизонталі.
Пересування персонажем
Більшість ігор, як правило, мають у собі функції пересування, які присутні у ігрових персонажів, ботів або інших ігрових об'єктів.У статті ми розглянемо кілька способів реалізації пересування персонажем.
Спосіб 1. Зміна координат
Спочатку потрібно зрозуміти, що таке пересування об'єкта? – Це плавна зміна координат X і Y (якщо говорити про 2D ігри) у нашого об'єкта. Отже, пересування будь-якого об'єкта необхідно циклічно змінювати його координати, цим, створюючи ефект пересування. Координати будь-якого ігрового об'єкта знаходяться у класі (компоненті) Transform. Змінимо позицію об'єкта по осі X на одиницю праворуч, через метод FixedUpdate():
У представленому вище коді спочатку ми отримуємо поточну позицію об'єкта по осі X за допомогою transform.position.x. Після чого пересуваємо наш об'єкт на одну одиницю праворуч за допомогою оператора +1.
Насправді цей код можна спростити використовуючи метод Translate(), який одразу змінює позицію об'єкта на певне значення.
Поданий код змінює позицію об'єкта на 1 праворуч по осі Х, і на 3 одиниці вниз по осі Y.
Пересувати ігровий об'єкт ми навчилися. Але що робити, якщо нам пересувати об'єкт потрібно тільки в той момент, коли була натиснута певна кнопка. Для цього скористаємося Input.GetAxisRaw("Horizontal") і Input.GetAxisRaw("Vertical").
Input.GetAxisRaw("Horizontal") відповідає за горизонтальне пересування. Воно отримує значення -1, якщо гравець рухається НАЗАД (натиснув стрілочку вліво). Під час руху ВПЕРЕД(натиснута стрілочка вправо), ми отримуємо значення 1.
Input.GetAxisRaw("Vertical") відповідає за вертикальне пересування. Воно повчає значення -1, якщо гравець рухається НАЗАД (натиснув стрілку вниз). Під час руху ВПЕРЕД(натиснута стрілочка вгору), ми отримуємо значення 1.
Так само стрілочки «вліво», «вправо», «вгору» і «вниз», відповідають натисканням клавіш A, D, W і S. Але їх також можна змінити в налаштуваннях Unity. Ці настройки знаходяться в меню Edit - Project Settings - Input Manager.
Давайте трохи переробимо наш код:
Останнє, на чому хотілося б звернути увагу, це на швидкості пересування об'єкта. Щоб вказати швидкість, з якою ми пересуватимемо нашого персонажа, нам необхідно оголосити змінну, наприклад runSpeedі помножити її на наші параметри методу GetAxisRaw. Підсумковий код пересування буде виглядати так:
використовуючи System.Collections; використовуючи System.Collections.Generic; using UnityEngine; Public class PlayerMovement : MonoBehaviour < public float runSpeed = 0.3f; void FixedUpdate() < transform.Translate(Input.GetAxisRaw("Horizontal") * runSpeed, Input.GetAxisRaw("Vertical") * runSpeed, 0); >>
Спосіб 2. Токання
Дуже часто при реалізації пересування, розробники хочуть, щоб персонаж, що пересувається, не проходив крізь стіни та інші тверді об'єкти. Тому для реалізації такого пересування використовують компонент Rigidbody2D, та його метод velocity(). Сенс цього пересування в тому, що ми не переміщаємо наш об'єкт по координатах (як у попередньому способі), а ми ніби штовхаємо його. І якщо наш об'єкт зустріне перешкоду на своєму шляху, він буде уповільнений або повністю зупинений. Цей спосіб пересування найпоширеніший.
Оскільки ми будемо працювати з компонентом Rigidbody2D, то оголосимо для неї поле rigidbody, а також оголосимо швидкість пересування об'єкта в полі runSpeed:
private Rigidbody2D rigidbody; public float runSpeed = 5.0f;
Тепер нам необхідно отримати посилання на екземпляр класу (компонента) Rigidbody2D, адже саме через цей компонент ми і переміщатимемо нашого персонажа.
Тепер ми можемо за допомогою rigidbody, звернутися до методу velocity – який, як говорилося вище, штовхатиме наш об'єкт у певну сторону. Щоб ці значення змінити як нам необхідно, скористаємося new Vector2(1, 0). Наприклад, нам необхідно перемістити об'єкт вправо по осі Х на одиницю:
Розберемо кілька важливих моментів. У компоненті Rigidbody2D властивість velocity може мати всього 2 параметри, X і Y.Чим вище X і Y, чим сильніше наш об'єкт штовхатиметься за відповідними координатами. Наприклад, якщо ми хочемо направити персонажа рухатися вправо (по вектору X), то нам потрібно першим параметром передати значення більше за нуль, наприклад, velocity (6, 0). Якщо потрібно рухатися вліво, то velocity(-6,0). Аналогічна ситуація з віссю Y.
Використовуючи Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical") і runSpeed з попереднього уроку, змінимо наш код:
Підсумковий код пересування буде виглядати так:
використовуючи System.Collections; використовуючи System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour < private Rigidbody2D rigidbody; public float runSpeed = 5.0f; void Start() < rigidbody = GetComponent(); > private void FixedUpdate() < rigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * runSpeed, Input.GetAxisRaw("Vertical") * runSpeed); >>
Пересування персонажа в Unity 2D та 3D
Вітаю! У статті ми розберемо правильну реалізацію руху персонажа. Оскільки рух 2D і 3D персонажів майже на 100% едентичні, ми по черзі їх і розберемо. Завдяки чому, розробник-початківець не тільки розбереться в тому, як реалізувати функцію пересування, але побачить різницю між рухами 2D і 3D.
Почнемо свій нехай з 2D пересування, оскільки він трохи легший у розумінні.
Пересування 2D персонажа
Насамперед створимо ігровий об'єкт нашого персонажа, і назвемо його, наприклад, Player.
Далі додамо до нашого персонажа компонент Rigidbody 2D. Якщо у Вашій грі відсутні закони гравітації, то в полі Body Type необхідно вказати значення "Kinematic".
P.S. Зазвичай гравітація відсутня у 2д іграх з видом зверху.
Тепер найцікавіше нам необхідно створити C# скрипт з назвою, наприклад movePlayer, та присвоїти цей скрипт нашому об'єкту Player. А сам скрипт повинен мати такий вміст:
використовуючи System.Collections; використовуючи System.Collections.Generic; using UnityEngine; public class movePlayer : MonoBehaviour < private Rigidbody2D rb; public float speed = 0.5f; private Vector2 moveVector; void Awake() < rb = GetComponent(); > void Update() < moveVector.x = Input.GetAxis("Horizontal"); moveVector.y = Input.GetAxis("Vertical"); rb.MovePosition(rb.position + moveVector * speed * Time.deltaTime); >>
Готово! Давайте розберемо наш код. У рядках 7,8,9 ми створили 3 змінні:
- rb - яка зберігатиме посилання на компонент Rigidbody2D
- Speed - швидкість пересування вашого персонажа
- moveVector - Напрямок руху персонажа у вигляді вектора
Далі в 13 рядку ми в змінну rb надає посилання на наш компонент Rigidbody2Dщоб надалі можна було б працювати з його властивостями та методами.
У рядку 18 до змінної moveVector.x ми записуємо значення руху по горизонталі. Якщо максимально простими словами, при натисканні на клавішу "D", в змінній записується значення "1" - вперед. При натисканні на кнопку "A" - змінну записується "-1" - назад.
Аналогічна ситуація відбувається і у 19 рядку. При натисканні на клавішу "W" в змінній записується значення "1" - вгору. При натисканні на клавішу "S" - змінну записується "-1" - вниз.
Ну і в 20 рядку, за допомогою методу MovePosition, ми змушуємо рухатися нашого персонажа, виходячи зі значень, які ми отримали в moveVector.
Тепер Ваш персонаж може спокійно пересуватись у світовому просторі. Як бачите, все дуже просто та зрозуміло. Тепер, як і обіцяв, перейдемо до 3D.
Пересування 3D персонажа
Для початку створимо ігровий об'єкт персонажа з назвою, наприклад, Player. А також створимо об'єкт Землі, якою персонаж буде пересуватися. І назвемо його, наприклад, Ground.
Також додаємо до персонажа компонент Rigidbody - Щоб на нього діяла гравітація (якщо потрібно).
Тепер так само необхідно створити C# скрипт з назвою, наприклад movePlayer, і привласнюємо цей скрипт нашому об'єкту Player. А сам скрипт повинен мати такий вміст:
використовуючи System.Collections; використовуючи System.Collections.Generic; using UnityEngine; public class movePlayer : MonoBehaviour < private Rigidbody rb; public float speed = 0.5f; private Vector3 moveVector; void Awake() < rb = GetComponent(); > void Update() < moveVector.x = Input.GetAxis("Horizontal"); moveVector.z = Input.GetAxis("Vertical"); rb.MovePosition(rb.position + moveVector * speed * Time.deltaTime); >>
Як бачите, цей код майже на 100% аналогічний. Погляньмо, що ми тут змінили.
- У 7 і 13 рядку ми змінюємо тип компонента з Rigidbody2d на Rigidbody, адже ми вже маємо справу не з 2д, а з 3д.
- У 9 рядку тип змінної moveVector змінено з Vector2 на Vector3, так як у ігор 3D, три світові осі, а не дві.
- У 19 рядку ми змінили moveVector.y на moveVector.z, Оскільки в 3D іграх, вісь Y відповідає за верх. А нагору йти не можна. Вгору можна пересуватись лише за допомогою стрибка, який ми реалізуємо в наступній статті.
На цьому все. Сподіваюся, дана стаття навчила Вас реалізації пересування персонажа, а так само показала в чому принципова різниця пересувань між 2D і 3D іграми.
Якщо вам дана стаття допомогла, буду радий вашим лайкам. Дякую :)