我有以下脚本应该检测两个对象之间的碰撞(BoxCollider2D是一个触发器,CircleCollider2D是一个普通的对撞机)
public class ArcadeScore : MonoBehaviour {
public BoxCollider2D bc;
public CircleCollider2D cc;
private int score;
// Use this for initialization
void Start () {
score = 0;
}
// Update is called once per frame
void Update ()
{
if (bc.IsTouching(cc))
{
Debug.Log("collision detected");
score++;
}
}
}
但是脚本没有在控制台中打印任何东西,所以我想知道是否有可能从外部脚本中检测到触发器和普通对撞机之间的碰撞?
答案 0 :(得分:0)
您必须使用OnCollisionEnter2D
而不是IsTouching。 IsTouching
用于检测它们何时触及帧,这可能不是真的。 T 带有OnCollisionEnter2D
函数的脚本必须附加到GameObject,并且碰撞器不是空的GameObject。
问题是我经常破坏那个对象和所有的东西 值恢复为0
您必须将游戏逻辑分开,将系统代码评分为在运行时销毁的对象。基本上,你的游戏逻辑,得分系统代码不应该附加到破坏自己的对象。它们应该附加到一个空的GameObject。
诀窍是找到得分系统对象,获取其脚本然后在销毁碰撞的对象之前更新得分。
ScoreSystem脚本(附加到空GameObject):
public class ArcadeScore : MonoBehaviour
{
public int score;
// Use this for initialization
void Start () {
score = 0;
}
}
Collsion脚本(使用Collider附加到GameObject):
public class CollsionScript: MonoBehaviour
{
ArcadeScore scoreSys;
void Start()
{
//Find the ScoreSystem GameObject
GameObject obj = GameObject.Find("ScoreSystem");
//Get the ArcadeScore script
scoreSys = obj.GetComponent<ArcadeScore >();
}
void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "YourOtherObject")
{
scoreSys.score++;
//You can now destroy object
Destroy(gameObject);
}
}
}