服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity实现ScrollView滑动吸附功能

Unity实现ScrollView滑动吸附功能

2022-10-10 15:26INoriEGOIST C#

这篇文章主要为大家详细介绍了Unity实现ScrollView滑动吸附功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了Unity实现ScrollView滑动吸附的具体代码,供大家参考。

最近在做一个展示模块的时候遇到了一个需要实现滑动窗口并且能固定吸附距离的需求,借助UGUI的ScrollView的API以及Dotween实现了这个功能。主要核心逻辑就是检测Content节点的RectTransform的localPosX的移动距离然后继承实现OnDrag几个接口来完成拖动再松开自动吸附到具体的位置。具体效果如下

Unity实现ScrollView滑动吸附功能

另外说一下有几个ScrollView自带的API需要设置一下,一个事Movement Type设置成Unrestricted,以及关闭Inertia,这样才能关闭ScrollView自带的最大距离移动控制不会导致在松手吸附过程中因为拖动距离大于了左右两边限制而最终的移动结束的坐标位置不对。

Unity实现ScrollView滑动吸附功能

下面贴一下代码,脚本直接附在Content物体上既可。

Tip:代码里的450 225是一个子物体宽度的加上content的Space距离,我演示的工程师一个Image420的宽度 30的HorLayout Space,225则是这个距离/2,可以根据具体需求去改变由于只是为了出个DEMO就没有写成变量

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
using DG.Tweening.Core.Easing;
using UnityEngine.Experimental.UIElements;

public class ScorllViewAutoHandler : MonoBehaviour, IEndDragHandler, IBeginDragHandler, IDragHandler
{
private GameObject Scroll;
private ScrollRect sc;
private float OriginPosX;
private float offsetX;
private int CurIndex;
private bool isDragging = false;
private bool TimerFlag = false;
private float Timer;
// Start is called before the first frame update
void Start()
{
CurIndex = 0;
Scroll = this.gameObject;
sc = Scroll.transform.parent.transform.parent.gameObject.GetComponent<ScrollRect>();
}
public void OnEndDrag(PointerEventData eventData)
{
int tempIndex=0;
sc.OnEndDrag(eventData);
offsetX = this.transform.localPosition.x - OriginPosX;
if (Mathf.Abs(offsetX) % 450 < 225)
{
tempIndex = (int)(Mathf.Abs(offsetX) / 450);
int _TempTargetIndex = 0;
if (offsetX <0)
{
_TempTargetIndex = CurIndex + tempIndex;
}
else
{
_TempTargetIndex = CurIndex - tempIndex;
}
if (_TempTargetIndex >= 0 && _TempTargetIndex <= Scroll.transform.childCount - 1)
{
_TempTargetIndex = _TempTargetIndex;
}
else if (_TempTargetIndex < 0)
{
_TempTargetIndex = 0;
}
else
{
_TempTargetIndex = Scroll.transform.childCount - 1;
}
Debug.LogError("本次位移目标" + _TempTargetIndex + "初始" + CurIndex);
this.transform.DOLocalMoveX(_TempTargetIndex*450, 0.5f).SetEase(Ease.OutBack);
}
else
{
tempIndex = (int)(Mathf.Abs(offsetX) / 450);
tempIndex += 1;
int _TempTargetIndex = 0;
if (offsetX < 0)
{
_TempTargetIndex = CurIndex + tempIndex;
}
else
{
_TempTargetIndex = CurIndex - tempIndex;
}
if (_TempTargetIndex >= 0 && _TempTargetIndex <= Scroll.transform.childCount - 1)
{
_TempTargetIndex = _TempTargetIndex;
}
else if (_TempTargetIndex < 0)
{
_TempTargetIndex = 0;
}
else
{
_TempTargetIndex = Scroll.transform.childCount - 1;
}
Debug.LogError("本次位移目标" + _TempTargetIndex + "初始" + CurIndex);
this.transform.DOLocalMoveX(_TempTargetIndex*450, 0.5f).SetEase(Ease.OutBack);
}
}

public void OnBeginDrag(PointerEventData eventData)
{
sc.OnBeginDrag(eventData);
OriginPosX = this.transform.localPosition.x;
CurIndex = (int)(Mathf.Abs(this.transform.localPosition.x) / 450);
offsetX = 0;
//当鼠标在A对象按下并开始拖拽时 A对象响应此事件
// 此事件在OnInitializePotentialDrag之后响应 OnDrag之前响应
//Debug.Log("OnBeginDrag " );
}

public void OnDrag(PointerEventData eventData)
{
sc.OnDrag(eventData);
//Debug.LogError("Dragging" );
}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/wispy0206/article/details/108827309

延伸 · 阅读

精彩推荐
  • C#C#批量插入数据到Sqlserver中的三种方式

    C#批量插入数据到Sqlserver中的三种方式

    这篇文章主要为大家详细介绍了C#批量插入数据到Sqlserver中的三种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    邹琼俊11232021-12-14
  • C#unity自定义弹出框功能

    unity自定义弹出框功能

    这篇文章主要为大家详细介绍了unity自定义弹出框功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    无名之士7822022-08-09
  • C#C#编程获取资源文件中图片的方法

    C#编程获取资源文件中图片的方法

    这篇文章主要介绍了C#编程获取资源文件中图片的方法,涉及C#针对项目中资源文件操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    我心依旧11962021-10-22
  • C#C#实现的文件上传下载工具类完整实例【上传文件自动命名】

    C#实现的文件上传下载工具类完整实例【上传文件自动命名】

    这篇文章主要介绍了C#实现的文件上传下载工具类,结合完整实例形式分析了C#操作文件上传与下载功能,并且还可针对上传文件自动命名以避免服务器中的文...

    jianyuerensheng6182022-02-12
  • C#浅谈c#表达式树Expression简单类型比较demo

    浅谈c#表达式树Expression简单类型比较demo

    下面小编就为大家带来一篇浅谈c#表达式树Expression简单类型比较demo。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网11092021-12-24
  • C#C#中DataGridView常用操作实例小结

    C#中DataGridView常用操作实例小结

    这篇文章主要介绍了C#中DataGridView常用操作,以实例形式总结了DataGridView绑定下拉列表、设置默认值、判断复选框是否选中等技巧,具有一定参考借鉴价值,需...

    我心依旧10002021-10-22
  • C#C#实现JSON解析器MojoUnityJson功能(简单且高效)

    C#实现JSON解析器MojoUnityJson功能(简单且高效)

    MojoUnityJson 是使用C#实现的JSON解析器 ,算法思路来自于游戏引擎Mojoc的C语言实现 Json.h。这篇文章主要介绍了C#实现JSON解析器MojoUnityJson的方法,需要的朋友...

    scottcgi11772022-02-19
  • C#C#与C++之间类型的对应知识点总结

    C#与C++之间类型的对应知识点总结

    这篇文章主要介绍了C#与C++之间类型的对应知识点总结,对此有需要的朋友们可以参考下。...

    遥望星空8812022-08-04