照着网上的视频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下载到手机当中测试,发现手机屏幕太小,显示不完全。可我也不想再缩小图片的大小,因为操作量实在太大了,我需要考虑考虑。