废话:想这个效果怎么做,想了两天,被折磨了两天(主要是没转过弯想通思路),现在终于实现了,然后嘛~~~~~下面介绍思路:
我使用的ugui实现的:1.所以先设置好格子的高度:如图:
image2.在收到停下指令后,判断格子是否走满了一格的距离,没有则走满到一格的距离,有则不管
以上就是大概思路。
下面是绑定在每个格子上的脚本代码:
public float height = 192;//一个格子的高度
public int frequency = 3;//表示几次走完一格
[HideInInspector]
public bool revise = false;//是否进行位置修正 //在culunm类种进行设置为true,此脚本直负责设置为false;
private float speed = 0 ;//1次调用移动方法移动的距离
private float distance = 0;//格子移动的距离
private Culumn parent; //管理这个格子的列表的类,挂载在格子的父物体上
public Culumn Parent
{
get { return parent; }
}
void Start()
{
speed = height / frequency;//表示几次调用走完一格的距离
parent = GameManager.Instance.GetCulumn(transform.parent.gameObject);
}
void FixedUpdate()//Fixed //在fixedupdate中固定间隔调用,让速度看起来更均衡
void Update {
Move();
}
void Move()
{
if (parent.isMove)
{
transform.localPosition += Vector3.down * moveSpeed * Time.deltaTime;
distance += 1 * moveSpeed * Time.deltaTime;
if (distance >= height)
{
distance -= height;
transform.localPosition += new Vector3(0, distance, 0);
distance = 0;
}
}
else if (revise)
{
if (distance != 0)
{
distance = Mathf.Abs(distance - height);
}
StartCoroutine(SetPos(distance));
distance = 0;
revise = false;
moveSpeed = speed;
}
ResetPos();
}
/// <summary>
/// 停止滚动后,用来停至每个格子处
/// </summary>
/// <param name="dis">还需要走满一格的距离</param>
/// <returns></returns>
IEnumerator SetPos(float dis)
{
if (dis != 0)
{
for (int i = 0; i < 5; i++)
{
transform.localPosition -= new Vector3(0, dis / 5, 0);
yield return new WaitForFixedUpdate();
}
}
StartCoroutine(UpDownAnim());//格子停下后的上下动画
}
/// <summary>
/// 重置item的位置信息
/// </summary>
void ResetPos()
{ //最低位置和最高位置
if (transform.localPosition.y <= -highPointY + 1)//+ 1
{
distance = 0;
ResetSprite();
transform.localPosition = new Vector3(0, highPointY, 0);
}
}
以上就是每个格子的处理,这次我们主要说的是滚动效果,所以请读者主要看Move方法的代码.
这里是每列的脚本:绑定在格子的父物体上
public int culumnNum = 0;//表示这是第几列
public float stopTime = 2f;//每列停止的时间
public bool isMove = false;//表示该列是否滚动
private ItemMove[] child = new ItemMove[5];//每列下的格子,我设置的是每列一共五个格子,四个处于屏幕中
private void Start()
{
for (int i = 0; i < child.Length; i++)
{
child[i] = GameManager.Instance.GetItemMove(transform.GetChild(i).gameObject);
}
}
private void Update()
{
//RandomPriceClick();
}
void RandomPriceClick()
{
//Input.GetMouseButton(0)
if (Input.GetMouseButtonDown(0)&& !GameManager.Instance.isBusy)//GameManager.Instance.isBusy是一个bool值,表示该局游戏是否进行中
{
isMove = true;
GameManager.Instance.StartBusyTimr();//开启 GameManager中的协程,控制isbusy;类似下面的stopmove
StartCoroutine(StopMove());
}
}
IEnumerator StopMove()//该列滚动的时间
{
yield return new WaitForSeconds(stopTime);
isMove = false;
for (int i = 0; i < child.Length; i++)
{
child[i].revise = true;
}
}
好了,完成以上代码,基本上就能滚动了。
下面是unity种hierarchy视图中的层级关系
列.png
格子.png
做完这些,就能滚动了。
然后实现后的效果,迟点更新,我还没研究透怎么上传gif232333333
补充:
1.上面的只是介绍了如何滚动,和停止,并没有介绍到如何停止到想要的结果,所以我会在评论区补上一个工程的百度云连接,补充上!!!如何停止到想要的结果(滚动,停止,切停止到想要的结果都在里面的了)!!!。代码解释我就不放上来了,大家自行下载吧。
网友评论