neděle 21. ledna 2018

Unity: Pohyb po vyznačené cestě

Momentálně tvořím malou hru v Unity - viz předchozí blogový příspěvek - a momentálně do ní přidávám různé druhy nepřátel. Co jsem se koukal na blogovou statistiku, příspěvky označené jako Unity mají celkem slušnou návštěvnost, a tedy rozhodl jsem se - když je stále ten začátek nového roku - podělit se o jeden, vcelku jednoduchý, skript jednoho takového AI nepřítele.


Jde o bota, který se kutálí po zemi, zdi, ale i stropě, rychlostí jakou chcete (ale teď jak o tom přemýšlím, docela srandovní by mohla být proměnlivá rychlost). Kutálí se podle vašeho předem připraveného plánu, tam i zpět. Bodů v plánu může být klidně i sto nebo tisíc, podle vaší fantazie. Já jsem se omezil jen na tři body, z nichž jeden je startovní pozice - čili prvním bodem naší, tedy botovy, cesty bude druhý bod, cesta[1]. Jakmile se dostane na poslední pozici, program se "otočí" a bot bude následovat náš plán v obráceném pořadí. Po dosažení startovního bodu se opět automaticky přehodí a pojede zase tak, jak jsme napsali náš plán jeho cesty.

A teď k samotnému kódu:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class bot7 : MonoBehaviour {
Transform tr;
bool isRotating;
public Vector3[] cesta;
public int indexC = 1;
public bool zpet;
void Start () {
tr = transform;
isRotating = true;
StartCoroutine (RotateBot ());
}
void Update()
{
if (indexC < cesta.Length && indexC > -1) {
tr.position = Vector3.MoveTowards (tr.position, cesta [indexC], 0.02f * Time.deltaTime);
if (zpet == false) {
if (Mathf.Approximately (tr.position.x, cesta [indexC].x) && Mathf.Approximately (tr.position.y, cesta [indexC].y)) {
indexC++;
}
} else {
if (Mathf.Approximately (tr.position.x, cesta [indexC].x) && Mathf.Approximately (tr.position.y, cesta [indexC].y)) {
indexC--;
}
}
} else {
if (zpet == false) {
zpet = true;
indexC = cesta.Length - 1;
} else {
zpet = false;
indexC = 0;
}
}
}
IEnumerator RotateBot()
{
while (isRotating) {
if (zpet == false) {
tr.Rotate (new Vector3 (0f, 0f, -120f * Time.deltaTime));
} else {
tr.Rotate (new Vector3 (0f, 0f, 120f * Time.deltaTime));
}
yield return null;
}
}
}
Pokud budete mít nějaké otázky, rád je zodpovím v komentářích.

coder zeal

0 komentářů:

Okomentovat