连续移动球在某个时间停留

时间:2015-12-29 09:51:45

标签: c# unity3d physics velocity unity3d-2dtools

我正在进行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);
 }

}

我已按以下方式分配物理材料。

enter image description here

像我这样的情况发生了。

enter image description here

你清楚地看到图像右下角怪物正在睡觉,虽然连续的移动代码正在运行。请给我一些改进的建议。

从上面的代码我删除了以下代码:

if (cVel == Vector3.zero)
          return;

然后我的怪物卡在角落位置。为什么怪物在角落位置睡觉,我无法理解!!!

1 个答案:

答案 0 :(得分:0)

实际上我根本看不到FixedUpdate()功能的任何影响。你需要什么?只要Rigidbody具有速度设定,怪物就会一直移动,你已经在Start()中做过了。此外,它应该永远不会失去速度,因为你将摩擦设置为0.尝试删除FixedUpdate()

此外,FixedUpdate()中您不能做的事情是使用Time.deltaTimeTime.deltaTime为您提供自上一帧以来的时间。然而,FixedUpdate()可以每帧调用几次,甚至根本不调用。每当您在Time.fixedTime计算基于时间的内容时,您必须使用FixedUpdate()