Разберете позицията на трансформация и научете прости методи за това как да премествате игрови обекти в Unity.

Ресурси

Github: https://github.com/Jerga99/YT-Example-Proj-Unity

Youtube лекция: https://www.youtube.com/watch?v=6L9aYyRg3A0

Пълен курс: https://academy.eincode.com/courses/the-complete-unity-guide-3d-beginner-to-rpg-game-dev-in-c

Първо основите

Всеки обект в Unity притежава Transform. Трансформацията отговаря за позицията, ротацията и манипулирането на мащаба на обекта.

Всеки обект, поставен в сцената на Unity, има някаква начална позиция, ротация и трансформация.

Обектът се намира в 3D или 2D пространство, в зависимост от вида на проекта. В нашия случай ще работим върху 3D проект.

Нека да разгледаме примера на обект Капсула, разположен в 3D пространство.

Центърът на равнината се намира в позиция (0,0,0), докато точката в 3d пространството се определя от 3 стойности, разположени върху оста (X, Y, Z).

Всяка позиция на оста има различна стойност. Започвайки от централната позиция (0,0,0), отивайки надясно, се увеличава X стойността, вървейки нагоре Y стойността се увеличава и накрая вървейки напред Z стойността се увеличава. Преминаването в обратната посока на споменатата ос води до намаляване на стойността.

За да намерите точка в 3D пространството, трябва да знаете всичките 3 координати (X, Y, Z)

Сега нека видим къде ще бъде разположена капсулата на позиция (1,1,1)

Сега капсулата се намира точно на 1 метър Unity по оста X, 1 метър по оста Z и 1 метър нагоре по оста Y. Може би задавате въпроса „Защо капсулата е 1 метър на Y?“

Е, обектът Капсула има 2 метра, така че центърът на капсулата е на 1 метър над земята.

Ето защо той трябва да бъде поставен на 1 метър по оста Y. В противен случай тялото ще бъде наполовина в средата на самолета.

Променете позицията в кода

Можете да промените позицията на обекта в кода, като манипулирате свойството transform на обекта.

Позицията е представена вътрешно от структурата, наречена Vector3. Вектор3 съдържа 3 стойности -› x,y,z

Нека преместим обекта на играта на позиция (1,1,1)

transform.position = new Vector3(1.0f, 1.0f, 1.0f);

Просто като това!

Това са основите, които трябва да знаете за позицията. Запомнете позицията е местоположение в пространството, представено от стойността (X, Y, Z), всяка от които лежи върху собствената си ос.

Сега ще създадем функционалност за преместване на капсулата, когато играч натиска клавиши за въвеждане на клавиатурата.

Сценарий за движение

Първо създайте нов скрипт, наречен Movement.cs, и го добавете към обекта Capsule.

Ще поставим функционалността за движение в метода Актуализиране. Актуализацията се изпълнява през цялото време на игра на играта — колко често зависи от честотата на кадрите на вашата игра.

Относно актуализацията

Методът Актуализиране се извиква веднъж на кадър.

Ако играта работи при 140 кадъра в секунда, тогава актуализацията се извиква 140 пъти в секунда. Това го прави чудесно място за функционалност, която трябва да се случва постоянно по време на играта.

Обработката на въвеждане на играч обикновено е функционалност, която се поставя в метода за актуализиране.

Заснемане на вход от играч

За да преместим обект на игра, трябва да уловим вход от играч. Ако играч използва като входно устройство клавиатура, ние искаме да заснемем, докато той натиска клавишите със стрелки или клавишите AWSD на клавиатурата.

За тази цел можем да напишем следния код в Update.

void Update() {
  float horizontalInput = Input.GetAxis("Horizontal");
  float verticalInput = Input.GetAxis("Vertical");
  Debug.Log("H-> " + horizontalInput);
  Debug.Log("V-> " + verticalInput);
}

Входните стойности обикновено са стойности в диапазона между -1 и 1. Опитайте.

Хоризонтална ос

Хоризонтална стойност от 0 означава, че НЕ е натиснат клавиш „движение“.

Стойност 1 означава, че играчът натиска стрелката „надясно“ или клавиша „D“ (играчът иска да се премести надясно)

Стойност -1 означава, че играчът натиска стрелката “наляво” или клавиша “A” (играчът иска да се премести наляво)

Вертикална ос

Вертикална стойност от 0 означава, че НЕ е натиснат клавиш „движение“.

Стойност 1 означава, че играчът натиска стрелката „нагоре“ или клавиша „W“ (играчът иска да продължи напред)

Стойност -1 означава, че играчът натиска стрелката „надолу“ или клавиша „S“ (играчът иска да се придвижи назад)

Получаването на стойност от 0 до 1 или от 0 до -1, докато потребителят държи натиснати клавишите за движение, няма да се случи веднага, но с настройките по подразбиране на Unity ще се случи супер бързо!

Така че, докато задържате стрелката „надясно“ за една секунда, можете да получите стойности при хоризонтално въвеждане, 0, 0,1, 0,3, 0,5, 0,7, 1, 1, 1, 1… достигайки 1 стойност почти веднага.

Това са само илюстративни стойности, можете да получите напълно различни.

Тъй като можем да уловим въведеното от играча, ние сме почти готови за движение.

Готов за нанасяне

Нека разширим текущото изпълнение.

void Update() {
  float horizontalInput = Input.GetAxis("Horizontal");
  float verticalInput = Input.GetAxis("Vertical");
  Vector3 movement = new Vector3(horizontalInput, 0, verticalInput);
  transform.Translate(movement);
}

Ние се местим!

Ще забележите едно нещо. Движим се твърде бързо.

Първо, нека обясним кода по-горе.

Ние съхраняваме вертикалните и хоризонталните стойности в структурата Vector3, за да ги приложим за промяна на позицията на обекта в играта.

Както споменах преди, всеки игрови обект има позиция, представена от (X, Y, Z) стойност.

Трябва да приложим тази промяна на позицията под формата на Vector3 и след това да я предоставим на метода Превод. Методът Превод ще премести обект на игра в посока и разстояние на превод.

Представете си тези 3 случая:

Обектът ще се премести надясно, когато играч държи стрелката „надясно“ или „D“, защото Vector3 държи стойност (1,0,0), което изразява промяна в посока на оста X.

Обектът ще се придвижи напред, когато играч държи стрелката „нагоре“ или „W“, защото Vector3 държи стойност (0,0,1), която изразява промяна на посоката по Z-ос.

Обектът ще се движи диагонално, когато играч държи стрелката „нагоре“ или „W“ едновременно със стрелката „надясно“. или клавиш „D“, тъй като Vector3 държи стойност (1,0,1), която изразява промяна в посоката по оста X и Z.

Тези промени се прилагат към текущата позиция на игровия обект. Можете да мислите за игровия обект като център на самолета.

Защо обектът се движи бързо?

Обектът на играта се движи бързо, защото Update се извиква много пъти за една секунда. Представете си, че стабилната честота на кадрите (FPS) е 50. 50 FPS означава, че играта ви се актуализира 50 пъти в секунда, следователно Актуализация се извиква 50 пъти в секунда.

Това също означава, че задържането на клавиши за въвеждане за дължина от 1 секунда ще доведе до 50 изпълнения на

Vector3 movement = new Vector3(horizontalInput, 0, verticalInput);
transform.Translate(movement);

така че ако Vector3 ще бъде (1,0,0), тогава ще се местя всяка секунда с 50 метра надясно, защото Update се извиква 50 пъти в секунда.

Нашата функционалност зависи от рамката. За да се движим само с 1 метър в секунда, трябва да намалим стойността на движението.

Време делта

Първо актуализирайте превода по този начин

transform.Translate(movement * Time.deltaTime);

Ако играете играта сега, ще забележите, че движението е фиксирано и се движите хубаво и бавно.

Делта във времето е времето за завършване на последния кадър в секунди.

Отново си представете стабилна честота на кадрите от 50 кадъра за 1 секунда. Времето за завършване на всеки кадър ще бъде 0,02 секунди, защото 50 * 0,02 = 1 секунда

Ако умножите движението по 0,02, ще намалите стойността му, ако това се случи 50 пъти в секунда, тогава Vector3(0,0,1) ще приложи движение от 1 метър в секунда.

Сега функционалността на движението зависи от времето. Ще използвате Time.deltaTime много.

Окончателни подобрения

Ако движението е твърде бавно, умножете движението с някаква по-висока стойност. Да приемем, че искате да преместите капсулата да се движи с 6 метра в секунда.

Vector3 movement = new Vector3(horizontalInput, 0, verticalInput);
transform.Translate(movement * 6.0f * Time.deltaTime);

Това е.

Сега окончателният код.

void Update() {
  float horizontalInput = Input.GetAxis("Horizontal");
  float verticalInput = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(horizontalInput, 0, verticalInput);
  movement.Normalize();
  transform.Translate(movement * 6.0f * Time.deltaTime);
}

Можете да забележите, че извиках метода Нормализиране при движение. В случай на диагонално движение ще се движите по-бързо. Нормализирането ще го „поправи“ и движението ще бъде еднакво във всяка посока.

Обяснявам Normalize много по-подробно в другия си видеоклип в Youtube: https://www.youtube.com/watch?v=oCU8Ew1XTbs&t=3s

Обобщение

Сега трябва да имате основно разбиране за това как да преместите обект на игра в Unity. Всичко е свързано само с промяната на позицията през някакъв интервал от време.

Не забравяйте да проверите и други ресурси:

Github: https://github.com/Jerga99/YT-Example-Proj-Unity

Youtube лекция: https://www.youtube.com/watch?v=6L9aYyRg3A0

Пълен курс: https://academy.eincode.com/courses/the-complete-unity-guide-3d-beginner-to-rpg-game-dev-in-c

наздраве,

Филип