Я занимаюсь разработкой игры Unity на C #.Каждое тетромино имеет уникальный ярлык или изображение и уникальное место для посадки.Если он приземляется не в том месте, я использую следующее, чтобы переместить его в нужное место перед тем, как создать следующий фрагмент:
void MoveMisplacedShapeToCorrectLocation(Shape shape, Vector3 vector3)
{
float speed = 15;
Vector3 targetPosition = m_gameBoard.m_dictionaryOfProperLocations[shape.name];
Vector3 currentPosition = shape.transform.position;
// First, check to see if the shape is close enough to the target
if (Vector3.Distance(currentPosition, targetPosition) > .02f)
{
Vector3 directionOfTravel = targetPosition - currentPosition;
// Normalize the direction, since we only want the direction information, not the magnitude.
directionOfTravel.Normalize();
// Scale the movement on each axis by the directionOfTravel vector components
shape.transform.Translate(
(directionOfTravel.x * speed * Time.deltaTime),
(directionOfTravel.y * speed * Time.deltaTime),
(directionOfTravel.z * speed * Time.deltaTime),
Space.World);
}
else
{
isMisplaced = false;
}
}
В моей функции обновления у меня есть следующее:
// Update is called once per frame
void Update () {
PlayerInput();
if (isMisplaced == true)
{
MoveMisplacedShapeToCorrectLocation(m_activeShape, transform.position);
}
}
Это работает довольно хорошо, но некоторые формы энергично колеблются в течение нескольких секунд, когда они достигают своего места, прежде чем обосноваться, в то время как другие располагаются так же плавно, как если бы они щелкнули в .Я не понимаю почему.Я изменил скорость, и это, кажется, не имеет большого эффекта.Я также изменил расстояние (0,02 выше) в условии if, и это имеет некоторый эффект.Но я хочу, чтобы это расстояние было небольшим (> = 0,03), в противном случае, когда все фигуры находятся на своих местах, слишком много выглядит «зазубренным».
Есть ли что-нибудь, что можно сделать, чтобы подавитьдрожит?
ОБНОВЛЕНИЕ, поскольку я попытался последовать совету Рона в первоначальном комментарии :
Следуя совету Рона в первоначальном комментарии ниже, вот что я попробовалиспользуя Vector3.MoveTowards:
void MoveMisplacedShapeToCorrectLocation(Shape shape)
{
float speed = 15;
float step = speed * Time.deltaTime; // The step size is equal to speed times the frame time.
Vector3 targetPosition = m_gameBoard.m_dictionaryOfProperLocations[shape.name];
Vector3 currentPosition = shape.transform.position;
// Check if the shape is unacceptably far from the target position:
if (Vector3.Distance(currentPosition, targetPosition) > .02f)
{
Debug.LogWarning("Vector3.Distance");
Debug.LogWarning(Vector3.Distance(currentPosition, targetPosition));
Debug.LogWarning("step");
Debug.LogWarning(step);
// Move our position a step closer to the target.
currentPosition = Vector3.MoveTowards(currentPosition, targetPosition, step);
}
else
{
isMisplaced = false;
}
}
И я немного изменил свою функцию обновления следующим образом (сейчас я использую только одну пару параметр-аргумент, а не две. В моем первом посте второй параметрпара аргументов не нужна.):
// Update is called once per frame
void Update () {
PlayerInput();
if (isMisplaced == true)
{
MoveMisplacedShapeToCorrectLocation(m_activeShape);
}
}
Однако это не работает.Неправильно приземленная фигура просто сидит там, где она приземлилась. Я был бы признателен за вашу помощь.Спасибо.