Суббота, 21 Декабря 2024, 07:58

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как создать безье путь для Tower Defense на Unity?
RobitIДата: Среда, 04 Января 2023, 17:04 | Сообщение # 1
был не раз
Сейчас нет на сайте
Я хочу сделать плавное передвижение противников на округленных путях, но у меня не получается объединить скрипт с передвижением объекта по безье со скриптом по составляющей Tower Defense

Скрипт для создания безье:

[SerializeField]
private Transform[] controlPoints;

private Vector3 gizmosPosition;

private void OnDrawGizmos()
{
for (float t = 0; t <= 1; t += 0.05f)
{
gizmosPosition = Mathf.Pow(1 - t, 3) * controlPoints[0].position + 3 * Mathf.Pow(1 - t, 2) * t * controlPoints[1].position + 3 * (1 - t) * Mathf.Pow(t, 2) * controlPoints[2].position + Mathf.Pow(t, 3) * controlPoints[3].position;

Gizmos.DrawSphere(gizmosPosition, 0.25f);
}

Gizmos.DrawLine(new Vector3(controlPoints[0].position.x, controlPoints[0].position.y, controlPoints[0].position.z), new Vector3(controlPoints[1].position.x, controlPoints[1].position.y, controlPoints[1].position.z));
Gizmos.DrawLine(new Vector3(controlPoints[2].position.x, controlPoints[2].position.y, controlPoints[2].position.z), new Vector3(controlPoints[3].position.x, controlPoints[3].position.y, controlPoints[3].position.z));

}

Скрипт для передвижения объекта по безье:

[SerializeField]
private Transform[] routes;

private int routeToGo;

private float tParam;

private Vector3 objectPosition;

private float speedModifier;

private bool coroutineAllowed;

// Start is called before the first frame update
void Start()
{
routeToGo = 0;
tParam = 0f;
speedModifier = 0.5f;
coroutineAllowed = true;
}

// Update is called once per frame
void Update()
{
if (coroutineAllowed)
{
StartCoroutine(GoByTheRoute(routeToGo));
}
}

private IEnumerator GoByTheRoute(int routeNum)
{
coroutineAllowed = false;

Vector3 p0 = routes[routeNum].GetChild(0).position;
Vector3 p1 = routes[routeNum].GetChild(1).position;
Vector3 p2 = routes[routeNum].GetChild(2).position;
Vector3 p3 = routes[routeNum].GetChild(3).position;

while (tParam < 1)
{
tParam += Time.deltaTime * speedModifier;

objectPosition = Mathf.Pow(1 - tParam, 3) * p0 + 3 * Mathf.Pow(1 - tParam, 2) * tParam * p1 + 3 * (1 - tParam) * Mathf.Pow(tParam, 2) * p2 + Mathf.Pow(tParam, 3) * p3;

transform.position = objectPosition;
yield return new WaitForEndOfFrame();
}

tParam = 0;
routeToGo += 1;

if (routeToGo > routes.Length - 1)
{
routeToGo = 0;
}

coroutineAllowed = true;

}
Пожалуйста, скажите, как переделать эти скрипты для нужного результата
GMasstaДата: Среда, 04 Января 2023, 17:21 | Сообщение # 2
частый гость
Сейчас нет на сайте
Привет! ты используешь точки безье в обоих скриптах, но ты хочешь использовать только те, которые находятся в первом скрипте?

Make games, not war
Посмотри мои игры для мобилок, влепи лукаса!
Тут я делаю игры на Unity
falcowareДата: Среда, 04 Января 2023, 23:00 | Сообщение # 3
старожил
Сейчас нет на сайте


У нас проще делается: https://falco3d.com/documentation/d7/dd3/class_falco_engine_1_1_spline.html
CoreДата: Среда, 04 Января 2023, 23:40 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Цитата RobitI ()
Скрипт для создания безье

Как я вижу, в этом скрипте идет только отрисовка gizmos. Логически безье тут не создается.
PS. код в сообщении не читабельный. Используйте тег [codе]

Цитата falcoware ()
У нас проще делается

Вопрос был явно по Unity. Хватит оффтопить своим движком где попало


RobitIДата: Четверг, 05 Января 2023, 13:47 | Сообщение # 5
был не раз
Сейчас нет на сайте
Цитата Core ()
Как я вижу, в этом скрипте идет только отрисовка gizmos. Логически безье тут не создается.

Я это и имел в виду, просто неправильно выразился.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг