一排六张图片,点击左滑、右滑按钮,让图片进行切换
/***********************************************************************
* 功能:控制控制视野中心图片的切换,并实现移动的
*
* 逻辑:以处于中心的图片为基准,排布、移动图片
*
* 署名:李晓刚 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;
}
}