Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AI跟随并向玩家旋转_C#_Unity3d_Rotation - Fatal编程技术网

C# AI跟随并向玩家旋转

C# AI跟随并向玩家旋转,c#,unity3d,rotation,C#,Unity3d,Rotation,我的剧本有问题,我想要我的敌人,跟随并向玩家旋转。当他四处走动的时候。 这看起来效果不错,但当我的球员在y轴上旋转180度时,我的敌人似乎会后退很多(他的位置),只有当我的球员恢复正常旋转时,敌人才会回来。 我做错了什么 公共类EnemyTesting:单一行为 { 公共游戏对象玩家; 公众浮子速度=1.5f; 公共浮动汇率; 私有void更新() { Vector3 toTarget=player.transform.position-transform.position; 浮动角度到目标=

我的剧本有问题,我想要我的敌人,跟随并向玩家旋转。当他四处走动的时候。 这看起来效果不错,但当我的球员在y轴上旋转180度时,我的敌人似乎会后退很多(他的位置),只有当我的球员恢复正常旋转时,敌人才会回来。 我做错了什么

公共类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;