纳金网

标题: unity3d在android设备上通过点击选择物体的方法 [打印本页]

作者: paopao    时间: 2013-2-27 11:13
标题: unity3d在android设备上通过点击选择物体的方法
最进一直在学习UNITY3D的Android平台的开发,发现一些在PC平台下可以用的函数在Android开发是是不可以用的。主要是因为输入设备的不同,比如我们用W,A,S,D控制物体移动,在Android平台上就不可以这么写。应为他没用键盘设备。惊天我们就看下在Android平添下怎么通过点击屏幕来选择物体的。我们都知道在pc平台选择一个物体时非常简单的。只要给物体添加一个碰撞组件。然后就可以用OnMouseDown,OnMouseEnter,OnMouseExit等函数可以使用,比如我们想要点击一个物体让物体改变颜色。代码应该如下。var mouseOverColor = Color.blue;//声明变量为蓝色private var originalColor : Color;//声明变量存储本来颜色var a:int;function Start () {    originalColor = renderer.sharedMaterial.color;//开始时得到物体本来着色    a=-1;} function OnMouseDown () {a=-a;if(a==1){        renderer.material.color = mouseOverColor;//当鼠标滑过时改变物体颜色为蓝色}If(a==-1){renderer.material.color = originalColor;//物体恢复本来颜色 }}这段代码实现的功能是当我们点击一个物体时物体的颜色变成蓝色,在点击一下又恢复本来的颜色。但是当我们将这段代码发布到Android平台是他是不执行的,Android平台不支持OnMouseDown ()这个函数,那么我们应该怎么写呢。   通过测试发现Input.GetMouseButtonDown(0)这个函数还是可以用的,当点击屏幕时这个函数就会执行,好吧就用它吧。设想是这样的,当点击屏幕是从你点击的点向前发射一条射线,当射线碰撞到我们的物体时改变他的颜色。   代码如下。var mouseOverColor = Color.blue;//声明变量为蓝色private var originalColor : Color;//声明变量存储本来颜色var a:int;function Start () {    originalColor = renderer.sharedMaterial.color;//开始时得到物体本来着色    a=-1;} function Update () {     if(Input.GetMouseButtonDown(0))//点击屏幕是执行     {         var ray:Ray=cam.ScreenPointToRay(Input.mousePosition);//定义射线            var hit:RaycastHit;            if (Physics.Raycast(ray,hit))//射线发生碰创是执行            {                    a=-a;              if(a==1)                {             renderer.material.color = mouseOverColor;//当鼠标滑过时改变物体颜色为蓝色                      }              if(a==-1)                      {renderer.material.color = originalColor;//物体恢复本来颜色                      }                  }测试代码发现有bug点击其他带有碰创器的物体时物体的颜色也会发生变化。要解决这个问题就要判断与射线发生碰撞的物体。代码修改如下:var mouseOverColor = Color.blue;//声明变量为蓝色private var originalColor : Color;//声明变量存储本来颜色var a:int;var onClickName:String;//定义一个字符串用来存储物体的标签;function Start () {    originalColor = renderer.sharedMaterial.color;//开始时得到物体本来着色    a=-1;} function Update () {     if(Input.GetMouseButtonDown(0))//点击屏幕是执行     {         var ray:Ray=cam.ScreenPointToRay(Input.mousePosition);//定义射线            var hit:RaycastHit;            if (Physics.Raycast(ray,hit))//射线发生碰创是执行            {//将被碰创的物体的标签存储到onClickName里面        onClickName=hit.transform.tag;   //如果onClickName与我们需要改变颜色的物体标签一至,执行下面的代码 if(onClickName=="guimen1"){                    a=-a;              if(a==1)                {             renderer.material.color = mouseOverColor;//当鼠标滑过时改变物体颜色为蓝色                      }              if(a==-1)                      {renderer.material.color = originalColor;//物体恢复本来颜色                      }}                  }测试代码,发现OK 与我们想要的效果一致;
作者: 艾西格亚    时间: 2013-2-27 13:08
感谢分享技术文章给大家学习!

作者: 王者再临    时间: 2013-2-28 01:34
通过测试发现Input.GetMouseButtonDown(0)这个函数还是可以用的,当点击屏幕时这个函数就会执行,好吧就用它吧。设想是这样的,当点击屏幕是从你点击的点向前发射一条射线,当射线碰撞到我们的物体时改变他的颜色。

这里的解释有些不明白,,为啥是用射线来处理这个效果?能否多些描述?

作者: 小刀    时间: 2013-3-1 11:49
很好的,多谢分享,楼主无私
作者: Sora    时间: 2013-3-20 19:21
好文章支持 感謝分享

作者: HIDEOKOJIMA    时间: 2013-11-22 21:28
THanks for sharing !
作者: zhangfr    时间: 2013-11-22 22:03
楼主格式乱了啊 看起来挺费劲 不过感谢分享啊
作者: 1547373072    时间: 2014-6-16 18:41
同感楼上。




欢迎光临 纳金网 (http://www.narkii.com/club/) Powered by Discuz! X2.5