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 шт):
Я специально объясню всё подробно.
Я не тестировал ни твой код, ни свой код, так что прости, если мой код тебе не поможет...
В этой строке:
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 больше или меньше нуля.
Ты сам в условии такое сделал.
Повторю то, что написал в начале:
Я не тестировал ни твой код, ни свой код, так что прости, если мой код тебе не поможет...
Мне кстати лень перечитывать всё своё сообщение и проверять его на правильность, поэтому пиши комментарий под мой ответ, я может быть на что-то отвечу.