手记

Caeser_Rummikub(一)棋牌的创建

照着网上的视频Chess,根据这个Unity3D棋牌游戏的创建过程,我打算做出我之前玩过的一款桌游,以色列麻将(拉密  Rummikub),该游戏有官方网站,用Unity做出的Web游戏,我打算自己做一个电脑端和手机端能玩的版本,由于使用的是个人版本的Unity,所以Build出来的也是个人版本。

首先介绍一下拉密吧,是一款数字游戏,玩家数量2-4人最好,一共106张牌,两张鬼牌,剩下的是数字1-13,每个数字有四种颜色红、橙、蓝、黑,每种颜色的数字有两相同的牌。玩家洗牌并把牌面朝下,可以摇色子来确定谁先出牌,开局要抽14张牌,所有人第一次出牌的“总和”必须大于30(破冰),而且出牌时必须符合以下规则:

Runs:数字递增序列,数量大于等于三个,颜色必须一致

Grups:数字相同序列,数量大于等于三个,颜色必须不一致

破冰结束后的玩家才可以借助已经出的牌,进行下一步操作:

无法破冰就只能从牌堆里摸一张牌进入自己的手中结束自己的回合,破冰结束后的回合里,如果从手中拿出一张或一张以上的牌将牌面(即已经出的牌)满足上述规则,则不用摸牌,等待时间结束或直接轮到下一位玩家。

胜利条件:牌面满足规则的前提下,手中没有牌,则胜利。

根据视频,我将拉密的牌制作成54个PNG图片,创建了一个Unity2D工程,创建Empty(ctrl+shift+n),然后将PNG拖拽到Empty GameObject上成为它的子对象,再拖拽回Assets里保存。视频里创建场景是通过代码实现的,我就学着这种方式实现牌的布置,代码如下:


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

public class TableControl : MonoBehaviour {

    public List<GameObject> tilesPrefabs;
    private List<GameObject> activeTiles=new List<GameObject>();
    private const float LENGTH_TILE = 2.0f;
    private const float WIDTH_TILE = 1.0F;
    private int selectionX = -1;
    private int selectionY = -1;
    Vector2 pos_start = new Vector2(0.5f, 7);//初始位置
    Vector2 pos_joker_red = new Vector2(-1f,7);//红色鬼牌位置
    Vector2 pos_joker_black= new Vector2(-1f, 5);//黑色鬼牌位置
    // Use this for initialization
    void Start () {
        SpawnTiles(0, pos_joker_red);
        SpawnTiles(1, pos_joker_black);
        int adr_num = 2,i;
        for (int j=0; j<4;j++) {
            for (i = 0; i < 26; i++){
                SpawnTiles(adr_num++, pos_start + Vector2.right * i);//显示牌,并且横向移动
            }
            pos_start = pos_start + Vector2.down * 2;//纵向 向下移动2(即-2)
        }
    }
	
	// Update is called once per frame
	void Update () {
        DrawTable();
    }
    private void SpawnTiles(int index,Vector2 position)
    {//显示牌的函数
        GameObject go = Instantiate(tilesPrefabs[index], position, Quaternion.identity) as GameObject;//找到指定预设体设置指定位置 转化为 对象
        go.transform.SetParent(transform);
        activeTiles.Add(go);
    }
    private void DrawTable() {//划线,辅助作用
        Vector2 widthLine = Vector2.right * 26;
        Vector2 heightLine = Vector2.up * 8;
        for (int i=0; i<=8;i++) {
            Vector2 start = Vector2.up * i;
            Debug.DrawLine(start,start+widthLine);
            for (int j = 0; j <= 26; j++) {
                start = Vector2.right * j;
                Debug.DrawLine(start, start + heightLine);
            }
        }

    }
}





预设体的设置方式:

将Assets里的GameObject拖拽到Element0 1 ......右侧的输入框当中。

以上,完成了棋牌的显示,我将该Unity导出apk下载到手机当中测试,发现手机屏幕太小,显示不完全。可我也不想再缩小图片的大小,因为操作量实在太大了,我需要考虑考虑。


0人推荐
随时随地看视频
慕课网APP