控制视野中心图片的切换 并实现移动

一排六张图片,点击左滑、右滑按钮,让图片进行切换

/***********************************************************************
 * 功能:控制控制视野中心图片的切换,并实现移动的
 * 
 * 逻辑:以处于中心的图片为基准,排布、移动图片
 * 
 * 署名:李晓刚 2021.08.31
 *  
 * 修改:无
 ************************************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using DG.Tweening;
using UnityEngine.UI;
public class ScriptMgr : MonoBehaviour
{
    
    
    //左中右,三个位置
    public Vector3 leftPos;
    public Vector3 middlePos;
    public Vector3 rightPos;
    
    //6张说明图,及在正中的物体(当下是哪张图片在视野中间显示)<a> 
    private Transform[] pic = new Transform[6]; 
    private Transform middleObject;

    //左侧、右侧、返回、关闭,四个按钮<b>  及首页上的三个返回按钮<c>
    private GameObject leftBtn,rightBtn,returnBtn,closeBtn;   
    private Button btn1,btn2,btn3;
    
    //图片做DOLocalMove(DOTween插件方法)的用时
    public float moveTime = 0.7f;
    
    //双击头显“返回键”,应用退出<d>(控制代码在Update函数里)
    private int clickCount=0;
    private float quitDelayTime = 2f;
    
    void Start()
    {
    
    
        //<a>初始化图片数组
        pic[0] = transform.Find("/Canvas/Mask/Pic0_Caalog");
        pic[1] = transform.Find("/Canvas/Mask/Pic1_GlassWearingMethod");
        pic[2] = transform.Find("/Canvas/Mask/Pic2_GlassKeyGuide");
        pic[3] = transform.Find("/Canvas/Mask/Pic3_HandShankGuidePart1");
        pic[4] = transform.Find("/Canvas/Mask/Pic4_HandShankGuidePart2");
        pic[5] = transform.Find("/Canvas/Mask/Pic5_HandShankGuidePart3");
        middleObject = pic[0];//<x>默认是首页在中间显示
        //<b>找按钮,并给它们添加监听
        leftBtn = GameObject.Find("/Canvas/BtnLeft");
        rightBtn = GameObject.Find("/Canvas/BtnRight");
        returnBtn = GameObject.Find("/Canvas/BtnReturn");
        closeBtn = GameObject.Find("/Canvas/BtnClose");
        leftBtn.GetComponent<Button>().onClick.AddListener(ClickLeftBtn);
        rightBtn.GetComponent<Button>().onClick.AddListener(ClickRightBtn);
        returnBtn.GetComponent<Button>().onClick.AddListener(ClickReturnBtn);
        closeBtn.GetComponent<Button>().onClick.AddListener(ClickCloseBtn);//<c>首页上的三个跳转按钮
        btn1 = transform.Find("/Canvas/Mask/Pic0_Catalog/Btn1_GlassWearingMethod").GetComponent<Button>();
        btn2 = transform.Find("/Canvas/Mask/Pic0_Catalog/Btn2_GlassKeyGuide").GetComponent<Button>();
        btn3 = transform.Find("/Canvas/Mask/Pic0_Catalog/Btn3_HandShankGuidePart1").GetComponent<Button>();
        btn1.onClick.AddListener(ClickBtn1);
        btn2.onClick.AddListener(ClickBtn2);
        btn3.onClick.AddListener(ClickBtn3);
     }
        //四个按钮,监听方法
        private void ClickLeftBtn()//实际是图片往右移 
        {
    
    
             int index = Array.IndexOf(pic,middleObject);
             if(index>0)
            {
    
    
                    pic[index - 1].localPosition = leftPos;//左图为
                    pic[index - 1].DOLocalMove(middlePos, moveTime);//左图往右移-居中
                    pic[index].DOLocalMove(rightPos, moveTime);//中图往右移-居右
             }
        
         }
         private void ClickRightBtn()
         {
    
    
            int index = Array.IndexOf(pic, middleObject);
            if(index<5)
            {
    
    
               pic[index + 1].localPosition = rightPos;//右图为
               pic[index].DOLocalMove(leftPos, moveTime);//中图往左移-居左
               pic[index + 1].DOLocalMove(middlePos, moveTime);//右图往左移-居中
            }
        
          }
         private void ClickReturnBtn()
         {
    
    
               int index = Array.IndexOf(pic, middleObject);
               pic[0].localPosition = leftPos;//首页设为左图
               pic[0].DOLocalMove(middlePos, moveTime);//首页往右移-居中
               pic[index].DOLocalMove(rightPos, moveTime);//原图往右移-居右
         }
         private void ClickCloseBtn()
         {
    
    
               Application.Quit();
         }  
      //首页上的三个按钮,监听方法—————可能出现两张图片交错的问题—————解决方法,把可能右移与左移图片形成交错的图片,事先放到右边,使之只能左移
         private void ClickCloseBtn1()
        {
    
    
               pic[1].localPosition = rightPos;
               pic[0].DOLocalMove(leftPos,moveTime);
               pic[1].DOLocalMove(middlePos, moveTime);
        }
         private void ClickBtn2()
        {
    
    
               pic[2].localPosition = rightPos;
               pic[0].DOLocalMove(leftPos, moveTime);
               pic[2].DOLocalMove(middlePos, moveTime);
        }
         private void ClickBtn3()
        {
    
    
               pic[3].localPosition = rightPos;
               pic[0].DOLocalMove(leftPos, moveTime);
               pic[3].DOLocalMove(middlePos, moveTime);
        }
         void Update()
        {
    
    
        //设置中心物体middleObject(以中心物体为基准,排布、移动图片——这也是此脚本的核心逻辑)
             for(int i=0;i<pic.Length;i++)
             {
    
    
                    if(pic[i].localPosition==middlePos)
                    {
    
    
                       middleObject = pic[i];                
                    }          
              }
              //【Bug】——图片在没移到中心时,点击左右按钮/返回按钮不起作用。【解Bug】——让这个逻辑显式化,没有图片在middle位置时,直接让左右按钮不管用
              if(pic[0].localPosition==middlePos|| pic[1].localPosition == middlePos || pic[2].localPosition == middlePos || pic[3].localPosition == middlePos || pic[4].localPosition == middlePos || pic[5].localPosition == middlePos)
              {
    
    
                  leftBtn.GetComponent<Image>().color = new Vector4(1, 1, 1, 1);
                  rightBtn.GetComponent<Image>().color = new Vector4(1, 1, 1, 1);
                  returnBtn.GetComponent<Image>().color = new Vector4(1, 1, 1, 1);
                  leftBtn.GetComponent<Image>().raycastTarget = true;
                  rightBtn.GetComponent<Image>().raycastTarget = true;
                  returnBtn.GetConent<Image>().raycastTarget = true;
              }
              else
              {
    
    
                  leftBtn.GetComponent<Image>().color = new Vector4(1, 1, 1, 0.5f);
                  rightBtn.GetComponent<Image>().color = new Vector4(1, 1, 1, 0.5f);
                  returnBtn.GetComponent<Image>().color = new Vector4(1, 1, 1, 0.5f);
                  leftBtn.GetComponent<Image>().raycastTarget = false;
                  rightBtn.GetComponent<Image>().raycastTarget = false;
                  returnBtn.GetComponent<Image>().raycastTarget = false;
               }
       //【查缺补漏】:最后一张图显示时,它将不能往左移动,所以右按钮消失——同理,首页显示时,它将不能往右移动,所以左按钮消失(同时伴随返回按钮的消失)
             if (middleObject==pic[5])
            {
    
    
                    rightBtn.SetActive(false);
            } 
            else
            {
    
    
                    rightBtn.SetActive(true);
            }
            if(middleObject==pic[0])
            {
    
    
                    leftBtn.SetActive(false);
                    returnBtn.SetActive(false);
            }
            else
            {
    
    
                    leftBtn.SetActive(true);
                    returnBtn.SetActive(true);
            }
            #region 滑动手柄控制页面滑动
        //限制手柄左滑,只有当有图片在middlePos中心位置时,手柄左滑才有效
                //光标的左滑、右滑
            bool flag = isSomePicInMidd();
            if (Mvxr.MVDaydreamController.TouchGestureLeft)
            {
    
    //向左划(逻辑同点击“右按钮”)
                    if (flag)
                    {
    
    
                //Debug.Log("lxg----向左滑是否有图片在中心位置" + flag);  
                       ClickRightBtn();
                    }
            }
            if (Mvxr.MVDaydreamController.TouchGestureRight)
            {
    
    //向右滑(逻辑同点击“左按钮”)
                if (flag)                
                {
    
    
                  //Debug.Log("lxg----向右滑是否有图片在中心位置" + flag);
                  ClickLeftBtn();
                }
             }
               
        #endregion
        #region <d>双击头显“返回键”,退出应用
           if (Input.GetKeyDown(KeyCode.Escape))
           {
    
    
              clickCount++;
              if (clickCount > 1)
              {
    
    
                Application.Quit();
                clickCount = 0;
                quitDelayTime = 2f;
              }
              else
              {
    
    
                Debug.Log("" + "ShowNotice");
                Toast.Instance.ShowNotice("再按一次返回键退出应用!");
              }
            }
        
            if (clickCount > 0)
            {
    
    
                quitDelayTime -= Time.deltaTime;
                if(quitDelayTime <= 0)
                {
    
    
                    clickCount = 0;
                    quitDelayTime = 2f;
                }
            }
        #endregion
        
    }//Update()----END
    
    //【判断是否有图片在视野中心位置middlePos】
    public bool isSomePicInMidd()
    {
    
    
            for (int i = 0; i < pic.Length; i++)
           {
    
    
              if (pic[i].localPosition == middlePos)
              {
    
    
                 return true;
              }             
            }
                 return false;
    }
}
         
                                

猜你喜欢

转载自blog.csdn.net/weixin_42935398/article/details/120758665
今日推荐