Вы делаете
while (go)
{
velocity = new Vector3(+1, 0, 0);
transform.position += velocity;
}
, но go
никогда не устанавливается в ложь внутри цикла .
OnCollisionEnter
никогда не выполняется, поскольку while
все еще выполняется => стоп-кадр.
, поскольку Update
вызывается каждый кадр, в любом случае, вам лучше переместить эту часть в отдельный *Блок 1014 * после проверки входов.
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.collider.name == "wall (3)" && direction == "down"
|| collision.collider.name == "wall (2)" && direction == "up"
|| collision.collider.name == "wall" && direction == "left"
|| collision.collider.name == "wall (1)" && direction == "right")
{
go = false;
velocity = Vector3.zero;
direction = "none"
}
}
void Update ()
{
if (Input.GetKeyDown(KeyCode.DownArrow) && canMoveAgain)
{
direction = "down";
go = true;
canMoveAgain = false;
velocity = -Vector3.up;
}
else if (Input.GetKeyDown(KeyCode.UpArrow) && canMoveAgain)
{
direction = "up";
go = true;
canMoveAgain = false;
velocity = Vector3.up;
}
else if (Input.GetKeyDown(KeyCode.LeftArrow) && canMoveAgain)
{
direction = "left";
go = true;
canMoveAgain = false;
velocity = -Vector3.right;
}
else if (Input.GetKeyDown(KeyCode.RightArrow) && canMoveAgain)
{
direction = "right";
go = true;
canMoveAgain = false;
velocity = Vector3.right;
}
if(go)
{
transform.position += velocity;
}
}
Обратите внимание, что в настоящее время ваш код также зависит от частоты кадров.Вы можете использовать что-то вроде
public float moveSpeed;
...
transform.position += velocity * moveSpeed * Time.deltaTime;
. Для direction
я бы рекомендовал enum
как
private enum MoveDirection
{
None,
Up,
Down,
Left,
Right
}
и использовать его, например, как
direction = MoveDirection.Up;
и
if(direction == MoveDirection.Up)
, что более эффективно, чем сравнение строк.
Примечание: напечатано на смартфоне, поэтому никаких гарантий, но я надеюсь, что идеястановится ясным