Как создать безье путь для 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. Логически безье тут не создается. Я это и имел в виду, просто неправильно выразился.
|
|
| |