Как сделать систему координат в unity

Обновлено: 03.07.2024

У меня есть элементы интерфейса (изображение и т.д.). Холст прикреплен к камере.
Существует RectTransform , но как преобразовать эти данные в координаты экрана или мира и получить центральную точку этого изображения?

Пробовал RectTransform.GetWorldCorners , но возвращает нулевые векторы.

yourRectTransform.rect.center для центральной точки в локальном пространстве.

yourRectTransform.TransformPoint для преобразования в мировое пространство.

Вы можете работать с GetWorldCorners , но только при использовании дочернего элемента, который имеет реальные размеры. Я получил разумные ценности для ребенка из мирового космического холста.

Я обнаружил, что и GetWorldCorners, и TransformPoint работают только на Start(), а не на Awake(), как будто нам придется ждать изменения размера контента

Мы остановились после того, как получили полное представление о том, как начать работу с Unity 3D, и только что создали новый проект.

Наш новый проект по умолчанию создал четыре папки: Assets, Library, ProjectSettings и Temp. Unity3D создайте и настройте себя как несохраненную тему по умолчанию, над которой мы сейчас работаем. Не бойтесь: этот пост выглядит длинным, но есть много скриншотов, чтобы вы могли легко следить за ним.

…. Теперь к забавному материалу

Для начала давайте добавим игровой объект-плоскость, чтобы он действовал как пол мира. Это может быть выполнено несколькими разными способами.

Unity3D.2.1

Установка сцены

Unity3D.2.2

Теперь, когда у нас есть материал травы, мы перетащим его и назначим его нашему самолету. Нажмите и перетащите материал в иерархическое представление и поместите его на объект плоскости. Это добавит его в самолет. Теперь нажмите на объект плоскости в иерархическом представлении, и это покажет объект плоскости внутри инспектора. Внизу инспектора мы должны увидеть материал объекта травы.

Unity3D.2.3

Давайте отредактируем этот материал, чтобы он был более красочным и более похожим на траву, чем на серый.

Сначала мы нажмем темно-серую стрелку слева от материала травы, которая раскроет этот материал и покажет набор настроек, которые мы можем изменить.

А сейчас давайте просто изменим цвет альбедо. Мы делаем это, щелкая цветную пластинку рядом с альбедо, что даст нам возможность использовать цветовую палитру. Давайте войдем в красный 34, зеленый 86, синий 34 и оставим альфу в 255. Это даст нам хороший темно-зеленый цвет для использования в качестве травы.

Unity3D.2.4

Теперь мы должны увидеть хороший зеленый самолет для нашей травы.

Unity3D.2.5

Теперь для редактирования размера нашего поля. Мы можем еще раз выбрать нашу плоскость, и в инспекторе вы увидите вверху объект с именем Transform. Это объект, который визуализатор использует в качестве основы для положения, поворота и масштаба. Чтобы мы могли изменить размер статического плоского объекта, мы можем масштабировать объект. Шкала включает в себя 3 различных значения, каждое из которых относится к размерам, XY Z. В единстве мы можем думать о тех направлениях как x как ширина, y как высота и z как длина. Unity использует систему координат Y-up, и, поскольку мы работаем с плоскостью, у нас есть только два измерения X и Z для ширины и длины. Давайте установим оба значения в 10, делая нашу плоскость в 10 раз больше, чем раньше. Это должно дать нам достаточно места для передвижения.

Unity3D.2.6

Unity3D.2.7

Добавление объектов в нашу сцену

Теперь давайте добавим объект в игровой мир, который позволит нам передвигаться; это будет действовать как наш персонаж. Мы будем использовать куб, чтобы представить это в игре. Чтобы добавить куб, перейдите в окно Иерархия и щелкните правой кнопкой мыши 3D-объект -> Куб.

Unity3D.2.8

Наша сцена должна выглядеть примерно так, в которой есть наш куб и плоскость.

Unity3D.2.9

Обратите внимание, как наш куб на полпути в земле. Это потому, что точка происхождения куба, или точка, в которой объекты преобразуются, находится в центре.

Мы можем компенсировать это, перемещая объект вдоль его оси Y вверх на 0,5, что составляет половину нашего куба 1x1x1. Мы можем внести это изменение, выбрав объект куба в нашем представлении Иерархия и в Инспекторе найти объект Преобразование. Нам нужно изменить положение объекта на x = 0, y = 0.5, z = 0.

Unity3D.2.10

Unity3D.2.11

Unity3D.2.12

Unity3D.2.13

Unity3D.2.14

Unity3D.2.15

Наконец, погрузившись в некоторый код

Unity3D.2.16

Давайте откроем скрипт. Дважды щелкните скрипт в средстве просмотра активов, которое откроет либо Visual Studio, либо MonoDevelop. Для этого примера я собираюсь использовать MonoDevelop для нашего кода и отладки.

Unity3D.2.17

Внутри этого скрипта есть несколько вещей, которые Unity3d реализовал для вас для начала. Во-первых, он включает в себя два оператора UnityEngine , первый UnityEngine , который включает в себя все библиотеки для взаимодействия с игровым движком Unity и Unity Editor. Следующим является System.Collections , который предоставляет доступ к библиотеке Mono System Collections. Затем он добавляет класс PlayerController , который является именем сценария, производного от класса MonoBehaviour, который является частью библиотеки UnityEngine в качестве основы.

Он добавляет две функции по умолчанию: Start и Update . Запуск — это как звучит, это функция, которая вызывается в начале приложения, как только объект был создан. Обновление запускается каждый цикл Unity, который основан на основном цикле движка Unity.

Unity3D.2.18

Теперь давайте напишем некоторый код, чтобы заставить наш куб делать что-то, например вращаться.

Сначала нам нужно взять объект, над которым мы хотим действовать. Поскольку мы хотим вращать куб, а не камеру, мы не хотим просто вращать объект Player . Итак, давайте напишем некоторый код, чтобы получить куб. Для этого добавьте public GameObject cube над нашей функцией State ; это даст нам объект cube в нашем классе для работы.

Unity3D.2.19

Этот объект был создан, но мы еще ни на что не указали. Вернемся к редактору Unity и в представлении иерархии выберите объект Player . Теперь в Инспекторе мы видим, что внутри нашего вложенного объекта скрипта есть Объект Cube (Объект Игры).

Unity3D.2.20

Это позволит нам перетащить наш объект Cube на наш игровой объект, чтобы иметь контроллер. Теперь мы можем выбрать объект Cube под нашим объектом Player и перетащить его в Cube. Или вы можете щелкнуть по кружку рядом с объектом, и он даст вам список объектов в вашем списке сцен / активов для использования.

Unity3D.2.21

Теперь вернемся к нашему коду. Теперь в нашем коде мы можем написать, чтобы повернуть его на 45 градусов, чтобы он стоял на точке куба. Итак, в нашей функции Start напишите следующий код:
cube.transform.Rotate( new Vector3(1,0,0), 45) . Этот код берет наш объект Cube и действует на объект Transform сообщая ему Rotate. Первый параметр — это вектор3, который представляет собой точку в трехмерном пространстве, представленную тремя измерениями: XY Z. Здесь мы говорим в первом параметре, что мы хотим, чтобы он воздействовал только на измерение X вектора3. Мы говорим во втором параметре, что мы устанавливаем для размера X угол 45, который должен установить его по краю.

Давайте вернемся к редактору Unity и нажмите Play:

Теперь, чтобы понять это? Мы можем просто добавить еще один поворот, но на этот раз установить размер Y только как
cube.transform.Rotate( new Vector3(0,1,0), 45) . Снова вернёмся в редактор Unity и нажмем Play.

Unity3D.2.24

Ой, мы прорубаем землю; это было вызвано тем, что мы вращались только … мы не двигали объект, когда вращались. Таким образом, поскольку источник все еще находится в середине, как и раньше, мы находимся всего в 0,5, что слишком близко.

Unity3D.2.25
Unity3D.2.26

Unity3D.2.27
Unity3D.2.28

Перемещение со стрелками

Теперь, когда у нас есть некоторые базовые сведения о вращении и перемещении, давайте сделаем более похожую на игрока транзакцию куба, в которой мы можем использовать клавиши со стрелками на клавиатуре для его перемещения.

Сначала давайте удалим код, который мы написали, чтобы вращать и перемещать позицию вашего куба. Давайте теперь вместо этого переместим Камеру, чтобы быть более дружелюбной в мире. Давайте вернемся к MonoDevelop и удалим наш код куба с самого начала. Давайте также добавим некоторые действия на камеру.

Unity3D.2.29

Unity3D.2.30

Теперь мы больше не видим наш куб. Почему это? Ну, у нас нет вращения. Но чтобы проверить и понять, почему, давайте вернемся к Scene Viewer, оставаясь в режиме воспроизведения.

Unity3D.2.31

Мы видим четыре объекта и предварительный просмотр камеры. Предварительный просмотр камеры — отличный инструмент, который позволит вам (при выбранной камере) видеть статический вид игрового обзора. Мы также видим, что у нас есть камера, куб, направленный свет и наша зеленая плоскость. Если мы выберем Вид камеры, мы увидим стрелки и четыре белые линии.

Эти четыре белые линии — это ограничивающая рамка, которую видит камера. Хороший трюк, который вы можете сделать, это в Hierarchy View, вы можете дважды щелкнуть по объекту, и в Scene View он будет центрировать этот объект. Это облегчит поиск. Вы также можете прокручивать и уменьшать масштаб. Если вы удерживаете правую кнопку мыши над Scene View и используете клавиши WSAD, вы можете при необходимости перемещаться по сцене.

Если вы уменьшите масштаб и расположитесь так, чтобы красная стрелка камеры указывала прямо на вас, вы можете видеть, что ограничивающая рамка больше не охватывает наш куб, поэтому мы не сможем ее увидеть.

Unity3D.2.33

Unity3D.2.34

Unity3D.2.35

Это больше походит на это. Теперь мы можем видеть наш куб и он похож на игру с высоты птичьего полета. Теперь вернемся к нашему движению со стрелками. Как и раньше, мы хотим делать это при каждом обновлении, поэтому давайте добавим немного кода в функцию update . Давайте сначала напишем код, чтобы обнаружить, что мы нажали клавишу со стрелкой вперед (вверх).

using UnityEngine;
using System.Collections;

public class GridManager: MonoBehaviour
<
public GameObject Hex;

public static int gridWidthInHexes = 100;
public static int gridHeightInHexes = 100;

private float hexWidth;
private float hexHeight;


void setSizes()
<
hexWidth = Hex.renderer.bounds.size.x;
hexHeight = Hex.renderer.bounds.size.z;

Vector3 calcInitPos()
<
Vector3 initPos;
initPos = new Vector3(0, 0, 0);
return initPos;
>

//method used to convert hex grid coordinates to game world coordinates
public Vector3 calcWorldCoord(Vector2 gridPos)
<
//Position of the first hex tile
Vector3 initPos = calcInitPos();
//Every second row is offset by half of the tile width
float offset = 0;
if (gridPos.y % 2 != 0)
offset = hexWidth / 2;

float x = initPos.x + offset + gridPos.x * hexWidth;
//Every new line is offset in z direction by 3/4 of the hexagon height
float z = initPos.z + gridPos.y * hexHeight * 0.75f;
return new Vector3(x, 0, z);
>

//Finally the method which initialises and positions all the tiles
void createGrid()
<
//Game object which is the parent of all the hex tiles
GameObject hexGridGO = new GameObject("HexGrid");

Помогите с перемещением объекта в указанные координаты в Unity, у меня ничего не получается я кажется все перепробовал!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BodyController : MonoBehaviour
public GameObject Body;
public int S;
// Start is called before the first frame update
void Start()

// Update is called once per frame
void Update()
S = Random.Range(1, 1);
if (Input.GetKey(KeyCode.W))
Body.transform.Translate(0, -S, 0);
>
if (Input.GetKey(KeyCode.S))
Body.transform.Translate(0, S, 0);
>
if (Input.GetKey(KeyCode.A))
Body.transform.Translate(-S, 0, 0);
>
if (Input.GetKey(KeyCode.D))
Body.transform.Translate(S, 0, 0);
>
>
>

это чтобы чтобы изменять позицию нажатиями на клавиши на клавиатуре в моём случае это Body

Читайте также: