我正在尝试制作一个2D游戏,其中一个球从Unity的相机边缘反弹回来。现在,如果我理解正确,Unity会更多,你制作和环境,然后对齐相机,而不是让环境适合相机,对吗?
我可以得到球的位置,然后看看它是否大于某个值,然后施加一个力,这就是我正在做的,但是使用不同的设备,屏幕比例会改变,所以这不起作用。有没有办法检测它是否只是碰到相机/视图的边缘或我可以使用的某个百分比单位?在这个游戏中,相机随着球一起上下移动,所以只有左右两侧需要“弹性”。
当我查看它时,有些人建议使用一个设置在相机边缘的屏障。随着所有缩放和比率方面的变化,我认为只是检测边缘会更容易,无论是使用某种方法来获取屏幕宽度(以像素为单位),还是其他方式。
我很抱歉,如果这是一个简单的问题,这是我的第一个Unity游戏,所以我还在学习绳索。
一种方法是将球位置转换为屏幕位置,然后验证它是否离开屏幕(如果位置的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,如果我改变纵横比,当触摸边缘时球仍会反弹。
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
这是我用的。这是团结答案的答案。