Как изменить позицию объекта в unity через скрипт
Перейти к содержимому

Как изменить позицию объекта в unity через скрипт

  • автор:

Позиция объекта не меняется

В скрипте я создаю объект, добавляю ему родителя 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

MrMureno

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)

MrMureno

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. Transform

Задавать позицию объекта в коде можно через свойство 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

  • Выполнить код при касании объекта
  • Начало работы с объектами через код
  • Изменить позицию объекта через код
  • Событие при нажатии на клавиши или кнопки мыши
  • Управление шаром через клавиатуру
  • Перемещать камеру за игроком
  • Прыжок
  • Удалить / скрыть объект

Как правильно задать позицию объекта относительно другого объекта?

620c566927155966780349.png

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

  • Вопрос задан более двух лет назад
  • 417 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *