【问题标题】:Make multiple enemies follow on trigger Unity让多个敌人跟随触发 Unity
【发布时间】:2014-11-19 19:40:34
【问题描述】:

现在,我正在制作一款限时“逃生”主题游戏,玩家必须找到坠毁时散落的飞船碎片才能离开地球。玩家必须避开最终会在整个关卡中追逐他们的敌人。

我目前的问题是弄清楚一旦触发后如何让多个敌人跟随。

现在只有一个跟随,但该区域的其他 5 个没有移动。我正在考虑将它们放入一个数组中,但我不确定这是否会起作用,因为我需要访问 navmeshagent 组件

这是我的代码:

#pragma strict

//script by Kyle Crombie & Paul Christopher

    //will add negative action if collision is detected with player

var target : Transform; //the enemy's target 
var isSeen: boolean = false;

var agent: NavMeshAgent;

function OnTriggerStay() { 

    isSeen = true;
    target = GameObject.FindWithTag("Player").transform; //target the player

}

function Update () { 

    if(isSeen){
        agent.SetDestination(target.position);
    }

}

【问题讨论】:

  • 该语言称为 UnityScript,语法相似但语言不同
  • 你是不是要让所有敌人都被触发后跟随他们?
  • 也;当 anything 与触发器发生碰撞时,OnTriggerStay() 函数将激活,我怀疑您会想要检查玩家对象是否是触发器中的对象....如果您可以访问碰撞对象在函数调用中包含参数,请参阅文档:docs.unity3d.com/ScriptReference/Collider.OnTriggerStay.html 然后您可以检查“other.tag = "Player"" 或类似的东西来检查是否是玩家与触发器发生碰撞

标签: unity3d navigation artificial-intelligence unityscript path-finding


【解决方案1】:

您可以将代理变量的类型从 NavMeshAgent 更改为 NavMeshAgent 数组。在编辑器中,您可以设置数组的大小,然后分配您想要反应的所有敌人。然后你可以遍历它们并更新它们。这是它的样子:

#pragma strict

//script by Kyle Crombie & Paul Christopher
//will add negative action if collision is detected with player

var target : Transform; //the enemy's target 
var isSeen: boolean = false;

var agents : NavMeshAgent[]; // This is now an array!

function OnTriggerStay() {
    isSeen = true;
    target = GameObject.FindWithTag("Player").transform; //target the player
}

function Update () {
    if(isSeen){
        for (var agent in agents) {
            agent.SetDestination(target.position);
        }
    }
}

您也可以标记敌人并将FindGameObjectsWithTag 与GetComponent 结合使用。然后它看起来像这样:

#pragma strict

//script by Kyle Crombie & Paul Christopher
//will add negative action if collision is detected with player

var target : Transform; //the enemy's target 
var isSeen: boolean = false;

function OnTriggerStay() {
    isSeen = true;
    target = GameObject.FindWithTag("Player").transform; //target the player
}

function Update () {
    if(isSeen){
        for (var agent in GameObject.FindGameObjectsWithTag("Enemy")) {
            agent.GetComponent(NavMeshAgent).SetDestination(target.position);
        }
    }
}

【讨论】:

  • 我有使用数组的想法,但我不知道如何实现它!稍后我会尝试一下!谢谢!
  • 有没有办法让它跟踪与玩家的距离?现在我有它的第一部分代码,但我想将玩家传送回关卡的开始(通过将其返回到其原始坐标点或重新加载关卡)。我遇到的唯一问题是,即使停止距离设置为零,无人机也从未真正靠近到实际发生碰撞。
  • 脚本放置在无人机所在位置附近的触发器上,因此如果玩家走过它,无人机就会开始跟随。只是不确定如何使用给定的 for 循环跟踪无人机,因为我没有访问每个无人机的变换位置。
  • 在for循环中,可以测试var agent到播放器的距离。 Var agent 在循环期间更改为每个无人机。
  • 我应该创建一个变量来存储距离,然后使用 If 语句测试距离吗?如:var distance: Number; if(distance
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多