奇怪的运动行为 Unity2D C#
Weird movement behaviour Unity2D C#
我正在使用 C# 在 Unity 中制作一个基于回合的自上而下的 2D 地牢爬虫。我目前正在为蝙蝠敌人编写代码以跟随玩家。除了一种奇怪的行为外,它运行良好。蝙蝠在 2 个方向上移动 2 个方块,而不是在一个方向上移动 1 个方块,但仅限于它的第一次移动。类似于马在国际象棋中的走法。请帮我解决这个问题。任何和所有建议表示赞赏。我的代码可能很糟糕而且过于复杂,但这是我的第一场比赛所以请温柔点。
敌人代码:
Vector3 currentPosition;
Vector3 nextPosition;
public GameObject playerObject;
public Transform[] wallArray;
bool canMove;
public Player thePlayer;
void Update()
{
currentPosition = transform.position;
Movement();
}
void Movement()
{
if (thePlayer.timeToMove == false)
{
if (playerObject.transform.position.x > currentPosition.x)
{
nextPosition.x = currentPosition.x + 1;
canMove = false;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
canMove = true;
}
}
if (canMove)
{
if (playerObject.transform.position.y > currentPosition.y)
{
nextPosition.y = currentPosition.y + 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
if (playerObject.transform.position.y < currentPosition.y)
{
nextPosition.y = currentPosition.y - 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
}
if (nextPosition == playerObject.transform.position)
{
nextPosition = currentPosition;
}
transform.position = nextPosition;
thePlayer.timeToMove = true;
Debug.Log("Leaving 'a'...");
return;
}
if (playerObject.transform.position.x < currentPosition.x)
{
nextPosition.x = currentPosition.x - 1;
canMove = false;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
canMove = true;
}
}
if (canMove)
{
if (playerObject.transform.position.y > currentPosition.y)
{
nextPosition.y = currentPosition.y + 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
if (playerObject.transform.position.y < currentPosition.y)
{
nextPosition.y = currentPosition.y - 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
}
if (nextPosition == playerObject.transform.position)
{
nextPosition = currentPosition;
}
transform.position = nextPosition;
thePlayer.timeToMove = true;
Debug.Log("Leaving 'b'...");
return;
}
if (playerObject.transform.position.x == currentPosition.x)
{
if (playerObject.transform.position.y > currentPosition.y)
{
nextPosition.y = currentPosition.y + 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
if (playerObject.transform.position.y < currentPosition.y)
{
nextPosition.y = currentPosition.y - 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
if (nextPosition == playerObject.transform.position)
{
nextPosition = currentPosition;
}
transform.position = nextPosition;
thePlayer.timeToMove = true;
Debug.Log("Leaving 'c'...");
return;
}
}
玩家代码:
// Movement variables
public Vector3 playerCurrentPosition;
Vector3 nextPosition;
public Transform[] wallArray;
public bool timeToMove;
bool movingToWall;
void Start()
{
// When we start we can move
timeToMove = true;
}
void Update()
{
// Update current position variable
playerCurrentPosition = transform.position;
// Move
Movement();
}
// Movement
void Movement()
{
// If it's time to move
if (timeToMove)
{
// If right arrow key pressed
if (Input.GetKeyDown(KeyCode.RightArrow))
{
// Set position to move to
nextPosition.x = playerCurrentPosition.x + 1;
// Check wall array
foreach (Transform wall in wallArray)
{
// If the wall we are checking is in the space we want to move to
if (wall.transform.position.Equals(nextPosition))
{
// We are moving into a wall
movingToWall = true;
}
}
// If we are moving into a wall
if (movingToWall)
{
// Don't move
nextPosition = playerCurrentPosition;
// Set position
transform.position = nextPosition;
// It's time to move again
timeToMove = true;
// We're not moving into a wall anymore
movingToWall = false;
}
// If we're not moving into a wall
else
{
// Move
transform.position = nextPosition;
// It's no longer time to move
timeToMove = false;
}
}
// If left arrow key pressed
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
// Set position we want to move to
nextPosition.x = playerCurrentPosition.x - 1;
// Check wall array
foreach (Transform wall in wallArray)
{
// If the wall we are checking is in the space we want to move to
if (wall.transform.position.Equals(nextPosition))
{
// We are moving into a wall
movingToWall = true;
}
}
// If we are moving into a wall
if (movingToWall)
{
// Don't move
nextPosition = playerCurrentPosition;
// Set position
transform.position = nextPosition;
// We can move again
timeToMove = true;
// We are no longer moving into a wall
movingToWall = false;
}
// If we are not moving into a wall
else
{
// Move
transform.position = nextPosition;
// It is no longer time to move
timeToMove = false;
}
}
// If up arrow pressed
if (Input.GetKeyDown(KeyCode.UpArrow))
{
// Set position to move to
nextPosition.y = playerCurrentPosition.y + 1;
// Check wall array
foreach (Transform wall in wallArray)
{
// If wall we are checking is in space we want to move to
if (wall.transform.position.Equals(nextPosition))
{
// We are moving into a wall
movingToWall = true;
}
}
// If we are moving into a wall
if (movingToWall)
{
// Don't move
nextPosition = playerCurrentPosition;
// Set position
transform.position = nextPosition;
// We can move again
timeToMove = true;
// No longer moving into wall
movingToWall = false;
}
// If we are not moving into a wall
else
{
// Move
transform.position = nextPosition;
// It is no longer time to move
timeToMove = false;
}
}
// If down arrow pressed
if (Input.GetKeyDown(KeyCode.DownArrow))
{
// Set position to move to
nextPosition.y = playerCurrentPosition.y - 1;
// Check wall array
foreach (Transform wall in wallArray)
{
// If wall we are checking is in the space we want to move to
if (wall.transform.position.Equals(nextPosition))
{
// We are moving into a wall
movingToWall = true;
}
}
// If we are moving into a wall
if (movingToWall)
{
// Don't move
nextPosition = playerCurrentPosition;
// Set position
transform.position = nextPosition;
// We can move again
timeToMove = true;
// No longer moving into a wall
movingToWall = false;
}
// If we are not moving into a wall
else
{
// Move
transform.position = nextPosition;
// No longer time to move
timeToMove = false;
}
}
}
}
您的问题是否有可能是,您应该使用分离代码,而您却没有?你的代码是这样的:
void Movement()
{
if (Player.timeToMove == false)
{
if (playerObject.transform.position.x > currentPosition.x)
{
// huge amount of code
}
if (playerObject.transform.position.x < currentPosition.x)
{
// huge amount of code
}
if (playerObject.transform.position.x == currentPosition.x)
{
// huge amount of code
}
}
}
其实应该是这样的吧?
void Movement()
{
if (Player.timeToMove == false)
{
if (playerObject.transform.position.x > currentPosition.x)
{
// huge amount of code
Debug.Log("Leaving 'a'...");
return;
}
if (playerObject.transform.position.x < currentPosition.x)
{
// huge amount of code
Debug.Log("Leaving 'b'...");
return;
}
if (playerObject.transform.position.x == currentPosition.x)
{
// huge amount of code
Debug.Log("Leaving 'c'...");
return;
}
}
}
我建议尝试一下。
请注意,您确实需要引入一些函数来简化您的代码。你的代码是这样的...
foreach (Transform wall in wallArray)
if (wall.transform.position.Equals(nextPosition))
{
movingToWall = true;
}
应该是这样的函数:
private bool IsThisAWall(Vector3 p)
{
foreach (Transform wall in wallArray)
if (wall.transform.position.Equals(p))
{
return true;
}
return false;
}
然后你会像这样使用它。你会有一个变量 "possibleNewPosition"。你会说...
possibleNewPosition = currentPosition + 1;
如果 ( IsThisAWall(possibleNewPosition) )
Debug.Log("doing nothing since it's a wall");
别的
当前位置 = possibleNewPosition;
你这样做很常见,你有一个变量 "possible ..." 什么的!
你真的需要及时做这件事。 (不要忘记在编程中,任何例程都不应超过 5 或 6 行代码。您的 Movement
等调用太长了。)
我正在使用 C# 在 Unity 中制作一个基于回合的自上而下的 2D 地牢爬虫。我目前正在为蝙蝠敌人编写代码以跟随玩家。除了一种奇怪的行为外,它运行良好。蝙蝠在 2 个方向上移动 2 个方块,而不是在一个方向上移动 1 个方块,但仅限于它的第一次移动。类似于马在国际象棋中的走法。请帮我解决这个问题。任何和所有建议表示赞赏。我的代码可能很糟糕而且过于复杂,但这是我的第一场比赛所以请温柔点。
敌人代码:
Vector3 currentPosition;
Vector3 nextPosition;
public GameObject playerObject;
public Transform[] wallArray;
bool canMove;
public Player thePlayer;
void Update()
{
currentPosition = transform.position;
Movement();
}
void Movement()
{
if (thePlayer.timeToMove == false)
{
if (playerObject.transform.position.x > currentPosition.x)
{
nextPosition.x = currentPosition.x + 1;
canMove = false;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
canMove = true;
}
}
if (canMove)
{
if (playerObject.transform.position.y > currentPosition.y)
{
nextPosition.y = currentPosition.y + 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
if (playerObject.transform.position.y < currentPosition.y)
{
nextPosition.y = currentPosition.y - 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
}
if (nextPosition == playerObject.transform.position)
{
nextPosition = currentPosition;
}
transform.position = nextPosition;
thePlayer.timeToMove = true;
Debug.Log("Leaving 'a'...");
return;
}
if (playerObject.transform.position.x < currentPosition.x)
{
nextPosition.x = currentPosition.x - 1;
canMove = false;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
canMove = true;
}
}
if (canMove)
{
if (playerObject.transform.position.y > currentPosition.y)
{
nextPosition.y = currentPosition.y + 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
if (playerObject.transform.position.y < currentPosition.y)
{
nextPosition.y = currentPosition.y - 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
}
if (nextPosition == playerObject.transform.position)
{
nextPosition = currentPosition;
}
transform.position = nextPosition;
thePlayer.timeToMove = true;
Debug.Log("Leaving 'b'...");
return;
}
if (playerObject.transform.position.x == currentPosition.x)
{
if (playerObject.transform.position.y > currentPosition.y)
{
nextPosition.y = currentPosition.y + 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
if (playerObject.transform.position.y < currentPosition.y)
{
nextPosition.y = currentPosition.y - 1;
foreach (Transform wall in wallArray)
{
if (wall.transform.position.Equals(nextPosition))
{
nextPosition = currentPosition;
}
}
}
if (nextPosition == playerObject.transform.position)
{
nextPosition = currentPosition;
}
transform.position = nextPosition;
thePlayer.timeToMove = true;
Debug.Log("Leaving 'c'...");
return;
}
}
玩家代码:
// Movement variables
public Vector3 playerCurrentPosition;
Vector3 nextPosition;
public Transform[] wallArray;
public bool timeToMove;
bool movingToWall;
void Start()
{
// When we start we can move
timeToMove = true;
}
void Update()
{
// Update current position variable
playerCurrentPosition = transform.position;
// Move
Movement();
}
// Movement
void Movement()
{
// If it's time to move
if (timeToMove)
{
// If right arrow key pressed
if (Input.GetKeyDown(KeyCode.RightArrow))
{
// Set position to move to
nextPosition.x = playerCurrentPosition.x + 1;
// Check wall array
foreach (Transform wall in wallArray)
{
// If the wall we are checking is in the space we want to move to
if (wall.transform.position.Equals(nextPosition))
{
// We are moving into a wall
movingToWall = true;
}
}
// If we are moving into a wall
if (movingToWall)
{
// Don't move
nextPosition = playerCurrentPosition;
// Set position
transform.position = nextPosition;
// It's time to move again
timeToMove = true;
// We're not moving into a wall anymore
movingToWall = false;
}
// If we're not moving into a wall
else
{
// Move
transform.position = nextPosition;
// It's no longer time to move
timeToMove = false;
}
}
// If left arrow key pressed
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
// Set position we want to move to
nextPosition.x = playerCurrentPosition.x - 1;
// Check wall array
foreach (Transform wall in wallArray)
{
// If the wall we are checking is in the space we want to move to
if (wall.transform.position.Equals(nextPosition))
{
// We are moving into a wall
movingToWall = true;
}
}
// If we are moving into a wall
if (movingToWall)
{
// Don't move
nextPosition = playerCurrentPosition;
// Set position
transform.position = nextPosition;
// We can move again
timeToMove = true;
// We are no longer moving into a wall
movingToWall = false;
}
// If we are not moving into a wall
else
{
// Move
transform.position = nextPosition;
// It is no longer time to move
timeToMove = false;
}
}
// If up arrow pressed
if (Input.GetKeyDown(KeyCode.UpArrow))
{
// Set position to move to
nextPosition.y = playerCurrentPosition.y + 1;
// Check wall array
foreach (Transform wall in wallArray)
{
// If wall we are checking is in space we want to move to
if (wall.transform.position.Equals(nextPosition))
{
// We are moving into a wall
movingToWall = true;
}
}
// If we are moving into a wall
if (movingToWall)
{
// Don't move
nextPosition = playerCurrentPosition;
// Set position
transform.position = nextPosition;
// We can move again
timeToMove = true;
// No longer moving into wall
movingToWall = false;
}
// If we are not moving into a wall
else
{
// Move
transform.position = nextPosition;
// It is no longer time to move
timeToMove = false;
}
}
// If down arrow pressed
if (Input.GetKeyDown(KeyCode.DownArrow))
{
// Set position to move to
nextPosition.y = playerCurrentPosition.y - 1;
// Check wall array
foreach (Transform wall in wallArray)
{
// If wall we are checking is in the space we want to move to
if (wall.transform.position.Equals(nextPosition))
{
// We are moving into a wall
movingToWall = true;
}
}
// If we are moving into a wall
if (movingToWall)
{
// Don't move
nextPosition = playerCurrentPosition;
// Set position
transform.position = nextPosition;
// We can move again
timeToMove = true;
// No longer moving into a wall
movingToWall = false;
}
// If we are not moving into a wall
else
{
// Move
transform.position = nextPosition;
// No longer time to move
timeToMove = false;
}
}
}
}
您的问题是否有可能是,您应该使用分离代码,而您却没有?你的代码是这样的:
void Movement()
{
if (Player.timeToMove == false)
{
if (playerObject.transform.position.x > currentPosition.x)
{
// huge amount of code
}
if (playerObject.transform.position.x < currentPosition.x)
{
// huge amount of code
}
if (playerObject.transform.position.x == currentPosition.x)
{
// huge amount of code
}
}
}
其实应该是这样的吧?
void Movement()
{
if (Player.timeToMove == false)
{
if (playerObject.transform.position.x > currentPosition.x)
{
// huge amount of code
Debug.Log("Leaving 'a'...");
return;
}
if (playerObject.transform.position.x < currentPosition.x)
{
// huge amount of code
Debug.Log("Leaving 'b'...");
return;
}
if (playerObject.transform.position.x == currentPosition.x)
{
// huge amount of code
Debug.Log("Leaving 'c'...");
return;
}
}
}
我建议尝试一下。
请注意,您确实需要引入一些函数来简化您的代码。你的代码是这样的...
foreach (Transform wall in wallArray)
if (wall.transform.position.Equals(nextPosition))
{
movingToWall = true;
}
应该是这样的函数:
private bool IsThisAWall(Vector3 p)
{
foreach (Transform wall in wallArray)
if (wall.transform.position.Equals(p))
{
return true;
}
return false;
}
然后你会像这样使用它。你会有一个变量 "possibleNewPosition"。你会说...
possibleNewPosition = currentPosition + 1; 如果 ( IsThisAWall(possibleNewPosition) ) Debug.Log("doing nothing since it's a wall"); 别的 当前位置 = possibleNewPosition;
你这样做很常见,你有一个变量 "possible ..." 什么的!
你真的需要及时做这件事。 (不要忘记在编程中,任何例程都不应超过 5 或 6 行代码。您的 Movement
等调用太长了。)