Unity 图片滑动

Unity Scroll View图片滑动

前言

在多媒体行业中,会有许多关于播放图片的软件诞生,切换图片有比较多的方式,下面介绍比较常用的两种,一个是只切换Image的图片精灵Sprite,一个是带有滑动过程的Scroll View切换,在这个时候unity自带的Scroll View组件就派上用场了。但是Scroll View组件无法自动定位到某一张图片,想要手指滑动一次移动到某一张还是要借助代码的力量。下面就是如何切换图片的两种常用方法:

(1)切换图片精灵
这里使用一种比较常用的加载图片的方法,将需要展示的图片放置于Resources文件夹下,后续使用脚本读取,如图所示:
在这里插入图片描述

在创建的Image上挂载脚本ChangeImageSprite.cs
在这里插入图片描述
脚本内容如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ChangeImageSprite : MonoBehaviour
{
    
    
    Image mainimg;
    Sprite[] change_sp;

    Vector3 start_pos;
    Vector3 end_pos;
    int count;
    // Start is called before the first frame update
    void Start()
    {
    
    
        mainimg = transform.GetComponent<Image>();
        change_sp = Resources.LoadAll<Sprite>("Image");
    }

    void Update()
    {
    
    
        if (Input.touchCount>0)
        {
    
    
            switch (Input.GetTouch(0).phase)
            {
    
    
                case TouchPhase.Began:
                    start_pos = Input.GetTouch(0).position;
                    break;

                case TouchPhase.Moved:

                    break;
                case TouchPhase.Ended:
                    end_pos = Input.GetTouch(0).position;
                    float offset = end_pos.x - start_pos.x;
                    //向左滑动
                    if (offset < 0)
                    {
    
    
                        if (count < change_sp.Length - 1)
                        {
    
    
                            count++;
                        }
                    }
                    //向右滑动
                    else if (offset > 0)
                    {
    
    
                        if (count > 0)
                        {
    
    
                            count--;
                        }
                    }
                    mainimg.sprite = change_sp[count];
                    break;
            }
        }
    }
}

演示效果如下:

在这里插入图片描述
(2)Scroll View播放
将Scroll View调整到相应大小,选择方向(本案例为横向)如图所示:
在这里插入图片描述
Content添加Content Size Fitter和Grid Layout Group,调整组件设置,如图所示:
在这里插入图片描述
将图片添加到Content下面:
在这里插入图片描述
为Scroll View挂上脚本,脚本如下:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using System;

public class ScrollViewScript : MonoBehaviour, IBeginDragHandler, IEndDragHandler
{
    
    

    private float movespeed; 
    private int pageCount = 1; 
    Transform content;
    private ScrollRect Rect;

    private float pageIndex;   
    private bool isDrag = false;  

    private List<float> PageList = new List<float> {
    
     0 }; 
    private float targetPos = 0;
    private float nowindex = 0;  

    private float beginDragPos;
    private float endDragPos;
    private float sensitivity = 0.5f;  
    void Awake()
    {
    
    
        Rect = this.GetComponent<ScrollRect>();
        InitPageList();
        movespeed = 10;
    }

    
    void InitPageList()
    {
    
    
        content = transform.Find("Viewport/Content");
        pageIndex = (content.childCount / pageCount)-1;
        if (content != null && content.childCount != 0)
        {
    
    
            for (float i = 1; i <= pageIndex; i++)
            {
    
    
                PageList.Add((i / pageIndex));
            }
        }
    }

    void Update()
    {
    
    
        if (!isDrag)
        {
    
     
            Rect.horizontalNormalizedPosition = Mathf.Lerp(Rect.horizontalNormalizedPosition, targetPos, Time.deltaTime * movespeed);
        }
    }

    
    public void OnBeginDrag(PointerEventData eventData)
    {
    
    
        isDrag = true;
        beginDragPos = Rect.horizontalNormalizedPosition;
    }

    
    public void OnEndDrag(PointerEventData eventData)
    {
    
    
        isDrag = false;
        endDragPos = Rect.horizontalNormalizedPosition;
        endDragPos = endDragPos > beginDragPos ? endDragPos + sensitivity : endDragPos - sensitivity;
        float offset = endDragPos-beginDragPos;
        if (offset<0)
        {
    
    
            nowindex = Mathf.Clamp(nowindex - 1, 0, pageIndex);
            targetPos = PageList[Convert.ToInt32(nowindex)];
        }
        else if(offset>0)
        {
    
    
            nowindex = Mathf.Clamp(nowindex + 1, 0, pageIndex);
            targetPos = PageList[Convert.ToInt32(nowindex)];
        }
    }
}

效果演示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43541308/article/details/121017562