Днес ще поставим нов враг в нашата игра, използвайки това просто изображение, след което ще му присвоим ново движение, което преминава през екрана, вместо просто да слиза от горната част на игралното поле.

Първо, искаме да създадем празен обект и да му дадем името, което искате да има. След това добавяме box collider 2d, ridgidbody 2d, sprite renderer и нашия вражески скрипт.

Оттук отваряме програмата за изобразяване на спрайтове и плъзгаме и пускаме нашето изображение на врага в слота за спрайтове.

След това отворете кутийния колайдер 2d и се уверете, че полето за задействане е отметнато, защото ще използваме този колайдер, за да задействаме действия.

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

След като добавите иконата, обектът на играта трябва да е така.

Искаме да създадем от четири до пет обекта за игра, за да преведем врага през сцената.

Сега в нашия вражески скрипт, нека създадем три нови променливи със сериализирани полета. Единият ще бъде частен масив за трансформиране, който да задържи позициите на нашите игрови обекти; следващият ще бъде частен int, който ще следи към кой игрови обект трябва да се насочи нашият враг; и накрая, игрови обект, който ще държи лазера на нашия нов враг.

И накрая, нека получим достъп до скрипта на играча с частна променлива на Player, наречена _player( private Player _player;) създайте частен float за нашата скорост и го задайте на 2(private float _speed = 2f;) заедно с още два частни float, единият извикан може да задейства и другото повикване скорост на пожар ще сериализираме променливата за скорост на пожар, така че това в инспектора ( private float _canFire; /
[SerializeField] private float _fireRate = 0.5f;).

В нашата начална функция задаваме позицията на врага, като използваме „transform.position“, искаме това да е равно на нашите игрови обекти, които сега наричаме точки, така че казваме точка, а в скоби поставяме int име, което е точка индекс, това е равно на нула по подразбиране, тогава казваме „transform.position“. Така че нашият враг ще започне сега от какъвто и да е игрови обект, който поставим в нулевите слотове в нашия масив. И накрая, задайте скоростта на врага на 2f, която можем да коригираме по всяко време.

Сега нека създадем нов метод за нашето движение. Ще използваме оператор if и ще кажем дали индексът на точката е по-малък или равен на „waypoint.length“, който извиква масива от точки и всички обекти в него. След това минус едно, за да стигнем до нула.

Ще кажем на нашия враг да се придвижи към първата точка, използвайки „transform.position = Vector3.MoveTowards“, след което просто задаваме нашата точка по същия начин, както направихме в началото, и добавяме нашата зададена скорост, умножена по time.deltatime.

В рамките на същия метод, нека добавим друг оператор if и да кажем, че ако врагът е в позицията, която току-що сме задали в първия оператор if, нека започнем да добавяме към индексния номер на нашата точка с единица, като използваме “waypoint += 1”, това ще ни премести надолу по масива от позиции на игрови обекти.

Нека създадем друг оператор if за това, когато стигнем до края на масива обекти. Така че ще кажем, че индексът на точката е равен на „waypoint.length“, което означава партидата на масива. И така, сега казваме на врага да се придвижи до точката, зададена на нула с "waypointindex = 0."

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

Да кажем, че позицията на врага по оста x е по-голяма или равна на 9f, което е извън нашето поле за игра, използвайки „transform.position.x ≥ 9.0f.“

В този оператор if ние пресъздаваме същия враг в обхвата на противоположната страна на игралното поле, използвайки „tranform.position = new Vector3(Random.Range(-9f,-9.8f), 1, 0)“

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

Сега задаваме нашия нов вражески лазерен метод, като създаваме обекта на играта, наречен enemybeam, основно лазер. Искаме да трансформираме лазера в позицията на нашия враг. Все пак не искаме да го създаваме върху вражеския кораб, затова добавяме нов вектор3, за да можем да контролираме позицията на нашия нов лазер и искаме да го изместим по оста y на -1,5f, докато напускаме оста x и z на нула, тогава задаваме въртенето на нищо.

(Instantiate(_enemyBeam, transform.position + new Vector3(0,-1.5f,0), Quaternion.identity);)

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

Ако това твърдение ще кажем дали Time.time (Времето, когато играта започва) е по-голямо от това, което променливата float може да задейства, изпълнете следните команди, тъй като сега играта вече е започнала, преди врагът да е заредил Time.time винаги ще да бъде по-голям, отколкото може да стреля.

Първо, нека зададем скоростта на пожар между 1 до 3 секунди (fireRate = Random.Range(1f, 3f);)

Сега нека дефинираме променливата can fire към времето от началото на играта плюс скоростта на пожар (canfire = Time.time + fireRate;)

Сега поставяме лазерната функция вътре в този оператор if. Така че сега, на всеки 1 до 3 секунди, лазерът ще се задейства.

Сега, тъй като ще използваме нашия нов враг като сглобяем, ние също искаме да обърнем нашите четирипосочни точки, които създадохме в началото, и след това да ги плъзнем в нашия масив. Това ще ръководи кораба на врага. Искаме да възложим вашия нов сглобяем обект с лазерен лъч.

С новите точки в нашия скриптов масив можете да видите враговете да следват пътя на точките.