Unity中国象棋(一)——初始化棋子

来源:互联网 发布:安卓6.0读取数据库 编辑:程序博客网 时间:2024/05/21 22:32

新建一个plane,作为背景,新建一个StoneManager脚本,挂在plane上


初始化32个棋子,每个棋子自带6个属性值:ID,x轴的坐标位置,y轴的坐标位置,是否为红子,是否死亡,棋子的类型。通过结构体Stone实现;

由于每个棋子的位置、类型难以通过ID区分,并且棋子的数量较少,故直接用结构体StonePos将其一一赋值;

利用其ID(也可利用其是否为红子的属性)和其类型,找到其对应的预制体,将其赋予给棋子并实现实例化

using UnityEngine;using System.Collections;using UnityEngine.UI;public class StoneManager : MonoBehaviour{    //初始化14种棋子的预制体    public GameObject che_black;    public GameObject ma_black;    public GameObject xiang_black;    public GameObject shi_black;    public GameObject jiang_black;    public GameObject pao_black;    public GameObject bing_black;    public GameObject che_red;    public GameObject ma_red;    public GameObject xiang_red;    public GameObject shi_red;    public GameObject jiang_red;    public GameObject pao_red;    public GameObject bing_red;    //初始化32个棋子    public static Stone[] s = new Stone[32];    public struct Stone    {        public enum TYPE { JIANG, CHE, PAO, MA, BING, SHI, XIANG };        //棋子的ID        public int _id;        //棋子是红子还是黑子,ID小于16的是红子,大于16是黑子        public bool _red;        //棋子是否死亡        public bool _dead;        //棋子在棋盘中的位置,        public float _x;        public float _y;        //棋子的类型        public TYPE _type;        //棋子初始化,赋予32个棋子对应的属性参数        public void init(int id)        {            _id = id;            _red = id < 16;            _dead = false;            //每个点上的棋子的类型            StonePos[] pos = {                                 new StonePos(-2.04f,2.25f,Stone.TYPE.CHE),                                 new StonePos(-1.53f,2.25f,Stone.TYPE.MA),                                 new StonePos(-1.02f,2.25f,Stone.TYPE.XIANG),                                 new StonePos(-0.51f,2.25f,Stone.TYPE.SHI),                                 new StonePos(0,2.25f,Stone.TYPE.JIANG),                                 new StonePos(0.51f,2.25f,Stone.TYPE.SHI),                                 new StonePos(1.02f,2.25f,Stone.TYPE.XIANG),                                 new StonePos(1.53f,2.25f,Stone.TYPE.MA),                                 new StonePos(2.04f,2.25f,Stone.TYPE.CHE),                                 new StonePos(-1.53f,1.23f,Stone.TYPE.PAO),                                 new StonePos(1.53f,1.23f,Stone.TYPE.PAO),                                 new StonePos(-2.04f,0.72f,Stone.TYPE.BING),                                 new StonePos(-1.02f,0.72f,Stone.TYPE.BING),                                 new StonePos(0,0.72f,Stone.TYPE.BING),                                 new StonePos(1.02f,0.72f,Stone.TYPE.BING),                                 new StonePos(2.04f,0.72f,Stone.TYPE.BING),                             };            if (id < 16)            {                _x = pos[id].x;                _y = pos[id].y;                _type = pos[id].type;            }            else            {                _x = -pos[id - 16].x;                _y = -pos[id - 16].y - 0.1f;                _type = pos[id - 16].type;            }        }    }    /// <summary>    /// 通过棋子的坐标,获得对应的类型,将三个值关联在一起    /// </summary>    public struct StonePos    {        public float x, y;        public Stone.TYPE type;        public StonePos(float _x, float _y, Stone.TYPE _type)        {            x = _x;            y = _y;            type = _type;        }    }    /// <summary>    /// 通过棋子的ID和类型赋予棋子对应的预制体    /// </summary>    /// <param name="id"></param>    /// <param name="type"></param>    /// <returns></returns>    public GameObject GetPrefab(int id, StoneManager.Stone.TYPE type)    {        if (id < 16)        {            switch (type)            {                case StoneManager.Stone.TYPE.CHE:                    return che_red;                case StoneManager.Stone.TYPE.MA:                    return ma_red;                case StoneManager.Stone.TYPE.XIANG:                    return xiang_red;                case StoneManager.Stone.TYPE.SHI:                    return shi_red;                case StoneManager.Stone.TYPE.JIANG:                    return jiang_red;                case StoneManager.Stone.TYPE.PAO:                    return pao_red;                case StoneManager.Stone.TYPE.BING:                    return bing_red;            }        }        else        {            switch (type)            {                case StoneManager.Stone.TYPE.CHE:                    return che_black;                case StoneManager.Stone.TYPE.MA:                    return ma_black;                case StoneManager.Stone.TYPE.XIANG:                    return xiang_black;                case StoneManager.Stone.TYPE.SHI:                    return shi_black;                case StoneManager.Stone.TYPE.JIANG:                    return jiang_black;                case StoneManager.Stone.TYPE.PAO:                    return pao_black;                case StoneManager.Stone.TYPE.BING:                    return bing_black;            }        }        return bing_black;    }    /// <summary>    /// 初始并实例化棋子    /// </summary>    public void StoneInit()    {        for (int i = 0; i < 32; ++i)        {            s[i].init(i);        }        //实例化32个棋子        for (int i = 0; i < 32; ++i)        {            GameObject fabs = GetPrefab(i, s[i]._type);            GameObject Stone = Instantiate(fabs, transform.localPosition, Quaternion.identity) as GameObject;            Stone.name = i.ToString();            Stone.transform.position = new Vector3(s[i]._x, s[i]._y, 0);            Stone.AddComponent<BoxCollider>();        }    }    void Awake()    {        StoneInit();    }}




0 0
原创粉丝点击