我有一个从玩家身上发射的弹丸预制件,当它与“边界”碰撞时,它应该自我毁灭,而当它碰到“咕gr声”时,它应该是毁灭自己和咕gr声。但是,当它撞到边界时,它会自我毁灭,并破坏边界的对撞机。我创建了一个自定义标签脚本,该脚本允许我将多个标签分配给一个游戏对象,而不仅仅是一个。
为什么它会破坏撞墙机? 为什么它将墙壁和咕unt声都检测为咕unt声? 我该如何解决?
这是导致问题的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyProjectile : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
//FIX detects only grunt
private void OnTriggerEnter(Collider other)
{
//Get Tag Component
Tags hitObject = other.GetComponent<Tags>();
//Collisions
if (hitObject.FindTag("boundary"))
{
//collision with wall
Debug.Log("Hit a Wall");
Destroy(gameObject);
}
else if (hitObject.FindTag("grunt"))
{
//collision with grunt
Debug.Log("Hit a Grunt");
Destroy(gameObject);
Destroy(other); //<---- Deletes Boundary Collider (Should be destroying the game object of the grunt, instead destroys the colliders of barriers and the grunt)
}
}
}
这是自定义标记脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tags : MonoBehaviour
{
public string[] startTags;
private static string[] tags;
private void Start()
{
tags = startTags;
}
public bool FindTag(string search)
{
bool results = false;
for (int i = 0; i < tags.Length; i++)
{
if(search == tags[i])
{
results = true;
break;
}
}
return results;
}
}
答案 0 :(得分:2)
看起来您有两个问题。
1)首先,您的弹丸正在摧毁咕unt声的对撞机,而不是咕the声。这是因为您将对撞机传递给了destroy函数,而不是咕gr声:
Destroy(other);
代替使用
Destroy(other.gameobject);
我也将此放在
之前Destroy(gameObject);
2)您的标签系统无法正常工作。我的猜测是,这是因为
private static string[] tags;
是静态的。我将删除静态修饰符,看看它是否有效。您也可以直接使用startTags
,而无需进行start()
分配。
Unity也已经有一个标签系统,可能更适合这种检测: https://docs.unity3d.com/Manual/Tags.html