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