【Uniy3d之EnhanceScollView选择角色3D循环滚动效果实现】

一、需求

  1. 呈现3D效果(2D素材)选择角色效果
  2. 滚动保证层级,缩放比例,间距正常跟随
  3. 循环滚动
  4. 这个界面需求一般也会有游戏会采用(貌似有挺多)

二、核心实现

实现技术关键点

  1. 如何控制每个Item之间的间隔(位置),缩放比例,差值平滑
  2. 如何实现item层级关系正确显示(“离” 屏幕近的层级高)
  3. 如何实现循环滚动

下面一一讲述当前Demo采用的方法
说到实现的核心,需要知道Unity3D中提供的一个叫做AnimationCurve的组件,这个不仅仅是表面上美术可以使用的组件,也不只是单纯的动画曲线的概念,当然它就是动画曲线,但是我们可以赋予AnimationCurve不同的意义,则可以借助Curve实现不同的功能,(AnimationCurve定义了一个变化趋势或者曲线,在不同的时间点,我们可以得到当前时间点下该曲线对应的y轴信息,这个信息可以是角色跳跃的高度,模型缩放的一个系数,摄像机距离目标的长度,一个角色当前的心情数值等等,曲线可以表示很多的意义)
没用过AnimationCurve的朋友,直接去官网看下介绍就明白如何使用
下面简单说下使用AnimationCurve可以完成的一些功能(上面已经介绍了一部分场景)

  1. 角色2D跳跃
  2. 摄像机移动
  3. 角色心情指数
  4. 缩放系数
  5. 距离系数

我们也赋予AnimationCurve不同的意义,实现我们核心目标(控制位移,控制缩放 当然也可以控制层级)

控制位移,缩放(3D效果的关键),差值过度动画平滑

  1. 创建两个AnimationCurve一个是scaleAnimationCurve和positionXAnimationCurve,分别控制缩放和位移
  2. 时间流水线控制(我们把所有的Item设置好自己对应的时间流位置即可,每次只要一动时间流水线,然后从两个曲线内获得当前流水线对应的缩放系数,位移系数,然后设置item的位移和缩放即可)
    3.如何制作动画(这个其实就是简单的时间流水线的差值处理,一定时间时间流水值达到目标值即可)
    下面放上两张曲线截图和具体实现:

缩放曲线,控制缩放
在这里插入图片描述

位移曲线,控制item的位移
在这里插入图片描述

"depth"曲线,用来控制item的层级关系
在这里插入图片描述

    /// 
    /// 缩放曲线模拟当前缩放值
    /// 
    private float GetScaleValue(float sliderValue, float added)
    {
        float scaleValue = scaleCurve.Evaluate(sliderValue + added);
        return scaleValue;
    }
    /// 
    /// 位置曲线模拟当前x轴位置
    /// 
    private float GetXPosValue(float sliderValue, float added)
    {
        float evaluateValue = positionCurve.Evaluate(sliderValue + added) * posCurveFactor;
        return evaluateValue;
    }

    public void UpdateEnhanceScrollView(float fValue)
    {
        for (int i = 0; i < listEnhanceItems.Count; i++)
        {
            EnhanceItem itemScript = listEnhanceItems[i];
            float xValue = GetXPosValue(fValue, itemScript.CenterOffSet);
            float scaleValue = GetScaleValue(fValue, itemScript.CenterOffSet);
            float depthValue = depthCurve.Evaluate(fValue + itemScript.CenterOffSet);
            itemScript.UpdateScrollViewItems(xValue, -depthValue * depthFactor, yFixedPositionValue, scaleValue);
        }
    }
    void Update()
    {
        if (enableLerpTween)
            TweenViewToTarget();
    }

    private void TweenViewToTarget()
    {
        mCurrentDuration += Time.deltaTime;
        if (mCurrentDuration > lerpDuration)
            mCurrentDuration = lerpDuration;

        float percent = mCurrentDuration / lerpDuration;
        float value = Mathf.Lerp(originHorizontalValue, curHorizontalValue, percent);
        UpdateEnhanceScrollView(value);
        if (mCurrentDuration >= lerpDuration)
        {
            canChangeItem = true;
            enableLerpTween = false;
            OnTweenOver();
        }
    }

控制层级

只有正确的层级控制,才能够保证"不穿帮",上文也说过,也可以通过AnimationCurve做一个层级曲线,在当前item的时间下面该item的depth或者层级应该是多少,该demo采用的是比较粗暴的list排序方法,按照每个item距离"屏幕的远近"其实就是scale系数,判断哪个item在前,哪个在后面,当然也有些问题,如果距离相同,可能存在item相互打架的可能(这个可以通过控制scaleCurve进行控制)
该Demo使用的UITexture控制层级(其他的任何方式原理一样,只是处理对象不一样,用mesh实现,那就是z轴等等)
Demo项目已经采用AnimationCurve来管理层级直接根据当前曲线值设置对应的depth或者z轴数值即可
具体实现如下:

    // Set the item "depth" 2d or 3d
    protected override void SetItemDepth(float depthValue)
    {
        if (mTexture.depth != (int)Mathf.Abs(depthValue))
            mTexture.depth = (int)Mathf.Abs(depthValue);
    }

实现滚动循环

说道循环滚动,因为我们使用到了AnimationCurve,先天性的动画曲线会有三种模式一种是pingpong,loop,一种是clamp,其中我们需要的是LOOP,没听错,**这就是滚动循环的关键点(我们的缩放曲线,位移系数曲线从0到1的效果模拟完毕,如果我们继续向前增加时间流水值,那么进入到下一个曲线的时候,所有的item都会反过来进行采样曲线值,就能够巧妙的实现循环效果(缩放系数,位移系数))**如果不理解的,可以自己设置一个AnimationCurve,研究下,下面截图示意:

代码部分只是需要知道,如果点击了一个Item将该item移动到中心对应的时间流应该往前或者往后走多少

    /// 
    /// 获得当前要移动到中心的Item需要移动的factor间隔数
    /// 
    private int GetMoveCurveFactorCount(float targetXPos)
    {
        int centerIndex = scrollViewItems.Count / 2;
        for (int i = 0; i < scrollViewItems.Count;i++ )
        {
            float factor = (0.5f - dFactor * (centerIndex - i));
            float tempPosX = positionCurve.Evaluate(factor) * posCurveFactor;
            if (Mathf.Abs(targetXPos - tempPosX) < 0.01f)
                return Mathf.Abs(i - centerIndex);
        }
        return -1;
    }

三、注意问题

  1. 制作曲线,记得保证0-1时间轴填充完毕,这样在进行循环处理的时候才不会出现偏差
  2. 额,如果自己用这种方法尝试的朋友,如果有问题,请仔细查看Demo中的参数即可…(主要就是曲线制作问题)

该Demo使用的NGUI,虽然笔者没有用过UGUI,我想任何一个界面Tools都可以通过该方法实现,因为共同点一样,只是层级处理,缩放处理有区别而已

四、实现效果在这里插入图片描述

五、改进目标

该项目还有许多需要改进的地方,以后花时间继续完善

  • 支持Editor模式下的编辑,不用运行即可查看效果(这个应该是最关键的功能)
  • 支持偶数个Item进行滑动
  • 支持Drag操作
  • 支持和NGUI类似的DragScrollView和CenterOnChild功能
  • 优化每个Item的层级设置算法效率
  • 优化更新每个Item位置,缩放算法效率

##六、 2016.9.26更新

  1. 支持偶数个对象逻辑
  2. Drag操作
  3. 支持点击recenter和滑动recenter功能
  4. 层级算法更新,修改成自定义曲线,灵活控制"层级"
  5. 缩放曲线更新,解决由于误差造成持续滑动造成的显示错误
  6. 支持UGUI,添加UGUI案例

七、工程地址

https://github.com/tinyantstudio/EnhancedScrollView

更新的实现代码,不在本博客中更新,只介绍实现原理,具体的实现,请跳转到github查看,谢谢


八、总结

所有的内容都讲述完毕,如果这篇文章能够帮助到您获得对看到结束的朋友有一个简单的启发,请支持下~,文中存在错误或者描述不清楚的也请指正,共同交流学习,最好的方法就是直接下载Demo,然后看下逻辑和动画曲线的设置参数。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要下载Unity滑动效果插件,需要遵循以下步骤: 1. 打开一个可靠的资源网站,比如Unity Asset Store、Github等,确保能够安全和合法地下载插件。 2. 在资源网站的搜索栏中输入关键词“滑动效果插件”或具体的插件名称。 3. 得出搜索结果后,阅读插件的描述、评级和用户评论等信息,以便判断是否满足你的需求。 4. 确认插件后,点击相应的下载按钮或链接。 5. 根据网站的指示和要求,可能需要进行注册并提供相关信息,以便完成插件的下载和安装。 6. 下载完成后,双击插件文件或选择导入插件的方式将其添加到Unity项目中。 7. 在Unity编辑器中,根据插件的文档和指示,使用相应的代码或UI元素将滑动效果应用到场景中的对象上。 8. 调试和调整滑动效果,确保其在游戏或应用中的表现符合预期。 9. 如果遇到问题或需要进一步的指导,可以查阅插件的文档、教程或寻求社区的帮助。 总结起来,下载Unity滑动效果插件的步骤包括搜索、选择、下载、安装、应用和调试。通过正确的流程和谨慎的选择,可以方便地获得所需的插件并增强Unity项目的滑动效果。 ### 回答2: Unity是一款功能强大的跨平台游戏开发引擎,它提供了各种各样的插件和扩展来帮助开发者实现各种效果。针对滑动效果,Unity的Asset Store中有很多滑动效果插件可以下载使用。 其中一个比较受欢迎的插件是"Mobile Swipe Menu"。这个插件提供了一个简单易用的界面,可以快速实现滑动菜单的效果。开发者只需将插件导入Unity项目中,在场景中放置好滑动菜单的UI元素,然后调用相应的API即可实现滑动效果。插件还提供了丰富的配置项,可以自定义滑动的方向、速度以及结束位置等。 另外一个插件是"DoozyUI: Complete UI Management System"。这个插件不仅支持滑动效果,还提供了更多的功能。它包含了各种UI元素的管理器,可以轻松地创建和管理复杂的UI界面。开发者可以使用插件提供的可视化编辑器来自定义滑动效果,并且可以在场景中预览效果。插件还支持多平台适配,开发者可以在不同的设备上实现一致的滑动效果。 除了这两个插件,还有许多其他的滑动效果插件可供选择。开发者可以在Unity的Asset Store中搜索"滑动效果"等关键词,浏览并下载适合自己项目需求的插件。 总之,Unity提供了许多滑动效果插件供开发者使用。这些插件可以帮助开发者快速实现滑动效果,提高开发效率,同时还可根据项目需求进行自定义和调整。 ### 回答3: Unity中的滑动效果插件有很多种,可以根据不同的需求选择合适的插件进行下载使用。以下是几款常用的Unity滑动效果插件: 1. EasyTouch:EasyTouch是一个功能强大且易于使用的滑动效果插件。它可以在Unity中实现触控、手势、摇杆等多种交互效果,适用于2D和3D场景。你可以在Unity Asset Store中搜索并下载它。 2. TouchKit:TouchKit是一个专门为移动设备设计的滑动效果插件,它为Unity开发者提供了一套简单易用的触控解决方案。使用TouchKit,你可以轻松实现触摸、滑动、拖拽等交互效果。 3. FingerGestures:FingerGestures是一个高度自定义的滑动效果插件,它提供了强大的手势识别功能,可以轻松地实现滑动、缩放、旋转等多种触摸交互效果。你可以在Unity官方Asset Store中找到并下载。 4. LeanTouch:LeanTouch是一个免费且易于使用的滑动效果插件,它提供了一套简单而强大的触摸解决方案。LeanTouch支持多点触摸、拖拽、旋转、缩放等多种交互效果,并可以方便地集成到你的Unity项目中。 无论你选择哪种滑动效果插件,都可以在Unity Asset Store中找到并下载。根据你的需求和项目要求,选择合适的插件并按照它们的说明进行安装和使用即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值