Unity не поянтка в коде

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

public Transform Player;
public float Speed;
private Vector2 moveInput;
private bool facingRight;

private void OnMouseDrag()
{
    Vector3 mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
    mousePos.x = mousePos.x > 7.75f ? 7.75f : mousePos.x;
    mousePos.x = mousePos.x < -7.75f ? -7.75f : mousePos.x;
    Player.position = Vector2.MoveTowards(Player.position, new Vector2(mousePos.x, Player.position.y), Speed * Time.deltaTime);
}

private void Update()
{
    moveInput = new Vector2(Player.position.x, Player.position.y);

    if (!facingRight && moveInput.x < 0)
    {
        Flip();
    }
    else if (facingRight && moveInput.x > 0)
    {
        Flip();
    }
}

private void Flip()
{
    facingRight = !facingRight;
    Vector3 Scaler = transform.localScale;
    Scaler.x *= -1;
    transform.localScale = Scaler;
}

}


Ответы (1 шт):

Автор решения: SLiver

Я специально объясню всё подробно.

Я не тестировал ни твой код, ни свой код, так что прости, если мой код тебе не поможет...

В этой строке:

moveInput = new Vector2(Player.position.x, Player.position.y);

Ты записываешь в переменную moveInput позицию игрока.

А потом ты проверяешь кое-что тут:

if (!facingRight && moveInput.x < 0)
{
    Flip();
}
else if (facingRight && moveInput.x > 0)
{
    Flip();
}

Ты проверяешь где находится игрок. Если он находится слева от центра мира, то ты его поворачиваешь влево, а если он находится справа, то ты поварачиваешь его вправо.

Другими словами это звучит так:

Если игрок не смотрит на право и находится слева от центра мира, то 
    перевернуть игрока.
Иначе если игрок смотрит направо и находится справа от центра мира, то
    перевернуть игрока.

А тебе надо проверять не проверять где он находится сейчас относительно центра мира, а то, где находится мышка относительно игрока. Если мышка слева от игрока, то игрок поворачивается влево, иначе если мышка справа, то игрок поворачивается вправо.

Ладно, продолжу. Стоит понимать, что в одном скрипте не может выполняться сразу несколько строк и выполняются они сверху вниз. Поэтому мы сначала получаем координаты мыши в private void OnMouseDrag(), а потом уже двигаем туда персонажа в этой же функции. Поэтому мы сначала просто перенесём из Update() это:

moveInput = new Vector2(Player.position.x, Player.position.y);

if (!facingRight && moveInput.x < 0)
{
    Flip();
}
else if (facingRight && moveInput.x > 0)
{
    Flip();
}

В private void OnMouseDrag() и у нас получится это:

private void OnMouseDrag()
{
    Vector3 mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
    moveInput = new Vector2(Player.position.x, Player.position.y);

    if (!facingRight && moveInput.x < 0)
    {
        Flip();
    }
    else if (facingRight && moveInput.x > 0)
    {
        Flip();
    }
    mousePos.x = mousePos.x > 7.75f ? 7.75f : mousePos.x;
    mousePos.x = mousePos.x < -7.75f ? -7.75f : mousePos.x;
    Player.position = Vector2.MoveTowards(Player.position, new Vector2(mousePos.x, Player.position.y), Speed * Time.deltaTime);
}

Но если мы запустим игру, то ничего не поменяется. Нам надо удалить строку:

moveInput = new Vector2(Player.position.x, Player.position.y);

из функции private void OnMouseDrag()

А так же заменить каждый moveInput.x на mousePos.x

Вот что у нас получится (готовый код):

public Transform Player;
public float Speed;
private Vector2 moveInput;
private bool facingRight;

private void OnMouseDrag()
{
    Vector3 mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
    if (!facingRight && mousePos.x < 0)
    {
        Flip();
    }
    else if (facingRight && mousePos.x > 0)
    {
        Flip();
    }
    mousePos.x = mousePos.x > 7.75f ? 7.75f : mousePos.x;
    mousePos.x = mousePos.x < -7.75f ? -7.75f : mousePos.x;
    Player.position = Vector2.MoveTowards(Player.position, new Vector2(mousePos.x, Player.position.y), Speed * Time.deltaTime);
}
private void Flip()
{
    facingRight = !facingRight;
    Vector3 Scaler = transform.localScale;
    Scaler.x *= -1;
    transform.localScale = Scaler;
}

Я убрал Update потому что тут он пока не нужен. Если тебе нужен будет Update, то я думаю ты знаешь как его добавить.

но он переворачивается только если координат X больше или меньше нуля.

Ты сам в условии такое сделал.

Повторю то, что написал в начале:

Я не тестировал ни твой код, ни свой код, так что прости, если мой код тебе не поможет...

Мне кстати лень перечитывать всё своё сообщение и проверять его на правильность, поэтому пиши комментарий под мой ответ, я может быть на что-то отвечу.

→ Ссылка