Непрерывно движущийся мяч застрял в какой-то момент

Я работаю над 2D-игрой, в которой монстр с круглым телом постоянно движется по экрану. Я установил сетку, которая заполняется движением игрока, поэтому общая площадь монстра уменьшается в зависимости от того, покрывает ли игрок его площадь.

Используя следующий код, монстр движется непрерывно, но в какой-то момент он застревает в каком-то углу и перестает двигаться.

public class EnemyMovement : MonoBehaviour
{
 private bool isStartMoving;
 private Vector3 direction;
 private float sFactor = 10.0f;
 private float localScaleX, localScaleY;

 //
 public float cSpeed = 5.0f;

 void Start ()
 {
     InitializeValues ();
 }

 private void InitializeValues ()
 {
     localScaleX = transform.localScale.x;
     localScaleY = transform.localScale.y;
     float xDirection = Random.Range (0, 2) * 2 - 1;
     float yDirection = Random.Range (0, 2) * 2 - 1;
     direction = new Vector3 (xDirection * cSpeed, yDirection * cSpeed, 0f);

     rigidbody2D.velocity = direction;
     isStartMoving = true;
 }

 void FixedUpdate ()
 {
     if (!isStartMoving) 
         return;

     // current velocity
     Vector3 cVel = rigidbody2D.velocity;
     if (cVel == Vector3.zero) 
         return;

     // normalized vector * constant speed
     Vector3 tVel = cVel.normalized * cSpeed;
     if (tVel.x > 0) 
         tVel.x = cSpeed;
     else 
         tVel.x = -cSpeed;

     if (tVel.y > 0) 
         tVel.y = cSpeed;
     else 
         tVel.y = -cSpeed;

     rigidbody2D.velocity = Vector3.Lerp (cVel, tVel, Time.deltaTime * sFactor);
 }

}

Я распределил материал по физике следующим образом.

введите здесь описание изображения

Что-то похожее на такую ​​ситуацию происходит со мной.

введите здесь описание изображения

Вы ясно видите, что в правом нижнем углу изображения монстр спит, хотя код непрерывного движения работает. Пожалуйста, дайте мне предложение, чтобы улучшить это.

Из приведенного выше кода я удалил следующий код:

if (cVel == Vector3.zero)
          return;

Затем мой монстр застревает в угловом положении. Почему монстр спит в угловом положении, я не могу понять !!!


person Siddharth    schedule 29.12.2015    source источник
comment
Эта ссылка может вам помочь   -  person Hamza Hasan    schedule 29.12.2015


Ответы (1)


На самом деле я вообще не вижу никакого эффекта от функции FixedUpdate(). Для чего тебе это? Монстр будет двигаться до тех пор, пока его Rigidbody установлена ​​скорость, которую вы уже сделали в Start(). Кроме того, он никогда не должен терять скорость, потому что вы установили трение на 0. Попробуйте удалить FixedUpdate().

Кроме того, в FixedUpdate() нельзя работать с Time.deltaTime. Time.deltaTime дает вам время, прошедшее с последнего кадра. Однако FixedUpdate() может вызываться несколько раз за кадр или даже не вызываться вовсе. Вы должны использовать Time.fixedTime всякий раз, когда вы вычисляете вещи, основанные на времени, в FixedUpdate().

person Thomas Hilbert    schedule 29.12.2015
comment
Спасибо за ответ. Потому что на экране движется несколько монстров. Так что вполне возможно, что монстры сталкиваются друг с другом и снижают скорость монстра. Я хочу, чтобы скорость монстра всегда была одинаковой в игре. Применение постоянной скорости, потому что только по этой причине. Еще один момент, у монстров нет открытого грунта для передвижения, поэтому им часто приходится проходить через пайпы. - person Siddharth; 29.12.2015