首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >脚本只影响预制件的一个实例。

脚本只影响预制件的一个实例。
EN

Stack Overflow用户
提问于 2021-03-04 13:23:42
回答 1查看 155关注 0票数 0

我有一个卫队预制件,它有两个子组件:一个用于检测目标是否在范围内,另一个用于检测目标是否在捕获范围内。捕获范围的OnTriggerEnter工作在Prefab的两个实例上。但是,用于检测延迟是否在范围内的方法只适用于生成的预置程序的第一个实例。两个子对象都有一个刚体,该刚体被设置为“运动学”,并有自己的对撞机来执行任务。父母没有对撞机。在用于检测其在范围内的脚本中,我具有两个触发器函数:

代码语言:javascript
运行
复制
TGuardMovement mov;

void Start()
{
    mov = GameObject.FindGameObjectWithTag("Guard").GetComponent<TGuardMovement>();
}

public void OnTriggerEnter2D(Collider2D a_Collider2D)
{
    if (a_Collider2D.gameObject.CompareTag("Animal"))
    {
        //invoke chase
        mov.InvokeChase();
    } 
}


public void OnTriggerExit2D(Collider2D a_Collider2D)
{
    //cancel Invoke
    if (a_Collider2D.gameObject.CompareTag("Animal"))
    {
        mov.CancelInvokeChase();
    }
        
}

TGuardMovement是处理AI运动的父级脚本

代码语言:javascript
运行
复制
 public void InvokeChase()
{
    InvokeRepeating("UpdatePath", 0f, .5f);
}

public void CancelInvokeChase()
{
    CancelInvoke("UpdatePath");
}

这些是子对象正在调用的函数。只需调用函数就可以分别开始追逐和停止追逐。这是UpdatePath()函数:

代码语言:javascript
运行
复制
void UpdatePath()
{       
    if(m_GState == GuardState.PATROLING)
    {
        TriggerMovement();
    }

    else if (m_GState == GuardState.CHASING)
    {
        if (m_Seeker.IsDone())
        {
            m_Seeker.StartPath(m_Rb2D.position, targetGO.transform.position, OnPathComplete);
        }

    }
    if (targetGO == null)
    {
        m_Seeker.StartPath(m_Rb2D.position, m_objManager.m_goTGuardObject.transform.position, OnPathComplete);
    }
}

我的想法已经接近尾声了,错误可能是什么。移动的触发事件是由未移动的预置触发的,但它不启动moving.Even,只是传送实例,只移动第一个产生的实例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-04 14:34:03

您的问题很可能出现在显示的第一个脚本的开始函数中。GameObject.FindGameObjectWithTag(string)只返回一个GameObject,第一个是它找到的。

一些可能的解决办法:

您可以使用GameObjects[].,注意它写的是Objects而不是Object,并将其存储在一个GameObject.FindGameObjectsWithTag(string)中。

如果在运行时正在实例化

  • ,则可以通过创建一个列表来存储对这些守卫的反射:

公共名单警卫=新名单();

然后在产卵功能中:

guards.Add(Instantiate(guardPrefab));

  • ,如果守卫来来去去,而你只想让所有的警卫进入你可以使用Physics.OverlapSphere(...);的区域。它可以使用类似的射线广播,但它得到所有的对撞机在一个地区。可以将它们存储在数组中,并在需要时访问它们的脚本。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66475942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档