Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Loops 如何使AI只向场景中活动的对象移动(Unity Engine)_Loops_Artificial Intelligence_Scene - Fatal编程技术网

Loops 如何使AI只向场景中活动的对象移动(Unity Engine)

Loops 如何使AI只向场景中活动的对象移动(Unity Engine),loops,artificial-intelligence,scene,Loops,Artificial Intelligence,Scene,嗨,我正在做一个餐馆战略游戏,顾客进来买东西。我已经创建了一个变换类型对象数组,这些对象充当路径点,我希望客户只向场景中活动的路径点移动。我想做的是使用for循环或while循环,其中对于每个未激活的路径点,移动到下一个路径点并检查其是否激活。我不确定这是否是正确的方法,因为我似乎无法让它工作。无论如何,我真的需要一些帮助。谢谢 var waypoints : Transform[]; var waypoint : Transform; var currentWaypoint : int; va

嗨,我正在做一个餐馆战略游戏,顾客进来买东西。我已经创建了一个变换类型对象数组,这些对象充当路径点,我希望客户只向场景中活动的路径点移动。我想做的是使用for循环或while循环,其中对于每个未激活的路径点,移动到下一个路径点并检查其是否激活。我不确定这是否是正确的方法,因为我似乎无法让它工作。无论如何,我真的需要一些帮助。谢谢

var waypoints : Transform[];
var waypoint : Transform;
var currentWaypoint : int;
var agent : NavMeshAgent;
var script1 : SlideOutMenu;

function Awake(){
agent = gameObject.GetComponent.<NavMeshAgent>();
agent.speed = Random.Range(2.5, 5);
script1 = gameObject.Find("GUIElements").GetComponent(SlideOutMenu);
}

function Update () {
waypoint = waypoints[currentWaypoint];
agent.SetDestination(waypoint.position);
}

function OnTriggerExit(other : Collider){
if (other.name == "0 Start"){
    currentWaypoint = Random.Range(1, 2);
    }
}

function OnTriggerEnter (other : Collider) {
EatMeal();
if (other.name == "0 Start"){
currentWaypoint++;
}
    if (other.name == "1"){
    script1.globalMoney += 50;
    WaitForSoda();
    }
        if (other.name == "2"){
        script1.globalMoney += 100;
        WaitForFood();
        }
    if (other.name == "4 End"){
    Destroy(gameObject);
    }
}

function WaitForSoda(){
yield WaitForSeconds(2);
currentWaypoint++;
}

function WaitForFood(){
yield WaitForSeconds(5);
currentWaypoint = Random.Range(5, 12);
}

function EatMeal(){
if (currentWaypoint >= 4 && currentWaypoint <= 12){
yield WaitForSeconds(Random.Range(5, 12));
currentWaypoint = 4;
}
}
var航路点:变换[];
var航路点:变换;
当前航路点:int;
var代理:NavMeshAgent;
变量脚本1:滑动菜单;
函数Awake(){
agent=gameObject.GetComponent.();
agent.speed=Random.Range(2.5,5);
script1=gameObject.Find(“GUIElements”).GetComponent(滑动菜单);
}
函数更新(){
航路点=航路点[当前航路点];
代理设置目的地(航路点位置);
}
OnTriggerExit功能(其他:碰撞器){
如果(other.name==“0开始”){
currentWaypoint=随机范围(1,2);
}
}
对撞机功能(其他:对撞机){
吃饭();
如果(other.name==“0开始”){
currentWaypoint++;
}
如果(other.name==“1”){
script1.globalMoney+=50;
WaitForSoda();
}
如果(other.name==“2”){
script1.globalMoney+=100;
等待食物();
}
如果(other.name==“4结束”){
摧毁(游戏对象);
}
}
函数WaitForSoda(){
收益等待秒(2);
currentWaypoint++;
}
函数WaitForFood(){
收益等待秒(5);
currentWaypoint=随机范围(5,12);
}
函数eatdemine(){

如果(currentWaypoint>=4&¤tWaypoint这通常是个坏主意™ 在游戏编程中,当你发现自己采取的解决方案是“每次我这样做,我都会迭代所有对象,并检查它们是否处于活动状态…”我这样说是因为有人曾经在10000x100000网格上犯过这样的错误。解决此类问题的最佳方法通常是将问题颠倒过来。每个航路点不应该询问每个航路点是否处于活动状态,而应该询问它是否属于活动集或非活动集。我建议至少有两个列表:
activeWay点
非活动航路点
。如果需要(有时也需要),可以将
主航路点
用作通用集合

现在很简单:每个航路点都知道它是活动的还是非活动的,当它激活时,它会将自己从非活动列表中移除,并将自己添加到活动列表中,反之亦然。当它被创建时,你必须选择默认情况下是活动的还是非活动的(或者提供一个选项以使用默认值创建它),但这充其量只是一个次要的设计问题。当它被销毁时,只需将其从当前所在的位置和
masterWaypoints
中删除即可

这样做的好处是,您只需在更改状态时更新内容,而不必在每一帧检查它们(或者更糟:对于每一个NPC代理,每一帧)

从这里开始,现在你要做的就是检查每个客户的
activeWaypoints
。如果你需要对每个客户进行进一步的筛选,那就有点困难了。在这种情况下,可以对所有
activeWaypoints
进行迭代,忽略所有不符合标准的航路点。尽管这取决于需要做多少过滤,我可能会考虑编写一种<代码> WooPosikMask[/COD],用它自己的逻辑来过滤基于活动/不活动/红/蓝/由果酱/精神错乱诱发/产生的,这是通过<代码> GeavouPosits MeimeTe准则(过滤器列表)访问的。
。这可以使用地图、列表和通过迭代过滤的混合,具体取决于您对每个标记的决定


这里有一个障碍,可能是航路点是有序的,这意味着当航路点从非活动或活动状态移动时,它们需要保持其顺序,但是有很多方法可以快速插入和/或构建排序列表。

非常棒的反馈。非常感谢你让我看到了一种不同的方式对此进行编码。我最终使用了一组主通道点,当我需要时,主通道点由活动通道点和非活动通道点引用。它工作得非常好,可以通过其他脚本轻松访问。客户现在只会在收银台是唯一的活动通道点的情况下使用,这正是我想要的。再次感谢!