我正在进行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;
然后我的怪物卡在角落位置。为什么怪物在角落位置睡觉,我无法理解!!!
答案 0 :(得分:0)
实际上我根本看不到FixedUpdate()
功能的任何影响。你需要什么?只要Rigidbody
具有速度设定,怪物就会一直移动,你已经在Start()
中做过了。此外,它应该永远不会失去速度,因为你将摩擦设置为0.尝试删除FixedUpdate()
。
此外,FixedUpdate()
中您不能做的事情是使用Time.deltaTime
。 Time.deltaTime
为您提供自上一帧以来的时间。然而,FixedUpdate()
可以每帧调用几次,甚至根本不调用。每当您在Time.fixedTime
计算基于时间的内容时,您必须使用FixedUpdate()
。