闲来无事,写点东西。想到之前有用过u3d,也是怕自己以后忘了,放csdn上留存一下。
先上代码。
思路是通过给一个图形添加脚本Grid.cs ,再通过总控的脚本使用两个for循环批量生成图形方块。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
//is Grid Script
public class Grid : MonoBehaviour,IPointerClickHandler
{
public int GridId; //编号
private int GridSize = 55; //大小 ,控制间隙
private int Gridx; //x
private int Gridy; //y
public int GridType = 0;//类型,随机生成,控制两方块间可消除与否
private int Speed = 200; //动作移动速度
public Vector2 TragetPos = Vector2.zero; //位置
public void Init ()
{
name = GridId.ToString();
Gridx = GridCenter.Instance.GetGridPosX(GridId);
Gridy = GridCenter.Instance.GetGridPosY(GridId);
transform.localPosition = new Vector2(Gridx * GridSize, Gridy * GridSize);
TragetPos = transform.localPosition;
Image img = this.GetComponent<Image>();
switch(GridType)
{
case 1:
img.overrideSprite = GridCenter.Instance.s1;
break;
case 2:
img.overrideSprite = GridCenter.Instance.s2;
break;
case 3:
img.overrideSprite = GridCenter.Instance.s3;
break;
case 4:
img.overrideSprite = GridCenter.Instance.s4;
break;
case 5:
img.overrideSprite = GridCenter.Instance.s5;
break;
}
}
void Update ()
{
if (transform.localPosition.x == TragetPos.x && transform.localPosition.y == TragetPos.y)
{//方块移动时,不能进行其它操作
if (GridCenter.Instance.IsMove.Contains(GridId))
{
GridCenter.Instance.IsMove.Remove(GridId);
}
}
if (transform.localPosition.x != TragetPos.x)
{//移动代码
if (transform.localPosition.x > TragetPos.x)
{
Vector2 pos = transform.localPosition;
pos.x -= (Speed * Time.deltaTime);
pos.x = pos.x < TragetPos.x ? TragetPos.x : pos.x;
transform.localPosition = pos;
}
else
{
Vector2 pos = transform.localPosition;
pos.x += (Speed * Time.deltaTime);
pos.x = pos.x > TragetPos.x ? TragetPos.x : pos.x;
transform.localPosition = pos;
}
}
if (transform.localPosition.y != TragetPos.y)
{
if (transform.localPosition.y > TragetPos.y)
{
Vector2 pos = transform.localPosition;
pos.y -= (Speed * Time.deltaTime);
pos.y = pos.y < TragetPos.y ? TragetPos.y : pos.y;
transform.localPosition = pos;
}
else
{
Vector2 pos = transform.localPosition;
pos.y += (Speed * Time.deltaTime);
pos.y = pos.y > TragetPos.y ? TragetPos.y : pos.y;
transform.localPosition = pos;
}
}
}
public void MoveGrid(Grid last,Grid current)
{//确保移动在两相邻间进行。不会出现换位情况
if (GridCenter.Instance.GetGridMoveRange(last.GridId, current.GridId))
{
last.TragetPos = current.transform.localPosition;
current.TragetPos = last.transform.localPosition;
if (!GridCenter.Instance.IsMove.Contains(GridId))
{
GridCenter.Instance.IsMove.Add(GridId);
}
GridCenter.Instance.MoveGridDate(last, current);
GridCenter.Instance.RemoveKye = true;
}
else
{
GridCenter.Instance.LastClickGrid = null;
GridCenter.Instance.CurrentClickGrid = null;
}
}
public void OnPointerClick(PointerEventData eventData)
{
if (GridCenter.Instance.IsMove.Count !=0)
{
return;
}
Debug.Log("Click:"+name);
if (GridCenter.Instance.LastClickGrid != this)
{
if (GridCenter.Instance.LastClickGrid != null)
{
MoveGrid(GridCenter.Instance.LastClickGrid,this);
GridCenter.Instance.CurrentClickGrid = this;
return;
}
GridCenter.Instance.LastClickGrid = this;
}
}
}
GridCenter.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using YouKe.Data;
using UnityEngine.Audio;
//is GridCenter Script
public class GridCenter : MonoBehaviour ,INotifier
{
private static GridCenter mInstance;
public static GridCenter Instance
{
get { return mInstance; }
}
private int typeNum = 6;
private Dictionary<int, Grid> DicGrid = new Dictionary<int, Grid>();
//public AudioSource[] audioSources;
public Grid LastClickGrid = null;
public Grid CurrentClickGrid = null;
public List<int> IsMove = new List<int>();
private List<Grid> RemoveGridList = new List<Grid>();
private Text mScore;
private Text mSteps;
public int numScore = 0;
public Sprite s1;
public Sprite s2;
public Sprite s3;
public Sprite s4;
public Sprite s5;
public Transform GridCentrerTransform;
public Transform GameStartTransform;
public Transform GamePlayTransform;
public Transform RankingTransform;
public Transform ScoreUpdateTransform;
public Transform Item;
private List<protos.integral.TopInfo> listinfo