Unity transform.up не вращается - PullRequest
       7

Unity transform.up не вращается

0 голосов
/ 29 сентября 2019

Я пытаюсь создать базовую игровую логику ИИ, в которой один игрок бежит, а другой избегает.Это прекрасно работает, но, как я уже сделал, я сейчас ищу защитника (ранее статичного), чтобы преследовать бегуна.Я долго боролся за это, но обнаружил, что transform.up - это магия, которую я искал, поскольку он использовал игроков Y (зеленая ось), чтобы двигаться дальше и использовал вращение.

На моей 2-й плоскости это сработалохорошо, когда бегущий бегает по странице, но мой защитник бежит, и в этом моя проблема.Я ожидал , что transform.up будет перемещаться по странице, когда я поверну символ на 180 градусов по оси Z. Я обнаружил, что transform.up все еще поднимается по странице, и яне знаю, чего мне не хватает.

Чтобы переместить игроков, я делаю следующее (в рамках Update ()):

transform.Translate(transform.up * 15f * Time.deltaTime);

Чтобы попытаться отладить проблему, ядобавил следующее в Start ():

// DEBUG: Show position indicators;
if (showPositionIndicators == true) {

    Dictionary<string, Vector3> posIndicators = new Dictionary<string, Vector3>();
    posIndicators.Add("Up", transform.up);
    posIndicators.Add("Rt", transform.right);
    posIndicators.Add("Dn", -transform.up);
    posIndicators.Add("Lt", -transform.right);
    posIndicators.Add("Fd", transform.forward);
    posIndicators.Add("Bk", -transform.forward);

    Vector3 scaleLocPos = new Vector3(10f, 10f, 10f);
    dbgPosInd = new List<GameObject>();
    foreach (KeyValuePair<string, Vector3> posIndicator in posIndicators) {

        GameObject t = Instantiate(prefabPosInd, transform);
    t.name = "Pos_" + posIndicator.Key;
        t.transform.localPosition = Vector3.Scale(posIndicator.Value, scaleLocPos);
        t.GetComponent<TextMeshProUGUI>().text = posIndicator.Key;
        dbgPosInd.Add(t);
    }
}

Похоже, это указывает на то, что transform.up действительно «позади» и такой же, как и бегун.Я что-то упустил?Это предназначено?Как бы я поступил так, чтобы оба игрока двигались вперед относительно их собственного вращения (то есть оба бегут к середине)

[Two circles.  Blue circle (bottom) with up going up the page. Yellow circle (top) has up also going up the page.[1]

1 Ответ

2 голосов
/ 29 сентября 2019

Вы используете transform.up как вектор локального пространства в t.transform.localPosition = Vector3.Scale(posIndicator.Value, scaleLocPos);, но transform.up дает локальный вектор преобразований в world-space .Это как сокращение для transform.TransformDirection(Vector3.up);.

. Вектор поворота локального пространства объекта, повернутого на 180 градусов, равен вниз в мировом пространстве.Вы правильно поняли эту часть.Но когда вы используете его как localPosition повернутого объекта, так как объект вращается, эта позиция в локальном пространстве устанавливается на вниз и будет вверх снова в мировом пространстве.

Вот почему текст отладки "UP" перевернут, как и должно быть, но позиционирован в мировом пространстве.Это потому, что в локальном пространстве объекта он не работает.

Используйте Vector3.up (и другие направления) в своем назначении t.transform.localPosition, потому что ссылка уже ссылается на позицию в локальном пространстве.


Поскольку transform.Translate() использует local-space по умолчанию, возникает та же проблема.Ваше локальное пространство вверх (при получении) вниз (в мировом пространстве), но ваш перевод локального пространства вниз снова в мировом пространстве.

Использование transform.Translate(Vector3.up * 15f * Time.deltaTime) (рекомендуется) , или сделайте перевод относительно мирового пространства, transform.Translate(transform.up * 15f * Time.deltaTime, Space.World);


Еще одна потенциальная проблема:

Предположим, ваши персонажиимейте или будете иметь физические элементы к ним, не делайте движения ни в обновлении, ни в трансформации.Используйте Rigidbody2D.MovePosition() на FixedUpdate().Существует Rigidbody2d.position, но он отменяет другие физические эффекты, поэтому рекомендуется MovePosition().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...