Unity3D 游戏引擎之平面小球重力感应详解

发表于2017-06-13
评论0 4k浏览

Android iOS上有很多重力感应的游戏都是使用手机自带重力感应功能制作的,对于unity3d游戏引擎来说当然也支持,今天就给大家介绍学习下3D 世界中的手机重力感应,实现一个小球在屏幕中通过摇晃手机重力加速度让小球在屏幕中移动。


先看一看Unity3D 在iPhone上的重力分布图。如下图所示我们可以清晰的看出X Y Z 三个方向的重力分量。Unity3D中重量的取值范围是 -1.0 到 +1.0.


X轴:home按键在下手机面朝天向右旋转90度重力分量为+1.0  向左旋转90度重力分量为-1.0

Y轴:home按键在上手机背朝自己重力分量为+1.0 home按键在下手机面朝自己重力分量为-1.0

Z轴:手机面朝地面重力分量为+1.0 手机面朝天空重力分量为-1.0


OK! 有了这三组重要的数值我们就可以控制手机重力感应啦,紧接着我们看看小球重力感应的这个游戏小例子。





打开Unity3D 我们将给摄像机绑定一个脚本,用来响应用户控制手机来重力感应游戏小球的移动。

在Input 这个重要的类中,Unity3D 帮我们封装了重力加速的方法。


Input.acceleration.x; 重力感应X轴的重力分量

Input.acceleration.y; 重力感应Y轴的重力分量

Input.acceleration.z; 重力感应Z轴的重力分量


new.js


[javascript] view plain copy
  1. //小球的贴图  
  2. var round : Texture2D;    
  3.   
  4. //小球在屏幕中显示的X Y坐标  
  5. var x = 0;  
  6. var y = 0;  
  7.   
  8. //小球屏幕显示的最大 X Y 范围  
  9. var cross_x = 0;  
  10. var cross_y = 0;  
  11.   
  12.   
  13. function Start(){  
  14.     //初始化赋值  
  15.     cross_x = Screen.width -  round.width;    
  16.     cross_y = Screen.height -  round.height;      
  17. }  
  18.   
  19. function OnGUI () {  
  20.   
  21.     //整体显示 x y z 重力感应的重力分量  
  22.     GUI.Label(Rect(0,0,480,100),"position is " + Input.acceleration);  
  23.       
  24.     //绘制小球  
  25.     GUI.DrawTexture(Rect(x,y,256,256),round);     
  26. }  
  27.   
  28. function Update(){  
  29.       
  30.     //根据重力分量修改小球的位置这里乘以30的意思是让小球移动的快一些  
  31.     x += Input.acceleration.x * 30;  
  32.     y += -Input.acceleration.y * 30;      
  33.       
  34.       
  35.     //避免小球超出屏幕  
  36.     if(x < 0){    
  37.         x = 0;    
  38.     }else if(x > cross_x){    
  39.         x = cross_x;    
  40.     }    
  41.         
  42.     if(y < 0){    
  43.         y = 0;    
  44.     }else if(y > cross_y){    
  45.         y = cross_y;    
  46.     }    
  47. }  


重力感应的图片不太好截取,我们看看下面的示意图,小球可以根据我的手机的重力而移动。屏幕左上方正常打印手机当前X Y Z 三个方向的重力分量。






说到这里,可能会有盆友问我如何为3D的物体添加重力感应?其实方法是一样的,因为都是一样的道理,比如我可以给一个模型绑定一个这样的脚本,通过Input.acceleration去拿到当前手机的重力感应分量,然后根据这个分量去计算当前模型的位置。细心的盆友你们可以试一试,其实很简单的


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引