2017-11-11 126 views
0

我使用这个代码:加速度运动极限

void Update() 
{ 
    accel = Input.acceleration.x; 
    transform.Translate (0, 0, accel); 
    transform.position = new Vector3 (Mathf.Clamp (transform.position.x,-6.9f, 6.9f), -4.96f, 18.3f); 
} 

这让我的游戏对象移到我想要的方式,但问题是,当我把应用我的电话,(-6.9)(6.9)上不是我屏幕的“终点”。而我无法弄清楚如何根据每个屏幕尺寸更改这些值?

+1

使用'Screen.width'和'Screen.height'并尽量避免硬编码变量。 –

+0

感谢您的回放。你能解释如何使用screen.width和height吗? –

+0

我会尝试,但是我没有足够的信息来帮助您在上下文中使用它。你能发布你想要实现的图像吗? –

回答

0

这将是一个较长的答案,所以请在这里忍受我。

请注意,本文假设您使用正交相机 - 使用的公式不适用于透视相机。

据我所知,你的愿望是保持你的对象在屏幕边界内。 Unity中的屏幕边界由相机尺寸和屏幕尺寸的组合决定。

float height = Camera.main.orthographicSize * 2; 

相机的正投影尺寸决定世界单位屏幕的尺寸的一半。乘以这个值将导致屏幕顶部和底部之间的世界单位数量。

要从此值获得宽度,我们将该值乘以屏幕宽度除以屏幕高度。

float width = height * Screen.width/Screen.height; 

现在我们有我们屏幕的尺寸,但我们仍然需要保持对象在这些边界内。

首先,我们创建一个Bounds类型的实例,我们将使用该实例确定该位置的最大值和最小值。我们使用Vector3.zero因为我们的边界实例的中心

Bounds bounds = new Bounds (Vector3.zero, new Vector3(width, height, 0)); 

注应该是世界的中心。这是你的物体应该能够在里面移动的区域的中心。

最后,根据我们得到的界限的属性,我们限制对象的位置值。

Vector3 clampedPosition = transform.position; 
clampedPosition.x = Mathf.Clamp(clampedPosition.x, bounds.min.x, bounds.max.x); 
transform.position = clampedPosition; 

这应该确保您的对象永远不会离开屏幕的边界!

+0

所以感谢解释,但现在统一给了我bounds.min.x和bounds.max.x的错误:'资产/脚本/控制器。cs(31,54):错误CS0103:当前上下文中不存在名称'bounds' –

+0

@TodorValkov您必须将变量'bounds'保存在某个明显的位置,可能位于控制器脚本中的私有变量中。 –

+0

哦,现在我不在。谢谢!!它正在工作。 –