如何在 OnCollisionEnter2D() 中找到碰撞游戏对象的索引
Posted
技术标签:
【中文标题】如何在 OnCollisionEnter2D() 中找到碰撞游戏对象的索引【英文标题】:How to find index of colliding Game Object in OnCollisionEnter2D() 【发布时间】:2016-08-10 00:03:52 【问题描述】:我创建了一个预制件,并在脚本中多次实例化它,并将其附加到另一个游戏对象,如下所示。
void Start ()
badGuys= new List<GameObject> ();
int numberOfBadGuys = 6;
Camera camera = GameObject.FindGameObjectWithTag ("MainCamera").GetComponent<Camera> ();
for (int i = 1; i < numberOfBadGuys + 1; i++)
GameObject badGuyObject = (GameObject)Instantiate(badGuy, new Vector3(Screen.width*i/2, Screen.height*i/6, camera.nearClipPlane ), Quaternion.identity );
badGuys.Add(badGuyObject);
由于数组中所有实例化的对象都具有相同的标签和游戏对象,如何在数组中找到碰撞对象的索引?
void OnCollisionEnter2D(Collision2D col)
Debug.Log("collision has began");
if (col.gameObject.tag == "badGuy")
// how can I tell the index of colliding game object in badGuys array
【问题讨论】:
您是否在包含 badguys 数组的同一脚本中检测到冲突? 是的,它们都在同一个脚本中 【参考方案1】:你有没有考虑让你的坏人知道他们的索引?
【讨论】:
确实如此。而且,无效的,别忘了你也可以检测到在坏人身上的碰撞。你应该这样做并在那里进行任何处理。【参考方案2】:您应该能够像这样循环和比较游戏对象:
void OnCollisionEnter2D(Collision2D col)
Debug.Log("collision has began");
int collidedBadGuyIndex = -1; //This variable should be outside this function.
if (col.gameObject.tag == "badGuy")
for (int i=0; i<badGuys.Length; i++)
if (col.gameObject.Equals(badGuys[i]))
collidedBadGuyIndex = i;
break;
如果这不起作用,那么您可以将脚本添加到 badguys(即 BadGuyScript.cs)并在脚本内部添加一个名为 bool hasCollided = false;
的变量,然后当 badguy 碰撞时将变量设置为 true
然后循环所有的 badguy 并找到值等于 true
的 badguy 的索引。
【讨论】:
嗨奥古斯丁。确实,从表面上看,正如问题所描述的那样,找到索引的唯一方法就是按照您的说法循环。但正如下面“是”所提到的,每个项目都应该知道自己的索引。 @Joe Blow 是的,我知道他的解决方案更好,只是我们几乎同时发布,所以他可能在我写答案时发帖。【参考方案3】:尝试为所有坏人使用一个父母。
【讨论】:
以上是关于如何在 OnCollisionEnter2D() 中找到碰撞游戏对象的索引的主要内容,如果未能解决你的问题,请参考以下文章
OncollisionEnter2D 不工作,但 OnTriggerEnter2D 工作正常
Unity 在没有 IsTrigger 的情况下使用 OnCollisionEnter2D 检测碰撞