Unity Raycast2D忽略了实例化的Prefab对象

时间:2017-07-05 18:23:34

标签: c# unity3d unity5

我正在为大学任务制作一个小游戏。这是一款简单的2D游戏,您可以使用鼠标拍摄鸟类。

我首先手动进行了碰撞检测(检查x / y边界),但现在我想使用碰撞器。

所以我在我的对象中添加了一个 CircleCollider2D ,我就这样执行了Raycast

Vector3 mousePosition = Camera.main.ScreenToWorldPoint (Input.mousePosition);

RaycastHit2D[] hits = Physics2D.RaycastAll (mousePosition, Vector3.forward, Mathf.Infinity);
        Debug.Log (hits.Length);

现在,当我手动将预制件添加到我的场景中时,它按预期工作。如果我有多只鸟在彼此之上,则日志输出1,甚至2。

但是我的游戏随机地实例化了很多鸟,并且在执行光线投射时没有检测到它们。我已经检查过,他们肯定有碰撞器。

实例化代码如下所示:

Bird bird = Instantiate (birdPrefab, birdPosition, Quaternion.identity) as Bird;

我现在用Google搜索了2个小时,但实际上没有什么能解决我的问题。

我不知道这是否重要,但是在鸟对象的附加脚本中不会发生碰撞检测。

我真的很好,因为它适用于手动放置对象,但不适用于实例化的对象。有没有人经历过这个?

编辑:

鼠标位置在(x,y,-10)上,并且鸟类在(x,y,0)上,并且手动放置的鸟类和实例化的是现场的直接孩子。

EDIT2:

Bird start

// Use this for initialization
void Start () {
    this.animator = this.GetComponent<Animator> ();

    this.camera = Camera.main;

    this.rigidBody = this.GetComponent<Rigidbody2D> ();
    // get the ammunition script
    this.ammunition = GameObject.Find ("Ammunition").GetComponent<Ammunition> ();
    // get the score script
    this.score      = GameObject.Find("Score").GetComponent<Score>();
}

手动放置鸟 Manually placed bird

实例化的鸟 Instatiated Bird

两者都有对撞机,两者都与RayCast处于同一Z级别。

1 个答案:

答案 0 :(得分:0)

根据您提供的信息,您的光线投影或Bird实例化似乎没有任何问题。这让我相信代码中的其他地方或场景的设置方式存在问题,特别是如果未实例化的鸟按预期工作。

如果您可以在游戏过程中发布手动放置的Bird和实例化的Bird Gameobject信息的屏幕截图,以及在实例化后对“bird”执行的任何代码,我们可以仔细查看。