需求

这几天在公司里,项目需要将游戏游戏中的2D城堡界面在拉动的时候显示出3D的拉近效果。当时是在Cocos2d-x下实现的。回家的时候自己重新用Unity实现的了一遍。

虽然现在Unity已经到了5.0时代,从4.6时代起Unity就开始支持原生2D了,网络上大部分的教程还是NGUI。毕竟原生的也是开源的,详细以后也会慢慢取代NGUI。

解决思路

需要在拉动的过程中显示出由远及近不通层次的效果,自然想到了利用Scroll类型的控件。Unity中原生2D中使用到的时ScrollRect组件。

在Canvas中,我新建了一个ScrollRect。修改名字为ScrollView。ScrollRect的使用十分的简单,Content与滚动内容进行关联后就可以直接使用。Horizontal,Vertical设置十分允许在水平、垂直方向滚动。MovementType可以设置3中滚动类型。Inertia可以控制是否在拖动结束后继续惯性滑行一段距离。具体参数说明Unity官方有详细的API资料。

创建ScrollView成功之后,添加了需要滚动的控件。我要做的是在ScrollRect滚动的时候,根据滚动的情况对其内部控件进行缩放。

在insparcter面板的右下角同时列出了ScrollRect在运用工程中可以使用的控件。

我需要在拖动的时候进行操作,这里就需要用到OnDrag事件。

 using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections; public class BackgroundManager : MonoBehaviour,IDragHandler
{
ScrollRect scrollRect;
RectTransform content; public float startNum = 263f;
public float scaleArg1 = 0.5f;
public float scaleArg2 = 0.2f;
public float scaleArg3 = 0.1f; public GameObject top;
public GameObject middle;
public GameObject buttom; void Start ()
{
scrollRect = gameObject.GetComponent<ScrollRect> () as ScrollRect;
content = scrollRect.content; }
public void OnDrag (PointerEventData data)
{
//Debug.Log (content.position);
float changeScale1 = GetChangeScale (content.position.y, );
float changeScale2 = GetChangeScale (content.position.y, );
float changeScale3 = GetChangeScale (content.position.y, );
buttom.gameObject.transform.localScale =
new Vector3 (changeScale1, changeScale1, );
middle.gameObject.transform.localScale =
new Vector3 (changeScale2, changeScale2, );
top.gameObject.transform.localScale =
new Vector3 (changeScale3, changeScale3, );
} float GetChangeScale (float changeCondition, int position)
{
float changeScale = 1f;
switch (position) {
case :
changeScale = + Mathf.Sin ((startNum - changeCondition) * Mathf.PI / ) * scaleArg1;
break;
case :
changeScale = + Mathf.Sin ((startNum - changeCondition) * Mathf.PI / ) * scaleArg2;
break;
case :
changeScale = + Mathf.Sin ((startNum - changeCondition) * Mathf.PI / ) * scaleArg3;
break;
default:
changeScale = + Mathf.Sin ((startNum - changeCondition) * Mathf.PI / );
break;
} return changeScale;
} }

我这里只由于只使用到OnDrag,所以只继承了IDragHander接口。

将写好的脚本添加到ScrollRect中,初始化运行后就可以看到效果了。

扩展

使用到了滚动层,在实际的应用中自然少不了遮罩的问题。在之前的博文中,我有写到了文字跑马灯的实现。其实可以直接使用ScrollRect+遮罩的方式进行实现。

原生2D中的Mash可以很方便的实现。在Mash中添加Image可以控制Mash的样式。

也可以设置Image的Source Image自定义遮罩的形状。

结论

原生的ScrollRect用起来还是比较方便的,游戏开发中道具的展示,场景的切换控制都常需要用到。

有需要的朋友可以下载源代码自己运行:下载

博客地址: http://www.cnblogs.com/nightcat/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如文中有不妥或者错误的地方还望高手的指出,以免误人子弟。如果觉得本文对您有所帮助请【推荐】一下!如果你有更好的建议,不妨留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。

Unity3D UGUI中ScrollRect的一些知识点的更多相关文章

  1. 【转】unity3d 在UGUI中制作自适应调整大小的滚动布局控件

    转自 http://blog.csdn.net/rcfalcon/article/details/43459387 在游戏中,我们很多地方需要用到scroll content的概念:我们需要一个容器, ...

  2. unity3d 在UGUI中制作自适应调整大小的滚动布局控件

    http://blog.csdn.net/rcfalcon/article/details/43459387 在游戏中,我们很多地方需要用到scroll content的概念:我们需要一个容器,能够指 ...

  3. Unity3D UGUI之ScrollView弹簧效果

    unity3d版本5.3.2p4 UGUI中ScrollView包含Viewport(Content) ScrollView包含脚本.其Movement Type一共3个选项.Elastic就是弹簧效 ...

  4. Unity3d UGUI 通用Confirm确认对话框实现(Inventory Pro学习总结)

    背景 曾几何时,在Winform中,使用MessageBox对话框是如此happy,后来还有人封装了可以选择各种图标和带隐藏详情的MessageBox,现在Unity3d UGui就没有了这样的好事情 ...

  5. ugui中toggle.isOn的属性笔记

    准备知识 toggle:指unity3d引擎中UGUI的 toggle组件 (单选框) 本文使用lua语言描述 事件触发 使用unity的ugui,你如果细心观察会发现toggle在界面被关闭/隐藏( ...

  6. Unity3D - UGUI的手动搭建

    了解UGUI组件的搭建方式,有助于搭建我们自己的UI界面. Text 文本 text 是UGUI中的基本控件,在Hierarchyi面板创建一个空物体 - 给这个空物体添加一个Text组件即可实现与t ...

  7. 在Unity3D 4中关联Visual Studio 2012来编写C#

    Unity3D自带的MonoDevelop编辑器无论是js还是c#代码提示都很差,很诡异的就是变量名和方法名有的时候提示有的时候不提示.不过用Visual Studio代替MonoDevelop这个问 ...

  8. iOS开发中关于UIImage的知识点总结

    UIImage是iOS中层级比较高的一个用来加载和绘制图像的一个类,更底层的类还有 CGImage,以及iOS5.0以后新增加的CIImage.今天我们主要聊一聊UIImage的三个属性: image ...

  9. Unity3d IOS中的IGUI控件

    Unity3d IOS中的IGUI控件 @灰太龙  群63438968 我讲一下IOS中用的UI,我们采用IGUI,需要使用IGUI的高版本,在Unity3d 4.2中也可以使用的! 之前IGUI有个 ...

随机推荐

  1. XNote Ver:0.79

    隐藏主窗后,双击小图标显示主窗. 支持拖拉网页文字到小图标上,直接在当前项目上创建下级资料项目. 项目分类限50个汉字.

  2. 数据库配置文件 conf.properties

    #数据库配置 #mysql hibernate.dialect =org.hibernate.dialect.MySQLDialect jdbc.driverClassName =com.mysql. ...

  3. git的使用(二)

    1.几个概念 (1)工作区指当前编辑代码的地方,是.git仓库所在的文件夹. (2)暂存区是一个概念,并不存在这个区. (3)仓库是.git文件夹,是运行git init命令时自动创建的,默认是隐藏的 ...

  4. 【温故而知新-Javascript】对象

    1 创建对象 Javascript 支持对象的概率.有多种方法可以用来创建对象. <!DOCTYPE html> <html lang="en"> < ...

  5. IOS Orientation, 想怎么转就怎么转~~~

    此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. 博客: http://www.cnblogs.com/jhzhu 邮箱: ...

  6. hihoCoder #1388 : Periodic Signal ( 2016 acm 北京网络赛 F题)

    时间限制:5000ms 单点时限:5000ms 内存限制:256MB 描述 Profess X is an expert in signal processing. He has a device w ...

  7. C# 使用NLog记录日志

    NLog是一个记录日志组件,和log4net一样被广泛使用,它可以将日志保存到文本文件.CSV.控制台.VS调试窗口.数据库等.最近刚用到这个组件,觉得不错,水一篇. 下载 通过Nuget安装NLog ...

  8. NYOJ-93汉诺塔(三)

    汉诺塔(三) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度 ...

  9. HDU 1565 最大点权独立集

    首先要明白图论的几个定义: 点覆盖.最小点覆盖: 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是“点” 覆盖了所有“边”.. 最小点覆盖(minimum vertex covering ...

  10. 只有 DBA 才能导入由其他 DBA 导出的文件

    两句话搞定问题: grant dba to testuser ; 如果还不行,再执行: alter user  testuser default role DBA: