目录
1、Xmind思维导图
2、C#和API知识准备
参考菜鸟教程:https://www.runoob.com/csharp/csharp-tutorial.html
建议先把C和C++学习了,上手C#会很快的
API:https://docs.unity3d.com/2017.2/Documentation/ScriptReference/UI.ScrollbarEditor.html
至于引擎的API接口,先看一下常用的,比如事件Event和UI等,后面用到在查或者百度。不建议谷歌翻译成中文,直接看英文比较好,不会有很复杂的英文的,要习惯看英文文档
3、代码实现
3.1、创建两个C#脚本文件
Create Empty
绑定脚本文件
定义一个枚举类型ChessType
颜色区分chessColor+调用下棋方法PlayerChess()
棋盘中心应该是(7,7),在UI里面是和摄像机(0,0)对应的,不想改变UI的时候还要移动摄像机,所以选择在代码里面把x、y轴坐标加7
Camera.main.ScreenToWorldPoint:转换为世界坐标
Input.mousePosition鼠标输入坐标
Ctrl + S 保存代码,在unity中Ctrl + R刷新一下运行
打印坐标
日志在 WIndow – Console 可以拖到下面
观察发现这个坐标不会四舍五入,所以在代码里面加近似值0.5
定义和初始化二维数组
当前轮到那个棋子
棋子预制体对象数组
下棋间隔时间
是否还可以继续下棋
实现下棋方法
因为存在一个下棋等待时间,就是正常人下棋的思考时间,所以我们实现下棋方法的函数要有返回值,返回是否下棋成功。到某人下棋,没有按下棋子,就计时器一直计时,当按下那一刻,又把等待时间置零
确定更新函数
显然,我们不太想让棋子抖动吧,正常下子立即显示,所以我们选择FixedUpdate()来更新
Edit->Project Setting->time 找到Fixed timestep
限定条件
1、游戏正在进行时
2、棋子落子地方,x和y轴范围(0~14),因为棋盘是15x15
3、生成预制体坐标的坐标要减7,这个之前有说的,鼠标坐标和我们棋盘坐标不一样,生成的时候还是以unity自带的坐标为准,近似值我们是加了7.5f,所以这个时候也是带着0.5f的近似值
4、生成以后,数组中黑子存1,白字存2
5、判断输赢,双人对战看谁先连成5子就ok了,这个会单独来说,涉及单机涉及算法,也会单独写一篇博客来说
6、生子成功,换手
单例模式
参考:https://www.cnblogs.com/zhili/p/SingletonPatterm.html
在该游戏中,对于棋盘这个类,我们只需要拥有一个全局对象就可以了。
举一个小例子,在windows桌面上,我们已经打开了一个回收站,当我们试图再次打开一个新的回收站时,Windows系统并不会为你弹出一个新的回收站窗口。也就是说在整个系统运行的过程中,系统只维护一个回收站的实例。
Awake()和Start()
Awake():初始化函数,在游戏开始时系统自动调用。一般用来创建变量之类的东西
Start():初始化函数,在所有Awake函数运行完之后(一般是这样,但不一定),在所有Update函数前系统自动条用。一般用来给变量赋值
所以我们在Awake()的时候把当前对象赋值给_instance
棋子类开始调用
操作unity
改成2,黑白两个预制体拖入
ctrl+d再创建一个白子对象
运行游戏
点击的时候有时候会点不到,那是因为我们设置了0.4s的间隔
视频链接:https://live.csdn.net/v/118305
优化
运行游戏发现,创建这些对象都在这里,不太好看,我们可以指定生成的地方
位置坐标归零
再次运行游戏
4、代码源码
4.1 Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
public ChessType chessColor = ChessType.Black;
private void FixedUpdate()
{
if(chessColor == ChessBoard.Instance.turn && ChessBoard.Instance.waitTime > 0.4f)
PlayerChess();
}
public void PlayerChess()
{
//0表示点击鼠标左键,1表示点击鼠标右键,2是中建
if(Input.GetMouseButtonDown(0)){
Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
//print((int)(pos.x + 7.5f) + " " + (int)(pos.y + 7.5f));
if (ChessBoard.Instance.PlayChess(new int[2] { (int)(pos.x + 7.5f), (int)(pos.y + 7.5f) }))
ChessBoard.Instance.waitTime = 0;
}
}
}
4.2 ChessBoard.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ChessBoard : MonoBehaviour {
private static ChessBoard _instance;
public int[,] grid;
public ChessType turn = ChessType.Black;
public GameObject[] prefabs;
public float waitTime = 0;
public bool gameState = true;
Transform parent;
public static ChessBoard Instance
{
get
{
return _instance;
}
set
{
_instance = value;
}
}
private void Awake()
{
if(Instance == null)
{
_instance = this;
}
}
// Use this for initialization
void Start () {
parent = GameObject.Find("Parent").transform;
grid = new int[15, 15];
}
private void FixedUpdate()
{
waitTime += Time.deltaTime;
}
public bool PlayChess(int[] pos)
{
if (!gameState) return false;
pos[0] = Mathf.Clamp(pos[0], 0, 14);
pos[1] = Mathf.Clamp(pos[1], 0, 14);
if (grid[pos[0], pos[1]] != 0) return false;
if(turn == ChessType.Black)
{
GameObject go = Instantiate(prefabs[0], new Vector3(pos[0] - 7, pos[1] - 7),Quaternion.identity);
go.transform.SetParent(parent);
grid[pos[0], pos[1]] = 1;
//判断输赢
if (CheckIsWin(pos))
{
}
turn = ChessType.White;
}else if(turn == ChessType.White){
GameObject go = Instantiate(prefabs[1], new Vector3(pos[0] - 7, pos[1] - 7), Quaternion.identity);
go.transform.SetParent(parent);
grid[pos[0], pos[1]] = 2;
//判断输赢
if (CheckIsWin(pos))
{
}
turn = ChessType.Black;
}
return true;
}
public bool CheckIsWin(int[] pos)
{
return false;
}
}
//玩家类型
public enum ChessType{
Watch,
Black,
White,
}