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