2015-05-05 4 views
3

Я программист Java, и я новичок в Unity. Я пишу сетку, которая лежит на объекте Plane. Цель состоит в том, чтобы отделить логику на основе сетки от системы координат Unity 3D. На самом деле игра говорит о позиции сетки, поэтому мне нужен код, который преобразует систему координат игры в/form систему координат Unity (мировая позиция). Поскольку положение объекта Plane может быть изменено (повернуто, перемещено и т. Д.), Я хочу «отметить» левый нижний угол плоскости. В этом случае я смогу преобразовать одну систему координат в другую в любое время, так как с точки зрения игры координата «маркер в игре» равна 0,0 (2D). К сожалению, мой код не работает.Unity 3D. Детский объект не изменен

Не могли бы вы сказать мне, что не так (свойства «маркера» не меняются при перемещении плоскости)?

public class GridManager: MonoBehaviour { 

    GameObject ground; 
    GameObject marker; 

    ... 

    void attachMarker() { 

     //get substrate (plane) 
     GameObject ground = getGround();            

     //create marker 
     GameObject marker = new GameObject();          

     //set marker position to left bottom corner 
     marker.transform.position.x = ground.transform.position.x - ground.transform.localScale.x/2;  
     marker.transform.position.z = ground.transform.position.z - ground.transform.localScale.z/2;  
     marker.transform.position.y = 0; 

     //set marker size 
     marker.transform.localScale = new Vector3(0,0,0); 

     //set marker name (will be used for search) 
     marker.name = "LB_Marker";  

     //set marker to be child of ground        
     marker.transform.parent = ground.transform;  

     //store it 
     this.marker = marker;               
    } 
} 
+0

Почему вы масштабируете маркер до 0,0,0? – joreldraw

+0

Ваш код кажется esentialy ok. Как вы двигаетесь в самолете? Вы проверяете свойства маркера во время работы проекта? – xpereta

+0

1. Почему вы масштабируете маркер до 0,0,0 С моей точки зрения маркер является точкой. У меня нет проблем с получением этой позиции. 2. Проверяете ли вы свойства маркера во время работы проекта? Да. С помощью отладочной печати и тестового сценария, которые изменяют положение Plane на Update. –

ответ

0

Я предполагаю, что метод getGround() возвращает неправильную землю. Установка маркера.transform.parent = ground.transform должно быть абсолютно уверенным, что положение маркера обновляется с помощью земли.

На стороне записки, это может быть более разборчивыми, если вы вместо того, чтобы сказать:

//get substrate (plane) 
GameObject ground = getGround();            

//create marker 
GameObject marker = new GameObject();  
marker.transform.parent = ground.transform; 
marker.transform.localPosition = new Vector3(0.5f, 0.5f, 0); 

//set marker name (will be used for search) 
marker.name = "LB_Marker"; 
//store it 
this.marker = marker;   

Таким образом, вы не возиться с делать математику, что Unity уже делает.

0

Я нашел несколько проблем в коде:

  1. , если маркер является пустой GameObject, чем вам не нужно, чтобы изменить его масштаб.
  2. Если это не пустой GameObject, но вы не должны быть видимы внутри игры, чем установить масштаб на очень низкое значение, но больше нуля.
  3. Если вы используете Unity 5 или выше, я бы порекомендовал вам SetParent метод назначить родитель маркера т.е. marker.transform.SetParent(ground.transform);
  4. Сначала назначьте родитель к вашему маркеру затем играть с его преобразованием (положением и вращением).

Если вы сначала изменили преобразование, а затем назначили ему родителя, то какое единство будет делать, это поместить маркер в «Назначенное положение» в мировых координатах, а затем, назначив его родителям, он рассчитает эквивалент положение в родительском пространстве по координате пространства мира, но в результате объект будет выглядеть так же, как и перед его добавлением в родительский элемент.

например. Если у родителя есть шкала 0,5,0,5,0,5, а ребенок (до рождения ребенка) имеет шкалу 1,1,1. поэтому, когда ребенок теперь СДЕЛАЛ РЕБЕНОК родительского единства, он обновит свою шкалу до 2,2,2. Таким образом, размер изменяется, но он выглядит одинаково внутри игры. То же самое касается положения и вращения.