C# Unity 2D将敌人转向玩家

C# Unity 2D将敌人转向玩家,c#,unity3d,C#,Unity3d,我是Unity的新手,正在开发一款2D自上而下的射击游戏。我已经为敌人写了一个脚本,当他们有视线时,他们可以旋转给玩家。我现在要做的是,当玩家进入敌人的视线时,敌人不会立即对着玩家猛击,而是快速旋转面对他们。我目前的代码在我的脚本的while循环中,当玩家进入敌人的视线时,会导致Unity崩溃,你知道我做错了什么吗?我的脚本在没有while循环及其内容的情况下运行良好 ''c# private void FixedUpdate() { Vector2 playerDir=playerLocati

我是Unity的新手,正在开发一款2D自上而下的射击游戏。我已经为敌人写了一个脚本,当他们有视线时,他们可以旋转给玩家。我现在要做的是,当玩家进入敌人的视线时,敌人不会立即对着玩家猛击,而是快速旋转面对他们。我目前的代码在我的脚本的while循环中,当玩家进入敌人的视线时,会导致Unity崩溃,你知道我做错了什么吗?我的脚本在没有while循环及其内容的情况下运行良好

''c#

private void FixedUpdate()
{
Vector2 playerDir=playerLocation.position-this.transform.position;
浮动角度=(数学Atan2(playerDir.y,playerDir.x)*数学Rad2Deg);
if(canSeePlayer())
{
而(角度-rb.旋转<10f | |角度-rb.旋转>10f)
{
rb.MoveRotation(rb.rotation+1);
}
rb.移动旋转(角度-90);
}
}
私人bool canSeePlayer()
{
RaycastHit2D hit=Physics2D.Raycast(this.transform.position,playerLocation.position-this.transform.position);
Debug.DrawRay(this.transform.position,playerLocation.position-this.transform.position);
Log(hit.collider.gameObject);
if(hit.collider.gameObject.CompareTag(“玩家”))
{
返回true;
}
其他的
{
返回false;
}

''

许多物理组件都是固定更新的 许多方法不是立即改变的

例如: 您可以使用此代码进行测试

var rotation = Rigidbody.rotation; // before
Rigidbody.MoveRotation(5);
var newRotation = Rigidbody.rotation; // after
调用rigibody.moveRotation(第2行)后,旋转仍然等于newRotation,您将在下一次固定更新中看到更新 这就是Unity崩溃的原因(因为无限循环,所以旋转不更新)

有关更多信息:

我相信Mathf.Lerp是您所需要的,它允许平滑值的变化,而不会使它们过大。在您的FixedUpdate中,尝试以下方法:

Vector2 playerDir = playerLocation.position - this.transform.position;
float angle = (Mathf.Atan2(playerDir.y, playerDir.x) * Mathf.Rad2Deg);
float rotationSpeed = 1f;
rb.rotation = Mathf.Lerp(rb.rotation, angle, rotationSpeed);
当然,欢迎您根据自己的喜好调整
旋转速度
,并将其提取到编辑器中可编辑的类变量中

关于您的游戏冻结,请注意您的
while
退出条件没有得到很好的定义:

while (angle - rb.rotation < 10f || angle-rb.rotation > 10f)
while (angle - rb.rotation < 10f || angle-rb.rotation > 10f)
0. angle - rb.rotation = -15 (less than 10f) => execute loop => rb.rotation++
1. angle - rb.rotation = -16 (less than 10f) => execute loop => rb.rotation++
2. angle - rb.rotation = -17 (less than 10f) => execute loop => rb.rotation++
3. ...