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