联机版五子棋
这次的作业花了我好长好长的时间…其实实现联机版的小游戏说难不难,然而我也只能说…没那么简单吧…OwO 话不多说,来看一看这次联机版五子棋的实现吧。
左边为host,右边为client
1. 创建联网环境
1)NetworkManager 网络控制器设置
第一步是在项目中创建 NetworkManager 对象:从菜单 Game Object -> Create Empty 添加一个新的空游戏对象,重命名为“NetworkManager”。然后添加组件 Network -> NetworkManager,该组件管理游戏的网络状态。
2)设置玩家对象预制
下一步是设置代表游戏中玩家对象的 Unity Prefab。默认情况下,NetworkManager 通过克隆玩家预制来为 Client 实例化玩家对象。在五子棋游戏中,玩家对象是一个空对象,因为玩家只需要通过点击鼠标下棋,并不需要操作游戏对象。将空对象重命名为Player,添加组件 Network -> NetworkIdentity 到对象,该组件用于标识服务器和客户端之间的对象。
接下来,将 NetworkIdentity 上的 “Local Player Authority” 复选框设置为 true。这将允许客户端(本地玩家)拥有一定的权限,控制游戏对象。
将Player拖放到资源窗口中制作预制件。创建一个名为 “Player” 的预制件。从场景中删除 Player对象,因为我们只需要预制。
3)注册玩家预制
一旦玩家预制被创建,它就必须在网络系统上注册。
在层次视图中找到 NetworkManager 对象并选择它在 NetworkManager 组件面板打开 “Spawn Info” 折叠找到 “Player Prefab” 插槽(可以拖入对象的属性)将 PlayerCube 预制件拖入 “Player Prefab” 插槽。
2.实现游戏五子棋
1) 新建棋盘
从菜单 3D Object -> Plane 创建一个平面,添加material,调整位置和角度(竖立以便下棋),作为棋盘。在Plane下新建4个Sphere对象LeftTop/RightTop/LeftButton/RightButton,分别放置在棋盘的四个网格顶点,这是为了在之后方便计算棋子的落子点位置。
2) 创建五子棋脚本chess.cs
因为实际上五子棋的实现比较简单,因此这一次没有使用架构,只用了一个脚本实现,以下说一说各部分函数的作用。
首先是变量说明,主要是分为两部分,一部分是关于位置描述的变量,另一部分是关于游戏状态记录的变量。
//-----------Part 1 对象&位置相关------------------------
//四个锚点位置,用于计算棋子落点
public GameObject LeftTop;
public GameObject RightTop;
public GameObject LeftBottom;
public GameObject RightBottom;
//主摄像机
public Camera cam;
//锚点在屏幕上的映射位置
public Vector3 LTPos;
public Vector3 RTPos;
public Vector3 LBPos;
public Vector3 RBPos;
Vector3 PointPos; //当前点选的位置
float gridWidth = 1; //棋盘网格宽度
float gridHeight = 1; //棋盘网格高度
float minGridDis; //网格宽和高中较小的一个
//-----------Part 2 游戏状态相关------------------------
// 记录棋子状态
public SyncListInt cs = new SyncListInt();
// 同步记录游戏状态
[SyncVar]
public int winner = 0; //获胜方,1为黑子,-1为白子
[SyncVar]
public bool isPlaying = true; //是否处于对弈状态
enum turn { black, white };
[SyncVar]
turn chessTurn; //落子顺序(需要同步)
[SyncVar]
public bool isRestart; //重新开始信号(需要同步)
Vector2[,] chessPos; //存储棋盘上所有可