偶然在群里看到有人拿了一张椭圆物体旋转选择界面来问怎么实现(也不知道这样描述对不对,反正是椭圆的,而且还是旋转的,类似于关卡和角色选择),于是

想了下自己写了一个类似的功能,方法可能不是很完美,但是也算是一个思路吧,就当练练手熟悉unity。原图如下:

附自己完成后的效果图:

遗憾的是不会做动态图片,也不知道大神写博客是怎么弄运行代码时的动态效果图,只能附上渣渣图片了~


基本效果能够达到一致,但是只是直接移动,原本是想实现绕椭圆轨迹移动,这里不得不说,unity动作机制几乎没有,原本api就难找,自己找半天连一个move的函

数都没有,如果不去找一个插件,只能通过update每一帧去手动设置GameObject的位置来达到move的效果,原本我以为是能够像cocos那样,最起码,moveto,得有,

然后用贝塞尔模拟,可惜只能每帧刷新的话就先不写了。

一设计思路

  • 方块的摆布:

    首先需要明确的是方块的排布问题,摆布有多种方式,可以先将所有的方块保存到容器,之后按照一定的坐标差值来递增,递减这些方块的摆放位置,最后达到

    该视觉效果,只是在排列的过程中需要长时间的调试效果,因而没有采用;同时也可以按照椭圆的轨迹来摆放,根据对象容器的遍历,每次递增或递减一定角度

    达到该效果,这个方式是比较方便的,只需要根据当前角度偏移量来计算出方块对应的位置即可。当然,我们还需要考虑方块的奇偶性,在方块为奇数时,除去

    第一个显示在正中央的方块,刚好还剩下偶数个方块,左右正好排布一半,但是当方块为偶数个时,除去第一个,还会剩下最后一个方块。

    • 方块为奇数时:      该情况较为简单,除去第一个,剩下的刚好对半分成,可以这样考虑:将所有需要排布的方块Object存放到一个数组sprites里边,取size=(length+1)/2

      例如有七个方块,前边size个(四个)从中间开始往右递增排布,即保证容器前size个是顺次排布,剩下三个从中间(除去中间那个点)往左边排布。

    • 方块为偶数时:      该情况稍微复杂一点,除去第一个,再分去左右对称的,还会多出一个来,可以这样考虑:将所有方块存放到一个数组sprites里,取size=length/2

      例如有八个方块,前边size个(四个)从中间开始往右递增排布,剩下三个从中间(除去中间那个点)往左边排布,最后一个可以放到第一个的正对面。

    • 显示层级:  在cocos2dx中,子类节点都是通过挂载到父节点的形式添加到场景中,在addchild的时候提供一个zorder参数,即精灵的渲染层级,而

      unity不同,查找api找了半天,最后找到SetSiblingIndex函数,值越大越后显示,没次初始化和移动都必须重置显示层级,所以需要单独封装函数。

  • 点击按钮之后的回调

    • 向左按钮:点击向左按钮时,右边的方块同一往左移一格位置,左边的方块统一往上移一格位置,左边最后一个方块移动到右边最后一个方块
    • 向右按钮:同理。

二开始动手开发

  • 新建场景

    • 新建项目:2d,3d无所谓,这里是3d,但是要用一般是在2d,只是项目而已。
    • 添加控件:首先添加七个Image对象(控件可以是按钮,都行);添加left和right的button,摆布没有要求,随意摆放,反正都是要做排序的。
    • 如图:(这里panel是没必要的,我多加的)
  • 添加UI按椭圆顺序排布脚本
    • 新建脚本:Ellipse.cs脚本,对象绑定到Canvas对象。
    • 编写代码:  
      //保存需要排序的精灵容器public GameObject[] Sprites;public Transform centerPoint;//椭圆的中心点public float anglecheap = 25;//每个方块间的角度偏移//保存位置点private List<Vector3> location = new List<Vector3>();private float angle =270;//第一个保证是中心位置的,当前到的角度private float firstangle = 270;//记录第一个角度,用以左右对称private float r =90;//椭圆的两个弦长private float R = 150;int size = 0;//即对象数组的一半,奇数为总长度+1/2,偶数为一半<pre name="code" class="csharp">// Use this for initializationvoid Start () {//初始化sizeif (Sprites.Length % 2 == 0){size = Sprites.Length / 2;}else{size = (Sprites.Length + 1) / 2;}//排序分级显示makespriteSort();//重置渲染层级ResetDeep();}//给这些精灵排序显示void makespriteSort(){//取出椭圆的中心点Vector3 center = centerPoint.position;//判断该数组的个数奇偶性,如果是偶数,那么需要留出一个来放到对面if (Sprites.Length % 2 == 0){//右半边for (int i = 0; i < size; i++){Sprites[i].transform.position = getPosition(angle, center);//       m_rightsprite.Add(Sprites[i]);angle += anglecheap;}//第一个已经得是左边了angle = firstangle - anglecheap;//左半边for (int i = size; i < Sprites.Length-1; i++){Sprites[i].transform.position = getPosition(angle, center);angle -= anglecheap;//  m_leftsprite.Add(Sprites[i]);}//最后一个Sprites[Sprites.Length - 1].transform.position = getPosition(firstangle-180, center);// m_leftsprite.Add(Sprites[Sprites.Length - 1]);return;}//如果不是偶数,那么出去中间那个,正好正常显示else{//右半边for (int i = 0;i<size; i++){Sprites[i].transform.position = getPosition(angle, center);//    m_rightsprite.Add(Sprites[i]);angle += anglecheap;}//第一个已经得是左边了angle = firstangle - anglecheap;//左半边for (int i = size;i < Sprites.Length; i++){Sprites[i].transform.position = getPosition(angle, center);//  m_leftsprite.Add(Sprites[i]);angle -= anglecheap;}return;}}//获取当前角度的坐标Vector3 getPosition(float _angle,Vector3 _centerposition){float hudu = (_angle/180f) * Mathf.PI;float cosx = Mathf.Cos(hudu);float sinx = Mathf.Sin(hudu);float x = _centerposition.x + R * cosx;float y = _centerposition.y + r * sinx;Vector3 point = new Vector3(x, y, 0);//添加到容器保存location.Add(point);return  point;}//根据当前左右容器调整所有控件的渲染层级void ResetDeep(){dep = 0;//右半边for (int i =size-1; i>=0; i--){Sprites[i].GetComponent<Transform>().SetSiblingIndex(dep);dep++;}dep = 0;//左半边for (int i = Sprites.Length - 1; i >=size; i--){Sprites[i].GetComponent<Transform>().SetSiblingIndex(dep);dep++;}}

      运行后可以看到如图效果(不要忘了把这几个对象拖到脚本里,中心点是传入的对象,所以有一个位置要摆好,摆在想要的中心点中,也可以自己改成手动输入x,y,z):

unity3d5.1物体椭圆旋转选择界面实现(一)相关推荐

  1. 力改变物体形状举例_对旋转问题的思考-在离心力确定的情况下,物体的旋转情况如何通过宇宙中的相对运动情况和质量分布确定?...

    旋转会产生离心力,因此可以通过对加速度的测定完成对物体旋转情况的测定.这是一种众所周知的测定旋转的方式, 我把它描述成第一种旋转确定方式,即定义式的确定方式. 可是小伙伴们会问了:如果没有测力器,如何 ...

  2. js实现椭圆轨迹_【CSON原创】javascript椭圆旋转相册发布

    功能说明: 1.支持自动和手动两种模式:自动模式下自动旋转展示,手动模式下通过鼠标选择当前图片,或通过提供的接口选择上一张/下一张图片. 2.可自行添加旋转的缓动模式,默认模式为:匀速,先快后慢,先慢 ...

  3. 一些界面库比较以及如何选择界面库

    记得很早的时候看了一个哥们写的界面库的使用历程,当时还挺有感触的,不断地尝试,不断地被坑,最后有两条结论: 1.自己积累界面库: 2.买就买贵的.好的,并且提前根据自己需要协商好. 今天又重看关于界面 ...

  4. Screen返回选择界面的问题

    自己写的Report,用到了自己定义的Screen,如何在任何一个Screen直接返回选择界面(1000)? 可以用:      SET SCREEN 0.               LEAVE S ...

  5. 在Cocos2d中实现能够惯性拖动的选择界面

    苹果的应用讲究用户体验 有的时候仔细想想 的确,很多细节决定了用户体验 比如说惯性拖动 可以说之前没有任何一家厂商能把触摸惯性拖动做的像苹果的UI那么流畅 Cocos2D中实现能够惯性拖动的选择界面 ...

  6. java 3d文字旋转_3d多物体点旋转

    package com.ddd {importflash.display.Sprite;importflash.display.StageScaleMode;importflash.events.Ev ...

  7. 双系统不显示系统选择界面

    当windows+ubuntu安装在同一个硬盘,使用boot menu可以分别进入window和ubuntu系统,而开机没有显示系统选择界面时,可以使用以下方法解决: 方法一.开机摁Delete键进入 ...

  8. android 圆动画效果,Android实现任意绕圆或椭圆旋转的动画——SatelliteAnimator使用介绍...

    话说实习也就快一个月了,虽然没干什么活,但是这几天总算是有一些可以写的东西. 代码中应该还存在很多问题要修改,大神们请赐教,不胜感激. 开始正题. 关于Android实现任意绕圆或椭圆旋转动画,我称之 ...

  9. 双系统装完只能u盘启动_u盘装双系统开机没有系统选择界面怎么解决

    u盘装双系统开机没有系统选择界面怎么解决?现如今,使用u盘安装双系统已经是一件很常见的事情了,但是最近却有用户用u盘装win7+win8双系统的时候遇到了这样的情况,安装完win7系统后,进行win8 ...

最新文章

  1. C/Cpp / 设计模式 / 单例模式(线程安全)
  2. UI上search 的drop down list是怎么实现的
  3. NodeJS解决跨域问题:Access-Control-Allow-Origin
  4. python 二进制数 转字符串_Python二进制串转换为通用字符串的方法
  5. 汽车辐射监测系统-Qt开发
  6. 再看经典推荐算法之召回算法
  7. JS实现将文件和base64的相互转换
  8. 区块链:5、匿名性和隐私性
  9. 带温度补偿RTC芯片的选型和应用
  10. 如何判断关系是否自反,反自反,对称,反对称,传递
  11. 一份个人计算机能力研修总结,计算机 个人研修总结
  12. Retrofit 使用 DELETE 方式
  13. 利率浮动幅度bp什么意思,浮动利率bps换算百分比
  14. 2022年全球与中国湿钽电容器行业发展趋势及投资战略分析报告
  15. CSDN博客大神汇总
  16. pandas 中上下两行相减(隔行相减) -- shift函数的使用
  17. 用HTML+CSS做一个漂亮简单的节日网页【元宵节】
  18. 你知道自己究竟“想要”什么,又该如何“做到”吗?--《认知觉醒》读书笔记
  19. 中国大陆网站TOP100
  20. Android button背景设置透明色和样式

热门文章

  1. 面试回答,JVM内存模型/内存空间:运行时数据区
  2. Nginx 动态添加IP黑名单
  3. 【干货书】Python中的商业分析概念、技术和应用的数据挖掘
  4. SQL必知必会1 查询部分 P1-P129
  5. oracle缺少有右括号,oracle ORA-00907错误:缺少右括号
  6. 2021年岳阳市一中高考成绩查询,湖南岳阳的4所最强高中,2020年高考成绩抢眼,岳阳市一中领先...
  7. HTML5期末大作业:官网时尚购物(网站设计——美丽说官网时尚购物(1页) HTML+CSS+JavaScript 网页设计成品DW静态网页Html5响应式css3
  8. List集合遍历for循环优化
  9. 网站收录和网站索引的技巧有哪些
  10. 十个Google关键词分析工具