C# AI跟随并向玩家旋转
我的剧本有问题,我想要我的敌人,跟随并向玩家旋转。当他四处走动的时候。 这看起来效果不错,但当我的球员在y轴上旋转180度时,我的敌人似乎会后退很多(他的位置),只有当我的球员恢复正常旋转时,敌人才会回来。 我做错了什么C# AI跟随并向玩家旋转,c#,unity3d,rotation,C#,Unity3d,Rotation,我的剧本有问题,我想要我的敌人,跟随并向玩家旋转。当他四处走动的时候。 这看起来效果不错,但当我的球员在y轴上旋转180度时,我的敌人似乎会后退很多(他的位置),只有当我的球员恢复正常旋转时,敌人才会回来。 我做错了什么 公共类EnemyTesting:单一行为 { 公共游戏对象玩家; 公众浮子速度=1.5f; 公共浮动汇率; 私有void更新() { Vector3 toTarget=player.transform.position-transform.position; 浮动角度到目标=
公共类EnemyTesting:单一行为
{
公共游戏对象玩家;
公众浮子速度=1.5f;
公共浮动汇率;
私有void更新()
{
Vector3 toTarget=player.transform.position-transform.position;
浮动角度到目标=矢量3.角度(变换.前进,到目标);
Vector3旋转轴=Vector3.交叉(变换、前进、目标);
transform.RotateAround(transform.position,turnAxis,Time.deltaTime*转动率*与目标的角度);
transform.Translate(目标*速度*时间.deltaTime);
}
通过“返回”,我理解旋转,而不是位置。
我认为你的问题是Vector3.Angle。请检查函数是否返回两个向量之间的两个可能角度中较小的一个。如果角度大于180,你需要在代码中处理它,以使敌人相应地旋转
编辑:我认为这是由平移函数的旋转空间产生的。
在transform.Translate
参数中设置Space.World
试试这个:
private void Update() {
Vector3 toTarget = player.transform.position - transform.position;
transform.LookAt(player.transform.position);
transform.Translate(toTarget * speed * Time.deltaTime, Space.World);
}
通过“返回”,我理解旋转,而不是位置。
我认为你的问题是Vector3.Angle。请检查函数是否返回两个向量之间的两个可能角度中较小的一个。如果角度大于180,你需要在代码中处理它,以使敌人相应地旋转
编辑:我认为这是由平移函数的旋转空间产生的。
在transform.Translate
参数中设置Space.World
试试这个:
private void Update() {
Vector3 toTarget = player.transform.position - transform.position;
transform.LookAt(player.transform.position);
transform.Translate(toTarget * speed * Time.deltaTime, Space.World);
}
你可以用它慢慢地将敌人的方向转向玩家
var towardsPlayer = player.transform.position - transform.position;
transform.rotation = Quaternion.RotateTowards(
transform.rotation,
Quaternion.LookRotation(towardsPlayer),
Time.deltaTime * turnRate
);
transform.position += transform.forward * speed * Time.deltaTime;
这种行为也会使敌人朝着它的前进方向走,而不是直接朝玩家走
var towardsPlayer = player.transform.position - transform.position;
transform.rotation = Quaternion.RotateTowards(
transform.rotation,
Quaternion.LookRotation(towardsPlayer),
Time.deltaTime * turnRate
);
transform.position += transform.forward * speed * Time.deltaTime;
你可以用它慢慢地将敌人的方向转向玩家
var towardsPlayer = player.transform.position - transform.position;
transform.rotation = Quaternion.RotateTowards(
transform.rotation,
Quaternion.LookRotation(towardsPlayer),
Time.deltaTime * turnRate
);
transform.position += transform.forward * speed * Time.deltaTime;
这种行为也会使敌人朝着它的前进方向走,而不是直接朝玩家走
var towardsPlayer = player.transform.position - transform.position;
transform.rotation = Quaternion.RotateTowards(
transform.rotation,
Quaternion.LookRotation(towardsPlayer),
Time.deltaTime * turnRate
);
transform.position += transform.forward * speed * Time.deltaTime;
对不起,如果我的退后是误会,我的意思是他只是按位置退后。(旋转可能没问题,因为敌人刚到某个位置,我看不见他)它工作得很好!!太空。世界,以前从未使用过它!修正了!thsnk!!!如果我的退后是误会,我的意思是他只是按位置退后。(旋转可能没问题,因为敌人刚到某个位置,我看不见他)它工作得很好!!太空。世界,以前从未使用过它!修复了!thsnk!!!嗨!谢谢你的回答,但是敌人的位置仍然消失了,而我正在尝试将我的播放器旋转到另一个方向。这一定是另一个问题,这个代码对我来说工作得很好。对于你有多高的旋转率?我已经尝试使用它一段时间了。你可能会的使用
transform.Translate(toTarget*speed*Time.deltaTime,Space.Self);
使用空格.Self
参数,而不是transform.position+=transform.forward*speed*Time.deltaTime;
建议Hi!谢谢你的回答,但是当我试图将我的播放器旋转到另一个方向时,敌人的位置仍然消失了。这一定是另一个问题,这个代码对我来说很好h u multiply turnRate?我已经尝试使用它一段时间了。您可能正在使用transform.Translate(toTarget*speed*Time.deltaTime,Space.Self);
使用Space.Self
参数,而不是transform.position+=transform.forward*speed*Time.deltaTime;