Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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_Artificial Intelligence - Fatal编程技术网

C# 敌人AI在一定距离内阻止敌人

C# 敌人AI在一定距离内阻止敌人,c#,unity3d,artificial-intelligence,C#,Unity3d,Artificial Intelligence,你好,我正试图使用ifVector2.distance transform.position,player.position>minDistance让我的敌人停在玩家面前 但这并不是我想要的。敌人应该开始在一定范围内跟随玩家,然后停在玩家前面。这在ifVector2.distance transform.position、player.position minDistance到我的代码中运行良好,无需删除您可以将minDistance检查嵌套在范围检查中,如下所示: if (Vector2.Di

你好,我正试图使用ifVector2.distance transform.position,player.position>minDistance让我的敌人停在玩家面前

但这并不是我想要的。敌人应该开始在一定范围内跟随玩家,然后停在玩家前面。这在ifVector2.distance transform.position、player.position minDistance到我的代码中运行良好,无需删除您可以将minDistance检查嵌套在范围检查中,如下所示:

if (Vector2.Distance(transform.position, player.position) <= range)
{
    if (Vector2.Distance(transform.position, player.position) <= minDistance)
    {
        //Attack
    }
    else
    {
        //Chase
    }
}
这样,只要玩家在追击范围内,敌人就会追击,但距离不够近,无法攻击。一旦进入攻击范围,它将停止追逐并开始攻击。

尝试使用

if((transform.position, player.position).magnitude <range)
而不是

if(Vector2.Distance(transform.position, player.position) <= range)
距离和距离检查不是相互排斥的。它们既可以存在,也可以共存:

//Avoid redundancy, write less, and make things more readable
var distance = Vector2.Distance(transform.position, player.position);

//If within range..
if (distance <= range) {
    //If not within minDistance..
    if(!(distance <= minDistance)) {
        //Move
    }

    //If within minDistance (incl. after moving, above)..
    if (distance <= minDistance) {
        //Attack
    }
}
//If not within range..
else {
    //Idle
}
其他修复:


FixeUpdate是物理类的。如果我不知道我是否理解你的问题。如果Vector2.Distancetransform.position,player.position>MindDistance表示如果对手离玩家的距离超过MindDistance`,您确定这就是您想要的吗?你是说只有当这是真的时才跑步吗?你是说transform.position-player.position.magnity吗?-这没有什么区别,因为Vector2。距离也有同样的作用。小问题,但这与问题代码中的行为不完全一致。在那里,攻击会发生在同一个框架内,位置变成了心灵距离。然而,这只会在下一帧触发攻击。-涵盖了伪代码,与问题的伪代码完全相同,但由于我也涵盖了所有其他问题,所以编写伪代码的时间要长得多。-除此之外,答案通常是正确的+1.
//Avoid redundancy, write less, and make things more readable
var distance = Vector2.Distance(transform.position, player.position);

//If within range..
if (distance <= range) {
    //If not within minDistance..
    if(!(distance <= minDistance)) {
        //Move
    }

    //If within minDistance (incl. after moving, above)..
    if (distance <= minDistance) {
        //Attack
    }
}
//If not within range..
else {
    //Idle
}
//External(?) dependencies
public Transform player;
public LayerMask playerLayerMask; //From: whatIsPlayer

//Internal dependencies
public Animator animator; //From: anim

//Settings
public int health; //From: Health
public float range;
public float speed;
public int damage;
public float attackInterval; //From: timeBtwAttack

//Gobling stuff (probably redundant/unnecessary)
public Transform goblin; //From: goblinRange
public float goblinAttackRange; //From: attackRangeGoblin

//Used in the answer, as infered from the question
public float minDistance; //Probably what 'goblinAttackRange' is.