我有一个卫队预制件,它有两个子组件:一个用于检测目标是否在范围内,另一个用于检测目标是否在捕获范围内。捕获范围的OnTriggerEnter工作在Prefab的两个实例上。但是,用于检测延迟是否在范围内的方法只适用于生成的预置程序的第一个实例。两个子对象都有一个刚体,该刚体被设置为“运动学”,并有自己的对撞机来执行任务。父母没有对撞机。在用于检测其在范围内的脚本中,我具有两个触发器函数:
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运动的父级脚本
public void InvokeChase()
{
InvokeRepeating("UpdatePath", 0f, .5f);
}
public void CancelInvokeChase()
{
CancelInvoke("UpdatePath");
}
这些是子对象正在调用的函数。只需调用函数就可以分别开始追逐和停止追逐。这是UpdatePath()函数:
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,只是传送实例,只移动第一个产生的实例。
发布于 2021-03-04 14:34:03
您的问题很可能出现在显示的第一个脚本的开始函数中。GameObject.FindGameObjectWithTag(string)
只返回一个GameObject
,第一个是它找到的。
一些可能的解决办法:
您可以使用GameObjects[]
.,注意它写的是Objects
而不是Object
,并将其存储在一个GameObject.FindGameObjectsWithTag(string)
中。
如果在运行时正在实例化
公共名单警卫=新名单();
然后在产卵功能中:
guards.Add(Instantiate(guardPrefab));
,
Physics.OverlapSphere(...);
的区域。它可以使用类似的射线广播,但它得到所有的对撞机在一个地区。可以将它们存储在数组中,并在需要时访问它们的脚本。https://stackoverflow.com/questions/66475942
复制相似问题