反弹屏幕Unity 2D

问题描述 投票:1回答:2

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

我可以得到球的位置,然后看看它是否大于某个值,然后施加一个力,这就是我正在做的,但是使用不同的设备,屏幕比例会改变,所以这不起作用。有没有办法检测它是否只是碰到相机/视图的边缘或我可以使用的某个百分比单位?在这个游戏中,相机随着球一起上下移动,所以只有左右两侧需要“弹性”。

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

我很抱歉,如果这是一个简单的问题,这是我的第一个Unity游戏,所以我还在学习绳索。

unity3d 2d-games
2个回答
0
投票

一种方法是将球位置转换为屏幕位置,然后验证它是否离开屏幕(如果位置的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,如果我改变纵横比,当触摸边缘时球仍会反弹。


0
投票
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

这是我用的。这是团结答案的答案。

© www.soinside.com 2019 - 2024. All rights reserved.