最近在学习NGUI的过程中,在试着模仿保卫萝卜的界面,其中在选择关卡、帮助、选择模式等界面都出现了一个相似的处理:拖拽当前的物体,检测到拖拽左右移动,下一个应当出现的物体会缓慢滑动出现在视野中央。我也感觉自己表达不是特别清晰。。例如:当前视野中央是A物体,向左拖拽A物体,A和即将出现的B物体会同时向左滑动,直到B物体出现在视野中央。
在NGUI里面可以实现拖拽,但是并不完全符合我需要的功能,于是我就果断创建了一个新的脚本开始的编辑。首先要检测是向左拖拽还是向右拖拽,然后就是整体向下一个位置的移动。在其中我发现没办法记录当前的状态,于是我添加了一个枚举NowShow的变量show,每次检测到移动就改变当前的show的状态,在Update里面就一直检测show的状态来让ScrollView平滑移动到目标位置。下面是代码,仅供借鉴!有其他解决方案的话也希望可以告诉我下喽!
using UnityEngine;
using System.Collections;
public class ChangeScrollView : MonoBehaviour {
bool isButtonDown = false;
float translateX;
float mouseDownPostionX;
enum NowShow
{
pic1,
pic2,
pic3,
pic4
}
NowShow show = NowShow.pic1;
void Start()
{
translateX = transform.FindChild("Grid").GetComponent<UIGrid>().cellWidth;
}
void Update()
{
if((!isButtonDown)&&Input.GetMouseButtonDown(0))
{
isButtonDown = true;
mouseDownPostionX = transform.localPosition.x;
}
if(Input.GetMouseButtonUp(0))
{
if (mouseDownPostionX < transform.localPosition.x)
{
ShowRight();
}
else if (mouseDownPostionX > transform.localPosition.x)
{
ShowLeft();
}
isButtonDown = false;
}
if (!isButtonDown)
{
UpdatePic();
}
}
/// <summary>
/// 移动位置到中间
/// </summary>
void UpdatePic()
{
int i=(int)show;
// float x = -translateX * i;
float x = Mathf.Lerp(transform.localPosition.x, -translateX * i,Time.deltaTime*15);
//GetComponent<UIPanel>().clipOffset = new Vector2(-x,GetComponent<UIPanel>().clipOffset.y);
transform.localPosition = new Vector3(x, transform.localPosition.y, transform.localPosition.z);
GetComponent<UIPanel>().clipOffset = new Vector2(-x,GetComponent<UIPanel>().clipOffset.y);
}
/// <summary>
/// 向右移动
/// </summary>
void ShowRight()
{
if(show!= NowShow.pic1)
{
show--;
}
}
/// <summary>
/// 向左移动
/// </summary>
void ShowLeft()
{
if (show != NowShow.pic4)
{
show++;
}
}
}
本脚本放在新建的scrollview上面,推荐添加一个子物体Grid,将scrollview里面的子物体放在Grid里面(子物体的长宽就全部是Grid里面设置的值了),子物体必须添加BoxCollider和UIDrawScrollView。