Unity, изменение координат через transform.position
В скрипте привязанном к одному объекту пишу
public GameObject второй объект (пишу образно)
далее в методе Update пишу второй объект. transform.position = new Vector(свои коорды);
Почему это не работает? как можно изменить координаты объекта через скрипт из другого объекта
Пытался сделать у второго объекта метод teleport(float,float,float), и вызывать его через GetComponent у первого объекта, тоже не работало
Дополнен 4 года назад
Могу кинуть фрагмент кода, если недостаточно подробно описал проблему
Дополнен 4 года назад
Пацаны, которые тоже столкнулись с этим. Проблема с CharacterController, отключайте его перед тем как изменить transform.position
Лучший ответ
На gamedev.ru иди, там подскажут
Как поменять координаты объекта по его локальной оси?
Здравствуйте, помогите. Уже 2й день пытаюсь запрограммировать спавн пули впереди края ствола. Я высчитал какой должен быть отступ от Transform ствола до Transform пули, допустим он равен 5f. Я хочу чтобы как только я заспавнил пулю и задал ей rotation равным rotation стволу пуля переместилась по направлению ствола на 5f. Я знаю, что что-то похожее можно сделать с помощью Translate(bullet.forward*speed), но тогда пуля начнёт ЛЕТЕТЬ в нужном направлении, а мне нужно чтобы она СДВИНУЛАСЬ на 5f по оси forward.
Пробовал bullet.position += bullet.TransformPoint(new Vector3(0,0,5f), но пуля смещалась по мировым координатам Z, а не по локальным. Надеюсь объяснил более-менее понятно.
- Вопрос задан более двух лет назад
- 153 просмотра
Комментировать
Решения вопроса 1
Моргенштерн Ахмедович @Lil_crystal Автор вопроса
Всё, Хабровчане, я понял. Я неправильно использовал TransformPoint(new Vector3 (0,0,5f)). Нужно было его не прибавлять, а присваивать к bullet.position.
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Как изменить позицию дочернего объекта при создании (куратина)?
Я хочу при создании дочернего игрового объекта, допустим Cube, изменить его положение относительно родителя, по вектору родителя, но пока я в тупике.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Strike : MonoBehaviour < public GameObject Cube; public void SetParent(GameObject Sphere) < Cube.transform.parent = Sphere.transform; >void Update() < if (Input.GetMouseButtonDown(0)) StartCoroutine(instObj()); Cube.transform.position = transform.position; >IEnumerator instObj() < yield return new WaitForSeconds(0f); Instantiate(Cube); >>
На что меня только хватило, это
instCube = Instantiate(Cube) as GameObject; instCube.transform.localPosition = new Vector3(0f, 25f, 0); instCube.transform.position = transform.position;
Но это ни сколько не помогло. Он так же создаёт дочерний объект внутри родительского объекта. Даже при таком большом значении Y.
Подскажите пожалуйста. В каком направлении мне двигаться, что бы решить эту задачу. Так как опыта пока у меня мало. Что почитать, что изучить?
- Вопрос задан более трёх лет назад
- 3823 просмотра
Комментировать
Решения вопроса 0
Ответы на вопрос 1
Denis Gaydak @MrMureno Куратор тега Unity
VR for all
что ж давайте попробуем разобрать
instCube.transform.localPosition = new Vector3(0f, 25f, 0); instCube.transform.position = transform.position;
в первой строке вы сместили локальную позицию (относительно родителя, если он в этот момент есть).
потом следующей строкой вы присваиваете ГЛОБАЛЬНЫЕ координаты этому же объекту.
Вы перезатираете значения ранее установленные (возможно думая что смещение как-то дополнительно останется).
Вам надо или все время прибавлять смещение для дочернего объекта или перестать его двигать(изменять) и менять координаты/двигать родителя.
Плюс после Instantiate — не забудьте сначала родителя назначить, по умолчанию там Null и объект будет просто в корне иерархии.
Ответ написан более трёх лет назад
Нравится 1 3 комментария
Вячеслав Марвин @Marcheslav Автор вопроса
Спасибо за ответ.
Можете пожалуйста ещё подсказать. Если я убрал
instCube.transform.position = transform.position;
то он у меня создаётся в одном и том же месте. Я старался этой строчкой создать изменение позиции, при изменении позиции родителя. Чем я могу её заменить, чтобы при движении родителя, дочерний объект создавался на определённом расстоянии от родителя по вектору его?
Таким образом, я хочу чтобы при нажатии кнопки, создавался объект и после чего отправлялся по вектору камеры вперёд и толкал другой объект, по типу снаряда. По-этому посчитал, что функция «Луч» не подойдёт для меня.
Так же, хотел бы узнать, как добавлять родителя в «Instantiate», так как скрипт уже висит на родителе. И в этой функции указываю, кто родитель
public void SetParent(GameObject Sphere)
Denis Gaydak @MrMureno Куратор тега Unity
давайте попробую еще раз пояснить о чем я.
instCube.transform.parent = Sphere.transform; instCube.transform.localPosition = new Vector3(0f, 25f, 0)
в этом случае сместит относительно родителя,корректно и правильно.
instCube.transform.localPosition = new Vector3(0f, 25f, 0) instCube.transform.parent = Sphere.transform;
в этом случае сначала сместит, а потом уже станет дочерним объектом и как там сместилось — не ясно и может быть бардак.
а про изменение позиции — если объект стал дочерним. то при изменении позиции родителя — он и так будет двигаться вместе с родителем.
если вам нужно чтоб он и с родителем двигался и еще дополнительно относительно родителя смещался — то вам надо на дочернем объекте писать свое движение. как ? это уже смотреть уроки и примеры, чтоб понять принципы основные.
Вячеслав Марвин @Marcheslav Автор вопроса
К сожалению. В данном случаем
public GameObject Cube; private GameObject instCube; public void SetParent(GameObject Sphere) < //Cube.transform.parent = Sphere.transform; instCube.transform.parent = Sphere.transform; >void Update() < if (Input.GetMouseButtonDown(0)) StartCoroutine(instObj()); Cube.transform.position = transform.position; >IEnumerator instObj() < yield return new WaitForSeconds(0f); instCube = Instantiate(Cube) as GameObject; //instCube.transform.parent = Sphere.transform; instCube.transform.localPosition = new Vector3(0f, 0.5f, 0.7f); //instCube.transform.localPosition = transform.localPosition; >
объект создаётся с заданными позициями. Но при перемещении родителя, последовательно создаётся в том же самом месте, а не с новыми координатами родителя.
возможно ли в unity изменить начало координат объекта? т.е. перенести его, и чтобы новое положение было нулевым по оси X, Z, Y?
возможно ли в unity изменить начало координат объекта? т.е. перенести его, и чтобы новое положение было нулевым по оси X, Z, Y?
Отслеживать
19k 6 6 золотых знаков 35 35 серебряных знаков 98 98 бронзовых знаков
задан 4 июл 2021 в 5:23
25 1 1 серебряный знак 2 2 бронзовых знака
Скорее нет, чем да. Но вы можете запомнить текущие положение в поле класса, и просто всегда вычитать его 🙂
4 июл 2021 в 6:29
А оно разве не нулевое всегда?
4 июл 2021 в 13:06
А зачем? Похоже на проблему XY
4 июл 2021 в 18:38
@SergeySkvortsov плохое и неудобное решение
6 июл 2021 в 6:41
@МаксимФисман я написал в своем ответе для чего
6 июл 2021 в 6:51
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Попробуйте создать пустой объект, перенесите в него нужные объекты, переместите пустышку в нужную позицию(XYZ) и изменяйте позицию своих объектов через transform.localPosition
Отслеживать
ответ дан 5 июл 2021 в 15:47
Даниил Ганин Даниил Ганин
71 9 9 бронзовых знаков
Это называется Pivot Point.
Юнити не поддерживает изменение Pivot Point из коробки. И вряд ли когда-нибудь будет.
Решение правильно подсказал Даниил Ганин в своем ответе — необходимо создать пустой обьект и внутрь него положить тот обьект который тебе необходимо. Пустой обьет в даном случае играет роль самого PivotPoint.
Для удобности советую сделать наоборот — сначала пустышку внутрь твоего обьекта, сместить куда необходимо, а потом в иерархии поменять местами — обьект поместить внутрь Pivot-a.
С вопросами для чего это используется. Вообще пивот очень широко используется в 3д моделировании, наверное, нету ни одного 3д-редактора который бы не поддерживал изменение пивота.
Это используется, например, что бы дверь открывалась сбоку где находятся петли, а не вращалась по центру оси.
Или, например, если нужно поезд привязать к рельсам — лучше будет если пивот вагона будет находится на уровне колес с (например) левой стороны, а сплайн по которому поезд движется — будет находится на самой рельсе. Это вместо кучи костылей. И тогда мы просто реализуем передвижение по рельсам двигая обьект по сплайну (в даном случае пивот)
Вобщем, вопрос очень полезен и использование пивота играет очень важную роль в геймдеве.