弹离屏幕Unity 2D

Bounce off screen Unity 2D

我正在尝试制作一个 2D 游戏,其中一个球在 Unity 中从相机边缘反弹。现在,如果我没理解错的话,Unity更多的是,你制作环境,然后对齐相机,而不是制作适合相机的环境,对吧?

我可以得到球的位置,然后看看它是否大于某个值,然后施加一个力,这就是我所做的,但是随着不同的设备,屏幕比例会发生变化,所以不会'不工作。有没有办法检测它是否刚好到达 camera/view 的边缘或我可以使用的某个百分比单位?在这个游戏中,镜头随着球上下移动,所以只有左右两边需要 "bouncy".

当我查到这个的时候,有些人建议使用设置在相机边缘的屏障。随着所有缩放比例和比例方面的变化,我认为检测边缘会更容易,无论是使用某种方法以像素为单位获取屏幕宽度,还是其他方式。

var dist = (this.transform.position 
- Camera.main.transform.position).z;

var leftBorder = 
Camera.main.ViewportToWorldPoint(new 
Vector3(0,0,dist)).x;
var rightBorder = 
Camera.main.ViewportToWorldPoint(new 
Vector3(1,0,dist)).x;
var topBorder = 
Camera.main.ViewportToWorldPoint(new 
Vector3(0,0,dist)).y;
var bottomBorder = 
Camera.main.ViewportToWorldPoint(new 
Vector3(0,1,dist)).y;

Vector3 playerSize = 


this.gameObject. 
renderer.bounds.size;

this.transform.position = new 
Vector3 (

Mathf.Clamp(this. 
transform.position.x, 
leftBorder + playerSize.x/2, 
rightBorder - playerSize.x/2),
Mathf.Clamp 
(this.transform.position.y, 
topBorder + playerSize.y/2, 
bottomBorder - playerSize.y/2),
this.transform.position.z

这是我用的。这是统一答案的答案。

一种方法是将球位置转换为屏幕位置,然后验证它是否离开屏幕(如果该位置有 xy 低于 0x 大于 屏幕宽度 y 大于 屏幕高度 ).

Vector2 screenPosition = Camera.main.WorldToScreenPoint(this.transform.position);
if((screenPosition.y > Screen.height) || (screenPosition.y < 0f) || (screenPosition.x > Screen.width) || (screenPosition.x <0f))
{   
    screenPosition.x = Mathf.Clamp(screenPosition.x, 0f, Screen.width);
    screenPosition.y = Mathf.Clamp(screenPosition.y, 0f, Screen.height);
    Vector3 newWorldPosition = Camera.main.ScreenToWorldPoint(screenPosition);
    this.transform.position = new Vector2(newWorldPosition.x, newWorldPosition.y);
    Move();
}
private void Move()
{
    velocity *= -1f;
    rigidBody.velocity = velocity;
}

在此示例中,脚本将检查球是否离开屏幕,如果是,则夹住屏幕边缘之间的位置并更改速度,以便球弹回相反的方向。请注意,在下面的 GIF 中,如果我更改纵横比,球在接触边缘时仍会反弹。