Unity3d游戏开发之主场景视差效果开发心得


效果图

分析

什么是视差滚动?度娘的解释:让多层背景以不同的速度移动,形成立体的运动效果。从效果图可以看出,主场景背景大致分为3层,草地、山河还有云彩,每一层的速度都不一样。接着分析,虽然度娘的解释是以速度来阐述,但用速度来计算并不合适,因为主层(即草地层)的滚动是跟随我们手指的移动,所以应该把速度转换为位移来计算。既然用位移来计算,每一层的位移不同,怎么样才能把多个层同步起来,我使用了归一化方法,把整个场景的滚动看作是0~1之间的归一化位移,每个层的滚动只需乘以各自层的最大位移。有了归一化位移来实现视差滚动,接下来就是让场景的滚动跟随手指移动,现在其实很好实现,只需要根据手指移动的距离(X方向)和主层的最大位移计算。最后要分析的就是惯性,在手指离开屏幕后场景仍将滚动一段时间,其实就是一个减速运动。(终于分析完了,人家不会分析,憋到现在已经内伤了

 )

实现

第一步,实现SetPosition()方法,通过这个方法设置归一化位置,然后将所有层移动到正确位置。

  1. public Transform[] Layers;//每个层的Transform。
  2. public float[] Offsets;//对应每个层的最大位移。
  3. int count;
  4. float location;//定义归一化位置。
  5. void Start ()
  6. {
  7. count = Layers.Length;
  8. }
  9. public void SetPosition(float position)
  10. {
  11. location = Mathf.Clamp01(position);
  12. for (int i = 0; i < count; i++)
  13. {
  14. Layers[i].localPosition = new Vector3(Offsets[i] * location ,0, 0);
  15. }
  16. }

复制代码

 
 

当location为0时显示各个层最左边的内容,为1时显示各个层最右边的内容。将各个层的根节点赋给Layers属性。如下图所示:

整体效果如下:

然后将层往左边移动直到显示最右边的内容,这个时候根节点的X坐标就是我们要的最大位移,将这个值赋给对应的Offsets(这个值为负数)。

第二步,实现手指跟随的滚动。

  1. bool dragged;
  2. float lastTouch;
  3. float dragOffset;
  4. float touchToPos;
  5. void Start ()
  6. {
  7. count = Layers.Length;
  8. dragged = false;
  9. touchToPos = 1f / Screen.width * camera.orthographicSize * 2f * camera.aspect / Mathf.Abs(Offsets[0]);
  10. }
  11. void Update ()
  12. {
  13. if (Input.GetMouseButtonDown(0))
  14. {
  15. dragged = true;
  16. lastTouch = Input.mousePosition.x;
  17. }
  18. if (Input.GetMouseButtonUp(0))
  19. {
  20. dragged = false;
  21. }
  22. if (dragged)
  23. {
  24. float currTouch = Input.mousePosition.x;
  25. dragOffset = lastTouch - currTouch;
  26. lastTouch = currTouch;
  27. dragOffset *= touchToPos;
  28. location += dragOffset;
  29. SetPosition(location);
  30. }
  31. }

复制代码

 

这段代码就是计算每次手指移动时,场景归一化位置改变量——dragOffset,并将该量与当前location相加后使用SetPosition来更新各个层。

第三步,实现惯性。更多精彩请点击【狗刨学习网

  1. bool tweened;
  2. float tweenTime;
  3. const float MaxTweenTime = 0.5f;
  4. void Start ()
  5. {
  6. count = Layers.Length;
  7. dragged = false;
  8. tweened = false;
  9. touchToPos = 1f / Screen.width * camera.orthographicSize * 2f * camera.aspect / Mathf.Abs(Offsets[0]);
  10. }
  11. void Update ()
  12. {
  13. if (Input.GetMouseButtonDown(0))
  14. {
  15. dragged = true;
  16. tweened = false;
  17. lastTouch = Input.mousePosition.x;
  18. }
  19. if (Input.GetMouseButtonUp(0))
  20. {
  21. dragged = false;
  22. tweened = true;
  23. tweenTime = 0f;
  24. }
  25. if (dragged)
  26. {
  27. ……
  28. } else if (tweened)
  29. {
  30. tweenTime += Time.deltaTime;
  31. if (tweenTime > MaxTweenTime)
  32. {
  33. tweened = false;
  34. } else
  35. {
  36. float offset = dragOffset * (1 - tweenTime / MaxTweenTime);
  37. location += offset;
  38. SetPosition(location);
  39. }
  40. }
  41. }

复制代码

这里利用到第二步中所计算的dragOffset,将最后一次计算(即手指离开屏幕前)得出的dragOffset在最大惯性时间MaxTweenTime内减为0并累加到location上,以达到减速运动的效果,而且移动的距离和手指移动的速度相关。

终于写完了,还是代码爽 

时间: 2024-08-09 03:37:25

Unity3d游戏开发之主场景视差效果开发心得的相关文章

Unity3D 游戏引擎之将场景导出XML或JSON或二进制并且解析还原场景

导出unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平移与Prefab的名称导出在XML与JSON中.然后解析刚刚导出的XML或JSON通过脚本把导出的游戏场景还原.在Unity官网上下载随便下载一个demo Project,如下图所示这是我刚刚在官网上下载的一个范例程序. 接着将层次视图中的所有游戏对象都封装成Prefab保存在资源路径中,这里注意一下如果你的Prefab绑定的脚本中有public Object 的话 ,需要在代码中

[Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3D游戏开发之从<魂斗罗>游戏说起(上)--目标追踪这篇文章后再写一篇<Unity3D游戏开发之从<魂斗罗>游戏说起(下)>,只是眼下博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享. 作为大家等待博主更新博客的回报,我们今天来说一说Unity3D中的游戏场景异步

Unity3D游戏开发之屏幕震动效果的实现

各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是http://qinyuanpei.com.今天我们来说说在Unity3D中如何实现屏幕震动效果.屏幕震动效果在某些游戏场景中,对于提升游戏的真实感有较大的帮助.比如在<水果忍者>这个游戏中,当玩家碰到炸弹的时候屏幕会出现强烈的震动效果,同时手机自身发出震动,这样就大大地增强了玩家在碰到炸弹这一瞬间的游戏体验. 再比如<Swordigo>这个游戏是博主一直比较喜欢的一款手机游戏,在这个游戏中玩家将扮演一个少年剑客,跨

Unity3D游戏开发之当游戏开发遇上Excel

各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://blog.csdn.net/qinyuanpei. 今天我们的话题是Excel,作为常用的办公软件的Excel相信大家都不陌生啦.可是如果我们认为Excel只是办公软件的话,那么这就不只是天真而是Out了.事实上Excel和游戏开发有着密切的联系,不知道大家还记不记得那款利用Excel开发出来的三国杀,这可能是Excel第一次以游戏开发的身份出现在大家面前吧.我们知道在游戏开发领域有一种工作叫做策划,就像在软件开发领

Unity3D游戏开发之如何截屏的技能培训

下面我们开始今天的Unity3D技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天我们来做点简单的东西,做个什么呢?答案就是截屏.作为一名热爱单机游戏的玩家,每次在玩游戏的同时截取游戏中比较喜欢的画面,特别是学习了Unity3D以后玩游戏的时候更多地是从一个游戏设计者的角度来看待游戏,换句话说,可能关注技术的成分更多一点吧.比如在写<Unity3D游戏开发之自由视角下的角色控制>和<

[Unity3D]Unity3D游戏开发之基于2D贴图实现血条组件的开发

各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 在上一篇文章中,我们以经典的打砖块游戏为例,讲解了一个Unity3D游戏的完整实现过程.今天呢,我们来做一个在游戏中十分重要的组成元素:血条.血条是什么呢?血条是生命值的一种体现,就像<仙剑奇侠传三>电视剧中,当景天说他想让那些被邪剑仙害死的人活过来的时候,天帝说需要等量的生命值来换,所以电视剧中的结局就变成了景天留在世上的时间并不多了,雪见依偎着他坐在新安当门口的时候,天上忽

[Unity3D]Unity3D游戏开发之继续探索NGUI

大家好,我是秦元培.欢迎大家关注我的博客.我的博客地址是blog.csdn.net/qinyuanpei. 博主近期開始研究NGUI了,但是说实话,博主感觉NGUI的东西似乎有些分散,由于网上大部分的资料都仅仅是简单地解说怎样使用NGUI,并没有从实质性的原理出发来解说NGUI的内涵,这就和我们学习.NET仅仅会拖控件是一样的.并不能把握事物内在的东西.所以,博主推荐大家从官方提供的样例入手研究NGUI.博主这几天基本上都在看NGUI的演示样例程序,自我感觉内容比較杂吧.在今天的文章中,博主将讲

[Unity3D]Unity3D游戏开发之跑酷游戏项目解说

大家好,我是秦元培.我參加了CSDN2014博客之星的评选,欢迎大家为我投票,同一时候希望在新的一年里大家能继续支持我的博客. 大家晚上好.我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.终于到了更新博客的时间.从昨天下午開始,博主開始设计一个跑酷的游戏,到晚上睡觉前这个游戏已经基本完毕. 博主今天早上七点钟就起来了,到早上十点钟终于把整个游戏写完了. 所以,今天的博客的主题就是<Unity3D游戏开发之跑酷游戏项目解说>. 从博主自身来考虑这

Unity3D游戏开发之基于Terrain Toolkit实现地形的制作

 今天继续由我为大家带来Unity3D游戏开发系列文章.今天我们来通过Terrain Toolkit来实现地形的制作.尽管Unity3D已经为我们提供了地形绘制工具,但是在实际的运用中我们发现,这个地形绘制工具并不能满足我们的要求,因为通过手动绘制这种方法来画地形的起伏缺少了自然的侵蚀感,人力雕琢的感觉过于强烈,毕竟通过人去感觉自然界地形的起伏变化是力不从心的,所以我们建议通过程序来生成地形,因此就有了我们今天的这篇文章.下面,请大家跟随我一起来学习这个插件的使用吧. 首先我们创建一个空的项