Позиция объекта не меняется
В скрипте я создаю объект, добавляю ему родителя canvas и привязываю к нему изображение.
Я хочу, чтобы он оказался в позиции (x,y,z), но изображение (а значит и объект) появляется в центре экрана и не меняет позицию. Пробовал по-разному менять положение, пробовал и у объекта, и у привязанного изображения менять позицию — все также в центре экрана. Причем изменение размера через rectTransform.sizeDelta работает отлично.
GameObject newObject = new GameObject("ObjectName"); newObject.transform.SetParent(GameCanvas.transform, false); RectTransform rectTransform = newObject.AddComponent(); rectTransform.sizeDelta = new Vector2(100, 100); Image image = newObject.AddComponent(); image.sprite = Sprites[spriteNum]; newObject.GetComponent().anchoredPosition = new Vector3(targetPosition.x, targetPosition.y, floatz);
Пробовал разные варианты, не помогло (anchoredPosition, localPosition, position):
1 вариант. newObject.GetComponent().anchoredPosition = new Vector3(targetPosition.x, targetPosition.y, floatz); 2 вариант. newObject.transform.localPosition = new Vector3(targetPosition.x, targetPosition.y, floatz); newObject.transform.TransformPoint(new Vector3(targetPosition.x, targetPosition.y, floatz));` 3 вариант. rectTransform = newObject.AddComponent(); rectTransform.position = new Vector3(targetPosition.x, targetPosition.y, floatz); 4 вариант. transform.GetComponent().localPosition = new Vector3(targetPosition.x, targetPosition.y, floatz); image.transform.position = new Vector3(targetPosition.x, targetPosition.y, floatz);` `image.rectTransform.localPosition = new Vector3(targetPosition.x, targetPosition.y, floatz); 5 вариант. newObject.GetComponent().transform.position = new Vector3(targetPosition.x, targetPosition.y, floatz); image.rectTransform.anchoredPosition = new Vector3(targetPosition.x, targetPosition.y, floatz); newObject.GetComponent().localPosition = new Vector3(targetPosition.x, targetPosition.y, floatz);
Update Поменял скрипт: в самом скрипте ничего не создаю, только передаю туда уже созданное на canvas’e изображение. Пытаюсь изменить его позицию в скрипте:
image.rectTransform.position = new Vector3(targetPosition.x, targetPosition.y, floatz); Debug.Log(targetPosition.x); Debug.Log(targetPosition.y);
Но изображение появляется не в targetPosition, a в левом нижнем углу экрана. Пробовал дебажить позицию: значения адекватные — в рамках экрана(не в центре и не в левом нижнем углу). Непонятно, почему такое происходит.
Как изменить позицию дочернего объекта при создании (куратина)?
Я хочу при создании дочернего игрового объекта, допустим 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.
Подскажите пожалуйста. В каком направлении мне двигаться, что бы решить эту задачу. Так как опыта пока у меня мало. Что почитать, что изучить?
- Вопрос задан более трёх лет назад
- 4156 просмотров
Комментировать
Решения вопроса 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; >
объект создаётся с заданными позициями. Но при перемещении родителя, последовательно создаётся в том же самом месте, а не с новыми координатами родителя.
Изменить позицию объекта через код

Задавать позицию объекта в коде можно через свойство transform.position .
// Задать позицию для текущего объекта void Update() < transform.position = new Vector3(8.768f, -1.74f, 0); >
Можно также не указывать точную позицию, куда надо переместить объект, а указать, например, на какое расстояние переместить объект направо.
// При каждом выполнении кода, объект будет сдвигаться направо на 1.50 void Update() < transform.position = transform.position + new Vector3(1.50f, 0, 0); >
Код выполняется для текущего объекта, для которого был создан скрипт. Можно изменить позицию указанного объекта через метод GameObject.Find() .
// Задать позицию для объекта с именем «name_object» void Start() < GameObject.Find("name_object").transform.position = new Vector3(8.768f, -1.74f, 0); >
Обновлено: 04 ноября 2020
- Выполнить код при касании объекта
- Начало работы с объектами через код
- Изменить позицию объекта через код
- Событие при нажатии на клавиши или кнопки мыши
- Управление шаром через клавиатуру
- Перемещать камеру за игроком
- Прыжок
- Удалить / скрыть объект
Как правильно задать позицию объекта относительно другого объекта?

Я хочу что-бы Container появлялся на позиции объекта itemButton с небольшой поправкой по оси Y. Координаты Container по оси X задаются корректно, а вот по оси Y он оказывается далеко за пределами экрана. Если размещать его не делая поправку, то всё работает нормально. В чём проблема?
- Вопрос задан более двух лет назад
- 417 просмотров