unity3D制作拼图游戏

运行效果:

 

制作过程:

 

第一步:

新建项目,添加 UI 中的 canvas 对象 , 在 canvas 对象下创建一个空游戏对象 GameObject ,更名为 Grid . 为 Grid 添加 Grid layout Group 组件,设置属性如下:

  • Cell Size:Vector2类型,默认值为(100,100),网格中的每个单元格的大小
  • Spacing:这里的Spacing不同于水平布局、垂直布局,是Vector2类型,既然是网格布局,当然存在水平方向的间隔和垂直方向的间隔。这里我将其设置为 5 .
  • Constraint:枚举类型。其中 Fixed Column Count 约束指定数量的行数

这里我设置约定的行数 Constraint Count 为 3 (因为我这里制作的是 3*3 的拼图)

 

第二步:

在 Grid 下创建九个空游戏对象 GameObject , 用来存放分割的图片块。为每一个空游戏对象 GameObject 依次添加 Canvas Render , Image , Button 组件。如下图:

做完这些后,在 Game 界面可以看到如下图所示:

 

第三步:

在项目中建立文件夹,取名为 Resources ,在 Resources 文件夹下新建文件夹,取名为 picture ,拖一张图片到文件夹 picture 下。

  

将图片属性设置如下:

  

点击 Sprite Editor 键

在弹出界面中点击 Slice .

设置 Type 为 Grid By Cell Count

在 Column $ Row 一栏设置为 3*3 (即将整张图片分割成 3*3 块)

最后点击 Slice 按钮后 ,点击 Apply 完成设置。完成设置后图片上会多一个播放键,如下图所示:

 

第四步:

新建 C# 文件,更名为 pintu ,代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;

public class pintu : MonoBehaviour
{
    Item[] itemImg;
    Sprite[] UIShowImage;
    int length = 0;
    int sqrt = 0;
    void Start()
    {

        var RSLoadAllImages = Resources.LoadAll("picture");   //从文件夹Texture1中导入图片
        length = transform.childCount;  //length 为小图片块的个数
        sqrt = (int)Mathf.Sqrt(length); // sqrt为行列数

        //childLength-1——其中某一张为空白,即后下角为空白
        UIShowImage = new Sprite[length];

        for (int i = 0; i < length; i++)
        {
            Debug.Log(i);
            UIShowImage[i] = (Sprite)RSLoadAllImages[i + 1];  //将导入图片分块装入Sprite[] UIShowImage数组
        }
        //初始化图片的id,col,row
        InitItemImg(length);
        //打乱图片
        Shuffle(UIShowImage);
        InitShow();
    }

    //数组打乱
    T[] Shuffle<T>(T[] Array)
    {
        for (int i = 0; i < Array.Length; i++)
        { //对于数组中的每一小块图片都让它与数组中随机一块图片互换位置
            T temp = Array[i];
            int randomIndex = UnityEngine.Random.Range(0, Array.Length);
            Array[i] = Array[randomIndex];
            Array[randomIndex] = temp;
        }
        return Array;
    }

    // 初始化图片id,col,row
    void InitItemImg(int count)
    {
        itemImg = new Item[length];
        for (int i = 0; i < count; i++)
        {
            itemImg[i] = new Item();
            itemImg[i]._id = i;
            itemImg[i]._col = i / sqrt;
            itemImg[i]._row = i % sqrt;
        }
    }

    void InitShow()
    {
        //初始化显示图片
        for (int i = 0; i < UIShowImage.Length; ++i)
        {
            var t = transform.GetChild(i);
            t.GetComponent<Image>().sprite = UIShowImage[i];
            //指定Sprite
            itemImg[i]._sprite = t.GetComponent<Image>().sprite;
            //指定Obj
            itemImg[i]._Obj = t.gameObject;
            var item = itemImg[i];
            itemImg[i]._Obj.GetComponent<Button>().onClick.AddListener(delegate () {
                this.OnClickEvent(item);
            });
        }
        itemImg[length - 1]._Obj.GetComponent<Image>().sprite = null;
        itemImg[length - 1]._sprite = null;
    }

    void OnClickEvent(Item item)
    {
        if (canMovie(item))
        {
            var t = NoneImage();
            t._sprite = item._sprite;
            t._Obj.GetComponent<Image>().sprite = item._Obj.GetComponent<Image>().sprite;
            item._sprite = null;
            item._Obj.GetComponent<Image>().sprite = null;
        }
        if (Success())
        {
            Debug.Log("胜利");
        }
    }

    // 判断是否可以移动
    bool canMovie(Item item)
    {
        if (item._sprite == null)
            return false;
        var t = NoneImage();

        if ((t._col == item._col - 1 && t._row == item._row) || (t._col == item._col + 1 && t._row == item._row) || (t._col == item._col && t._row == item._row + 1) || (t._col == item._col && t._row == item._row - 1))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    //m获取空白图片
    Item NoneImage()
    {
        for (int i = 0; i < length; i++)
        {
            if (itemImg[i]._sprite == null)
            {
                return itemImg[i];
            }
        }
        return null;
    }

    // 判断胜利
    bool Success()
    {
        for (int i = 0; i < length - 1; i++)
        {
            if (itemImg[i]._Obj.GetComponent<Image>().sprite != null)
            {
                if (itemImg[i]._Obj.GetComponent<Image>().sprite.name != "Image_01_" + i.ToString())
                    return false;
            }
        }
        return true;
    }
}

public class Item
{
    public int _col;
    public int _row;
    public int _id;
    public GameObject _Obj;
    public Sprite _sprite;
}

将代码文件 pintu 添加到 Grid .

 

项目完成,单击运行即可开始游戏。

 

PS: 如需参考完整项目,请移步:https://download.csdn.net/download/qq_42185999/11915482  进行下载

 

  • 22
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值