记忆力小游戏

这里写图片描述
这是一款经典的记忆力小游戏 针对初学者
/*
精灵是显示在屏幕上的2D图像,和显示在3D模型表面的图像不同(贴图)

Edit|ProjectSetting|Editor中的Default Behaviour Mode设置 2D
设置编辑器为2D模式会让导入的图像设置为Sprite

X和Y是在2D屏幕上影响对象定位的唯一坐标,然而Z坐标依然影响对象堆叠在其他对象上,Z值越低,离摄像机越近

图集能通过两种方式优化性能:
1)通过把它们紧凑地打包在一起减少空间的浪费
2)通过减少视频卡的绘制调用(draw call)(每加载一个新图像将导致视频卡多做一些工作)

像素完美(Pixel-perfect)意味着屏幕上的一个像素对应图像中的一个像素(否则,视频卡将会让图像
在缩放到适应屏幕时变得模糊)
假设你想要在1024*768屏幕上实现完美像素,这意味着摄像机的高度应该是384像素。除以100(因为像素对应单位的缩放)
并得到摄像机大小为3.84

*/

public class MemoryCard : MonoBehaviour {

[SerializeField]
private GameObject cardBack;
// 2 通过这个对象来添加图像
[SerializeField]
private SceneController controller;

private int _id;
public int id
{
    get { return _id; }
}

public void SetCard(int id,Sprite image)
{
    _id = id;
    GetComponent<SpriteRenderer>().sprite = image;
}
//通过代码添加图像
//[SerializeField]
//private Sprite image;

// Use this for initialization
void Start () {
   // GetComponent<SpriteRenderer>().sprite = image;
}

// Update is called once per frame
void Update () {

}

public void OnMouseDown()
{
    //检查控制器的canReveal属性,确保同时只有两张卡片是翻开的
    if (cardBack.activeSelf&&controller.canReveal)
    {
        cardBack.SetActive(false);
        controller.CardRevealed(this);
    }
}
/// <summary>
/// 一个公有方法,因此SceneController可以再次隐藏卡片
/// </summary>
public void Unreveal()
{
    cardBack.SetActive(true);
}

}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SceneController : MonoBehaviour {

[SerializeField] private TextMesh scoreLabel;
public const int gridRows = 2;
public const int gridCols = 4;
public const float offsetX = 2;
public const float offsetY = 2.5f;
//引用场景中的卡片
[SerializeField] private MemoryCard originalCard;
[SerializeField] private Sprite[] images;

private int _score = 0;

// Use this for initialization
void Start () {

    //int id = Random.Range(0,images.Length);
    //originalCard.SetCard(id,images[id]);

    //第一张卡片的位置,所有其他卡片将从这里开始偏移
    Vector3 startPos = originalCard.transform.position;
    //使用ID对为所有四种卡片精灵声明一个整型数组
    int[] numbers = { 0, 0, 1, 1, 2, 2, 3, 3 };
    numbers = ShuffleArray(numbers);
    for (int i = 0; i < gridCols; i++)//列
    {
        for (int j = 0; j< gridRows; j++)//行
        {
            MemoryCard card;
            if (i==0&&j==0)
            {
                card = originalCard;
            }
            else
            {
                card = Instantiate(originalCard) as MemoryCard;
            }
            //i=0 1 2 3 
            //j=0 1 
            //--------------
            //  0 4 1 5 2 6 3 7
            // 
            int index = j * gridCols + i;
            //int id = Random.Range(0, images.Length);
            int id = numbers[index];//从打乱的列表中取出ID而不是随机生成
            card.SetCard(id, images[id]);

            float posX = (offsetX * i) + startPos.x;
            float posY = -(offsetY * j) + startPos.y;
            //对于2D图形,你只需要偏移X和Y;保持z轴一致
            card.transform.position = new Vector3(posX,posY,startPos.z);
        }

    }
}

private MemoryCard _firstRevealed;
private MemoryCard _secondRevealed;
//当已经存在第二张翻开的卡片时,getter方法返回false;
public bool canReveal
{
    get { return _secondRevealed == null; }
}

public void CardRevealed(MemoryCard card)
{
    if (_firstRevealed == null)
    {
        _firstRevealed = card;
    }
    else
    {
        _secondRevealed = card;
        // Debug.Log(_firstRevealed.id+_secondRevealed.id);
        StartCoroutine(CheckMatch());
    }
}

// Update is called once per frame
void Update () {

}

//洗牌算法(费谢尔算法)
private int[] ShuffleArray(int[] numbers)
{
    //浅克隆 不会影响原来的值
    int[] newArray = numbers.Clone() as int[];

    for (int i = 0; i < newArray.Length; i++)
    {
        // 0
        int temp = newArray[i];//0 1 2 3 4 5 6 7
          // 1                   //0 0 1 1 2 2 3 3
        int r = Random.Range(i,newArray.Length);

        newArray[i] = newArray[r];

        newArray[r] = temp;
    }
    return newArray;
}

private IEnumerator CheckMatch()
{
    if (_firstRevealed.id == _secondRevealed.id)
    {
        _score++;
        scoreLabel.text = "Score: " + _score;
    }
    else
    {
        yield return new WaitForSeconds(0.5f);
        _firstRevealed.Unreveal();
        _secondRevealed.Unreveal();
    }
    _firstRevealed = null;
    _secondRevealed = null;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值