Unity: установка позиции Axist на игровом объекте в коде перемещает его в неправильные координаты - PullRequest
0 голосов
/ 08 февраля 2019

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

У меня есть два вопроса:

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

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

В обоих примерах важно только изменить положение облака в Х.Высота (Y) и глубина (Z) должны оставаться неизменными.

Это то, чего я достиг и работает не совсем так, как ожидалось:

public class CloudScript : MonoBehaviour
{
    public float moveSpeed;

    void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.gameObject.name == "Reset Clouds Collider") // detect collision with ground game object 
        {
            float tempY = transform.position.y;
            float tempZ = transform.position.z;
            transform.localPosition = new Vector3(5, tempY, tempZ);
        }
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
    }
}

В этом сценарии я бы ожидал, что облако сохранит свою позицию Y и Z и просто изменит X на 5Тем не менее, облако звезд при Y = 5, а после переводчик переходит к Y = 4.После другого цикла Y = 3 .... Также Z устанавливается на 0, а начинается с 1 ....

Может кто-нибудь помочь мне здесь?Не могу быть так сложно :)

Спасибо :)

1 Ответ

0 голосов
/ 08 февраля 2019

при использовании localPosition вы также должны получить временные значения из localPosition

float tempY = transform.localPosition.y;
float tempZ = transform.localPosition.z;
transform.localPosition = new Vector3(5, tempY, tempZ);

Для того, чтобы восстановить исходное положение, вы также можете просто сохранить его, например, в Start (в зависимости от ваших потребностей это также может быть OnEnable или с помощью общедоступного метода), например

private Vector3 initPosition;

private void Start()
{
    // store original position
    initPosition = transform.localPosition;
}

, и вместо этого просто сбросьте его на

void OnTriggerEnter2D(Collider2D collider)
{
    // detect collision with ground game object
    if (collider.gameObject.name == "Reset Clouds Collider")  
    {
        // restore original position
        transform.localPosition = initPosition;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...