Вычисление изменяющихся значений Mathf.Clamp () для объекта изменяющегося размера - PullRequest
0 голосов
/ 29 апреля 2020

Некоторое время я ломал голову над этой проблемой. У меня есть управляемый объект (только подвижный вверх и вниз), который я зажал сверху и снизу. Однако каждый раз, когда активируется определенный триггер, объект сжимается на 10%, пока не достигнет 90% от исходного размера. Проблема возникает, когда я уменьшаю ее. Когда он сжимается, минимальное и максимальное значения зажима не меняются вообще, и это приводит к тому, что объект зажимается до минимума и максимума. Их нужно уменьшать и увеличивать соответственно, чтобы они зажимались в одном и том же месте. Как можно это сделать? Я пробовал так много разных методов, но безрезультатно ...

Вот так я сокращаю свой плеер:

        playerWidth /= 1.1f;
        playerHeight /= 1.1f;

        Vector3 scale = new Vector3(playerWidth, playerHeight, 1f);
        playerOneShrink.transform.localScale = scale;

Большое спасибо!

РЕДАКТИРОВАТЬ 1:

Позвольте мне привести пример использования игры, которая может помочь лучше понять мою точку зрения. В основном, думайте о птице, но игрок использует стрелки вверх и вниз для перемещения, а не пробел. Когда птица умирает, птица сбрасывается, но становится меньше. Кажется, что поскольку птица меньше, она теперь перемещается «меньше» вверх и вниз и больше не касается верхней и нижней части экрана. Я хочу, чтобы птица все еще касалась верхней и нижней частей экрана.

РЕДАКТИРОВАТЬ 2:

Так что, очевидно, мое первое редактирование не прояснило столько, сколько я Я подумал, что я покажу свой код для тестовой сцены, в которой я все это пробую. Я не показал изменения minValue и maxValue, потому что с этим я борюсь ...

private static Rigidbody2D playerOneRB;
GameObject player1;
float verticalMovement = 0;

public static float playerHeight = 0.3417f;
public static float playerWidth = 0.05400001f;

public float minValue = 0;
public float maxValue = 10;


public static float p1VerticalSpeed = 3;

public GameObject playerOneShrink;

// Start is called before the first frame update
void Start()
{
    playerOneRB = GameObject.FindGameObjectWithTag("P1 Normal").GetComponent<Rigidbody2D>();
    player1= GameObject.Find("P1 Normal");

}

// Update is called once per frame
void Update()
{
    verticalMovement = Input.GetAxis("Player 1 V"); //Looking for axis defined in our input manager
    playerOneRB.velocity = new Vector3(0f, verticalMovement * p1VerticalSpeed, playerOneRB.velocity.x);


    Vector3 scale1 = new Vector3(playerWidth, playerHeight, 1f);
    Vector3 position = transform.position;

    player1.transform.position = new Vector3(player1.transform.position.x, (Mathf.Clamp(player1.transform.position.y, minValue, maxValue)), 0f); //Restricting how far the players can move (aka, not off the screen)



    if (Input.GetKeyDown(KeyCode.Alpha1))
    {
        playerWidth /= 1.1f;
        playerHeight /= 1.1f;

        scale1 = new Vector3(playerWidth, playerHeight, 1f);
        paddleOneShrink.transform.localScale = scale1;
    }
}

Вот фото того, что происходит:

1. Фотография положения, которого она достигает до сжатия

2. Фотография положения, которого он достигает после сжатия

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

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Звучит так, как будто вы хотите масштабировать объект, но держите его в повороте, поэтому, если он находится в самой верхней позиции и масштабируется, он остается в самой верхней позиции? Если да, то код и ответы здесь помогут:

https://answers.unity.com/questions/14170/scaling-an-object-from-a-different-center.html

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

0 голосов
/ 30 апреля 2020

Надеюсь, я понял вашу проблему.

Итак, давайте предположим, что масштаб игрока равен 1 единице, и вам нужно зажимать по оси Y от 0 до 10.

, поэтому вам придется Зафиксируйте позицию Y игрока как

   Vector3 scale = new Vector3(playerWidth, playerHeight, 1f);
   Vector3 position = transform.position;
   position.y =  mathf.clamp(0 + scale.x ,10 - scale.x ,position.y ); 
   transform.position = position;

, так что если масштаб игрока равен 1, то это ограничит позицию y между 1 (0 + 1) и 9 (10-1).

если масштаб игрока равен 0,9, то он будет между 0,9 (0 + 0,9) и 9,1 (10-0,9)

, если масштаб равен 3, то между 3 (0 + 3) и 7 (10-3) )

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