前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放。
大家想一想模型的旋转,实际上是镜头的旋转。模型的缩放实际上是镜头Z轴方向的坐标。那么实现本章的内容只需要控制镜头的位置方可实现。
我们在游戏场景中创建一些简单的模型做为参照物,插一句 “大家有谁知道 . FBX 的模型那里可以免费找到,我想在博文中加点游戏模型让场景更好看一些,可是苦于找不到有点郁闷,用公司的模型来写博文有觉得有点不合适”哇咔咔 ,如果有知道的哥们 不妨告诉我喔。啦啦啦。
我们创建一个简单的游戏平面, 然后平面中放一个箱子做为旋转缩放的参照物。如下图所示,选中摄像机,给摄像机添加一个脚本名称为Move. 脚本中有一个参数 Target,它的作用是设置摄像头旋转移动参照物,这里把一个箱子赋值给了 Target,那么左右滑动屏幕会发现箱子在旋转,两手缩放屏幕会发现箱子在放大与缩小。
我们看看Move这条脚本,说明一下几个重要的 :
这些方法都是系统自己调用的方法
function Start () : 游戏启动以后只调用一次,可用于脚本的初始化操作,
function Update ():Start()方法调用结束以后每一帧都会调用,可以在这里更新游戏逻辑。
function LateUpdate (): Start()方法调用结束以后每一帧都会调用,但是它是在 Update()调用完后调用。
Move.js完整代码
//用于绑定参照物对象
var target : Transform;
//缩放系数
var distance = 10.0;
//左右滑动移动速度
var xSpeed = 250.0;
var ySpeed = 120.0;
//缩放限制系数
var yMinLimit = -20;
var yMaxLimit = 80;
//摄像头的位置
var x = 0.0;
var y = 0.0;
//记录上一次手机触摸位置判断用户是在左放大还是缩小手势
private var oldPosition1 : Vector2;
private var oldPosition2 : Vector2;
//初始化游戏信息设置
function Start () {
var angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
// Make the rigid body not change rotation
if (rigidbody)
rigidbody.freezeRotation = true;
}
function Update ()
{
//判断触摸数量为单点触摸
if(Input.touchCount == 1)
{
//触摸类型为移动触摸
if(Input.GetTouch(0).phase==TouchPhase.Moved)
{
//根据触摸点计算X与Y位置
x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;
}
}
//判断触摸数量为多点触摸
if(Input.touchCount >1 )
{
//前两只手指触摸类型都为移动触摸
if(Input.GetTouch(0).phase==TouchPhase.Moved¦¦Input.GetTouch(1).phase==TouchPhase.Moved)
{
//计算出当前两点触摸点的位置
var tempPosition1 = Input.GetTouch(0).position;
var tempPosition2 = Input.GetTouch(1).position;
//函数返回真为放大,返回假为缩小
if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2))
{
//放大系数超过3以后不允许继续放大
//这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改
if(distance > 3)
{
distance -= 0.5;
}
}else
{
//缩小洗漱返回18.5后不允许继续缩小
//这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改
if(distance < 18.5)
{
distance += 0.5;
}
}
//备份上一次触摸点的位置,用于对比
oldPosition1=tempPosition1;
oldPosition2=tempPosition2;
}
}
}
//函数返回真为放大,返回假为缩小
function isEnlarge(oP1 : Vector2,oP2 : Vector2,nP1 : Vector2,nP2 : Vector2) : boolean
{
//函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势
var leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y));
var leng2 =Mathf.Sqrt((nP1.x-nP2.x)*(nP1.x-nP2.x)+(nP1.y-nP2.y)*(nP1.y-nP2.y));
if(leng1<leng2)
{
//放大手势
return true;
}else
{
//缩小手势
return false;
}
}
//Update方法一旦调用结束以后进入这里算出重置摄像机的位置
function LateUpdate () {
//target为我们绑定的箱子变量,缩放旋转的参照物
if (target) {
//重置摄像机的位置
y = ClampAngle(y, yMinLimit, yMaxLimit);
var rotation = Quaternion.Euler(y, x, 0);
var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
transform.rotation = rotation;
transform.position = position;
}
}
static function ClampAngle (angle : float, min : float, max : float) {
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
}
在Untiy3D 中运行用鼠标手势点击上看不到任何效果的,必需在iPhone真机上才可以触摸感应到效果喔 . 嘻嘻~
OK 接下来将Unity3D 导出成Xcode项目,导出的方法有谁还不会??? 我的第一篇文章有说明噢。哇咔咔~~ 然后运行项目只能在真机上运行哦。。 看看我在iPhone 上的截图。
触摸iPhone屏幕镜头旋转与缩放以后的效果,这个图确实有点不太好截,我一会把项目的源代码工程下载地址贴上来,方便大家阅读与学习,哇咔咔~~
镜头任意的旋转与缩放,还不错噢,大家快点来学习Unity3D游戏开发吧,哇咔咔~~
最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,哇咔咔~~~ 附上工程的下载地址,文件名称是zoom.unitypackage,下载完毕的盆友们双击就可以自动在Unity3D 下打开它啦。然后导出成iPhone项目就可以运行了。
今天回家装个windows 7 最近对wp7的游戏开发有点兴趣哦~ 哦也~回家钻研一下~哇咔咔
- 本文固定链接: https://www.xuanyusong.com/archives/512
- 转载请注明: 雨松MOMO于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!




松哥,这个,摄像机到物体中心的距离,好像不调啊。换个大一点的模型,比如建筑物,缩放到最大,都看不全
想找免费fbx的话只要到game798等游戏网站下载max文件,用max10开,导出fbx即可
谢谢您的提醒 嘿嘿。
有个小bug就是两个手指缩放后 抬起来的时候摄像机的角度会发生改变,缩放后如果是a角度,两个手指抬起一个后,镜头就跳到b角度了;或者是一个手指旋转再加入一个手指缩放就跳角度。
是有的时候这样不是一直这样
没什么问题吧,试试太灵敏了。有时候会缩放时候会单手指滑动,所以造成转动,个人感觉。
可能是是太灵敏了,是不是加个结尾速度缓动会好的
属性有了 不过distance需要怎么调整?默认10的话我的模型变得很大
那个属性应该是public 的 你在监测面板试图中直接该吧。
嗯 我对你的脚本做了改动,不是加在camera上而是加在了需要移动的3D模型上,效果一样~
这个不移动模型, 这是移动摄像机。。
嗯 我改成了移动模型~
怎么给脚本添加一个属性啊
新手,请假个问题,苹果的magic mouse怎么控制平移呢,没有鼠标中键
换鼠标吧,,magic mouse 非常难用,而且特别费电。。。
已改好了,多謝
不错, 加油。。
試過,很好用。但是我把maincamera 換成 arcamera 卻只能平移,而且與指撥的方向相反,無法放大縮小,想請教MOMO大大,要如何改,謝謝。
已修復了,程序沒問題,物件匯入時沒有在正中心而已。
看过,已受用。。
客气了 呵呵。
这段代码在android上能顺利运行么?我看都是Input,没有iPhontInput,应该是可以的吧?我现在没有加双点触控的那段,其他的都写了,跑起来木有反应呢?
用input吧。 iphoneinput是以前的方法 ,现在都用input了。
谢谢指教!已经试验成功了。你这个系列非常好,直观,实用,支持你!
感谢支持 蛤蛤。
请教一个问题,如何调节放大缩小的速度? 我现在把一个很大房子作为目标物体,放大缩小的速度感觉太慢了, 用什么方法可以实现放大缩小速度的 调节?谢谢你。
缩放的速度 实际上就是在修改摄像机一次移动的距离。。。
能不能具体点如何修改距离啊?你是说修改distance 的值么? 我尝试变大这个值 但是没有效果啊。
var position = rotation * Vector3(0.0, 0.0, -distance) + target.position; 是在这里控制距离么?
var position = rotation * Vector3(0.0, 0.0, -distance) target.position; 是在这里控制距离么?
momo老师,问一下u3d中如何联机调试android程序啊?比如说,触控这一块,在u3d上没法直接调试,如何让u3d像eclipse连接真机调试那样来调试触控这类无法在u3d上调试的android程序呢?
momo老师,问一下u3d中如何联机调试android程序啊?比如说,触控这一块,在u3d上没法直接调试,如何让u3d像eclipse连接真机调试那样来调试触控这类无法在u3d上调试的android程序呢?
没办法, 打log吧。。这是unity的伤。。。
直接把手机插在电脑上,在build setting里选择安卓就可以了。记得player setting里有个什么com.company.appname(大概是这么个东西)要修改一下,只要不是它默认的那个就可以
mo老师,请问如果测试这个功能,必须在mac下发布出来再装到iphone上才能进行测试操作吗?
是的, 不过你可以用标签的形式来却分 或者使用手势插件也可以。
一般项目都会禁用上下旋转 这样用户体验不好 如果想加上也很容易的。。呵呵
为啥不出个安卓的
作法都差不多呵呵 所以就没出。
雨松老师,请教一下,手指触屏旋转模型,手指滑动后模型按惯性继续旋转一定时间后再停下可以怎么实现?有什么思路么?
如果做的细的话 需要用一些物理知识了
可以具体说下么?
update(){ transform.position = Vector3.Lerp(start.position, end.position, Time.time);}试试这种方法。。
update(){transform.position = Vector3.Lerp(start.position, end.position, Time.time);}试试这种方法。。
雨松老师,想问您一个问题,如何可以确定手指在iPhone屏幕上滑动的时间?
这个可以分为两种 一种是判断是GUI中触摸的时间 另一种是判断触摸在3D某个模型中的是时间, 不过原理就是根据触摸后让它的时间一直++知道结束摸出 取到这段时间就可以了
这个可以分为两种 一种是判断是GUI中触摸的时间 另一种是判断触摸在3D某个模型中的是时间, 不过原理就是根据触摸后让它的时间一直 知道结束摸出 取到这段时间就可以了
MOMO,请教一个问题,假如镜头的位置是固定的,那么有没有别的办法实现IOS触摸屏手势控制模型的旋转与缩放?我目前的想法是直接在判断下写旋转和缩放。
当然可以的
請問要是想做像顛倒黑白 http://www.2144.cn/html/126/17026/ 這款遊戲 可以按一個按鍵就變成另一邊的人 不過我黑白的世界都是有人的 就像人跟影子那樣 假設我現在是在黑色的世界 那我只能動黑色是借的人 白色世界的人不會跟著動 當我按按鍵 我就變白色世界的人 線在白色世界的人可以動 黑色便不能動
請問我要怎麼做這樣效果 我有看可以把攝影機分割成兩個是窗 可是我想到要是我架設兩個攝影機 在選轉是那就會穿幫 請問我要怎麼做才會像那個遊戲一樣很自然的選轉過來