Здравствуйте. Прошу помощи.
Тут 2D проект без использования физики (Тетрис). Суть в том что когда мой объект приближается к определённым точкам, то он должен это чувствовать, все эти точки для удобства я привязал к пустому объекту. И теперь, при движении объекта, хочу проверять нет ли их поблизости. В руководстве нашёл эту статью - параграф "Нахождение дочерних объектов": http://docs.unity3d.com/ru/current/Manual/ControllingGameObje...
Как я понимаю тут циклом трансформ каждого дочернего объекта записывается в массив? Я решил в том же цикле проверять не находятся ли данные точки под "ногами" у моего объекта.
public bool bottom; void FixedUpdate () { All_Dead_Space = new Transform[transform.childCount]; int i = 0; foreach (Transform t in transform) { All_Dead_Space[i++] = t; //Переписал в массив координаты мёртвых точек if ((All_Dead_Space[i].transform.position.x == transform.position.x) && (All_Dead_Space[i].transform.position.y == transform.position.y-1.0F)) { bottom = true; //Если под кубом мёртвое пространство то дно рядом } } }
Но, при приближении объекта к точке, bottom всё равно остаётся false. Может что понял не так?
Помогите пожалуйста. И извините, если что не так, я стараюсь.
Ответ
Mangysta, думаю проблема в том, что вы неверно достаете deadspace
В поле deadSpaceRoot запишите свой "корневой объект" с мертвыми точками.
public bool bottom; public Transform deadSpaceRoot; //Сюда перетащить/записать объект с "мертвыми точками". void FixedUpdate() { if (deadSpaceRoot == null) { Debug.Log("DeadSpaceRoot == null"); return; } var deadSpacePoints = new Vector3[deadSpaceRoot.childCount]; for (int j = 0; j < deadSpaceRoot.childCount; j++) deadSpacePoints[j] = deadSpaceRoot.GetChild(j).transform.position; //Все "мертвые точки" теперь в массиве deadSpacePoints foreach (var deadSpacePoint in deadSpacePoints) { //Так как тип float неточный, используем функцию приблизительного сравнения значений if (Mathf.Approximately(deadSpacePoint.x, transform.position.x) && Mathf.Approximately(deadSpacePoint.y, transform.position.y - 1)) { bottom = true; break; //Прерываем цикл } } }
Смотрите также:
Комментарии
Не особо понял суть вопроса. У тебя объект должен двигаться строго определенными шагами? Или что?
Что ты подразумеваешь под понятием
должен это чувствовать
Не особо понял суть вопроса. У тебя объект должен двигаться строго определенными шагами? Или что?
Что ты подразумеваешь под понятиемдолжен это чувствовать
Кубы двигаются в четырёх направлениях шагом в координату и при приближении вплотную к запрётным зонам - проверка если на Х+1 или У+1 больше нельзя двигаться (например там стена стакана или другая фигура) куб должен будет поменять переменную на true. Поставить флажок. Скрипт управления фигуры потом читает эти флажки и блокирует движение в определённую сторону. Такая задумка.
Пока пытаюсь добиться чтобы куб упирался в дно. Если у куба координата У 10 например а у запретной точки 11 а Х совпадает то под ним донышко - bottom = true. )
Наставил этих точек на границах стакана и позже при падении фигуры все кубы тоже должны будут переименовываться в dead_space так они тоже будут учитываться новой фигурой.
Mangysta, думаю проблема в том, что вы неверно достаете deadspace
В поле deadSpaceRoot запишите свой "корневой объект" с мертвыми точками.
public bool bottom; public Transform deadSpaceRoot; //Сюда перетащить/записать объект с "мертвыми точками". void FixedUpdate() { if (deadSpaceRoot == null) { Debug.Log("DeadSpaceRoot == null"); return; } var deadSpacePoints = new Vector3[deadSpaceRoot.childCount]; for (int j = 0; j < deadSpaceRoot.childCount; j++) deadSpacePoints[j] = deadSpaceRoot.GetChild(j).transform.position; //Все "мертвые точки" теперь в массиве deadSpacePoints foreach (var deadSpacePoint in deadSpacePoints) { //Так как тип float неточный, используем функцию приблизительного сравнения значений if (Mathf.Approximately(deadSpacePoint.x, transform.position.x) && Mathf.Approximately(deadSpacePoint.y, transform.position.y - 1)) { bottom = true; break; //Прерываем цикл } } }
Возможность добавлять комментарии была ограничена
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]