弹离屏幕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
这是我用的。这是统一答案的答案。
一种方法是将球位置转换为屏幕位置,然后验证它是否离开屏幕(如果该位置有 x 或 y 低于 0 或 x 大于 屏幕宽度 或 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 中,如果我更改纵横比,球在接触边缘时仍会反弹。
我正在尝试制作一个 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
这是我用的。这是统一答案的答案。
一种方法是将球位置转换为屏幕位置,然后验证它是否离开屏幕(如果该位置有 x 或 y 低于 0 或 x 大于 屏幕宽度 或 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 中,如果我更改纵横比,球在接触边缘时仍会反弹。