Как ограничить положение трансформации в Unity? - PullRequest
1 голос
/ 27 апреля 2019

Я ищу способ ограничить положение трансформации по оси Y моего объекта. Для перемещения я использую этот код

transform.position += Vector3.down * Time.deltaTime * speed;

Объект движется только тогда, когда игрок удерживает кнопку, после чего объект возвращается в 1-е положение. Как я могу заблокировать перемещение, например, от 6 до -6 по оси Y?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

Поскольку transform.position и Vector3.down * Time.deltaTime * speed оба имеют (x, y, z), поскольку они Vector3, вы можете просто проверить компонент Y и пропустить движение между указанным диапазоном, например,

if(transform.position.y < -6 || transform.position.y > 6)
{
    // the Vector3.down is (0, -1, 0) so this operation will change only Y component anyway
    transform.position += Vector3.down * Time.deltaTime * speed;
}

В исходном ОП перерегулирование не упоминалось, но, как указывал @derHugo, вы можете ограничить движение, чтобы избежать перерегулирования.Возможна одна такая возможность: она будет ограничивать движение относительно ближайшей границы, не позволяя также перепрыгивать с одной границы на другую ...

private static float OutsideLimitedMove(float current, float move, float bottomLimit, float topLimit)
{
    //----->---------|  not allowed  |---------<-----
    // fromBottom   -6               6       fromUp 

    if(current >= -6 && current <= 6) 
        return 0f;

    float predictedY = current + move;

    //fromBottom
    if(current < bottomLimit && predictedY > bottomLimit) 
        return Math.Min(bottomLimit - current, move);

    //fromUp
    if (current > topLimit && predictedY < topLimit)
        return Math.Max(topLimit - current, move);

    return move;
}

Vector3 predictedMove = Vector3.down * Time.deltaTime * speed;
float y = OutsideLimitedMove(transform.position.y, predictedMove.y, -6, 6);
transform.position += new Vector3(predictedMove.x, y, predictedMove.z);
0 голосов
/ 27 апреля 2019

Насколько я понимаю, вы хотите, чтобы ограничивающий объект оставался между -6 и 6.

Например, вы можете использовать Mathf.Clamp для ограничения position.y, например

transform.position = new Vector3(transform.position.x,      
                                 Mathf.Clamp(transform.position.y + Time.deltaTime * speed, -6.0f, 6.0f), 
                                 transform.position.z);

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

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