上一节中我们提到,当我们转动小鸟从弹弓圈内转出弹弓圈外的时候,小鸟会继续产生,发现这里面有一个bug,假如我们持续按住小鸟转动,则会产生多只小鸟。
void FixedUpdate()
{
if(!occupied && !sceneMoving())
spawnNext();
}
void spawnNext()
{
Instantiate(birdPrefab,transform.position,Quaternion.identity);
occupied=true;
}
void OnTriggerExit2D(Collider2D co)
{
occupied=false;
}
当 OnTriggerExit2D(Collider2D co)被执行一次时, occupied=false;而此时sceneMoving()是false,所以 spawnNext();就被触发一次。
我们观察一下弹弓的半径,radius是9。
再看一下拖动小鸟的脚本中,拖动半径设置为9,所以小鸟拖动的最大半径能超出弹弓半径,这里强调的是因为产生小鸟的位置处于弹弓的上端,不是弹弓中心,请看下图。pivot代表支点,就是小鸟产生的位置。这是因为支点不是弹弓中心,所以支点位置+拖动小鸟的半径radius会>9,导致我们在拖动产生的小鸟后会出现超出边界的情况。
void OnMouseDrag()
{
Vector2 p=Camera.main.ScreenToWorldPoint(Input.mousePosition);
float radius=9f;
Vector2 dir=p-startPos;
if(dir.magnitude>radius)
dir=dir.normalized*radius;
transform.position=startPos+dir;
}
如上代码中,我们将float radius=9f;设置的小一些,设置为 float radius=4f;
void OnMouseDrag()
{
Vector2 p=Camera.main.ScreenToWorldPoint(Input.mousePosition);
float radius=4f;
Vector2 dir=p-startPos;
if(dir.magnitude>radius)
dir=dir.normalized*radius;
transform.position=startPos+dir;
}
再来试一下小鸟产生的过程。
无论如何拖动小鸟转圈,小鸟所达到的距离都在弹弓radius之内,所以,这个时候是不会超出边界的,也就不会不断产生小鸟。