使用Photon Fusion在Unity中制作棋盘游戏
在Unity中使用Photon Fusion官方提供的API实现实时多人游戏,如下所示:
1.创建游戏房间
using Photon.Pun;
public class CreateRoom : MonoBehaviourPunCallbacks
{
public void OnClick_CreateRoom()
{
PhotonNetwork.CreateRoom(null, newRoomOptions {MaxPlayers = 2});
}
public override void OnCreatedRoom()
{
Debug.Log("Room created successfully.");
}
public override void OnCreateRoomFailed(short returnCode, string message)
{
Debug.Log("Room creation failed: " + message);
}
}
2.加入游戏房间
using Photon.Pun;
public class JoinRoom : MonoBehaviourPunCallbacks
{
public void OnClick_JoinRoom()
{
PhotonNetwork.JoinRandomRoom();
}
public override void OnJoinedRoom()
{
Debug.Log("Joined room successfully.");
}
public override void OnJoinRandomFailed(short returnCode, string message)
{
Debug.Log("Join room failed: " + message);
}
}
3.实现回合制游戏,例如:“井字棋”
using Photon.Pun;
using System.Collections.Generic;
public class TicTacToe : MonoBehaviourPunCallbacks, IPunTurnManagerCallbacks
{
// 存放棋子状态的数组
private int[] board = new int[9];
// 移动次数
private int moveCount = 0;
// 轮流操作的玩家ID
private int activePlayer = 0;
// 存放所有玩家的ID
private List playerList = new List();
private IPunTurnManager turnManager;
private void Start()
{
turnManager = GetComponent();
// 初始化棋盘
for(int i = 0; i < board.Length; i++)
{
board[i] = -1;
}
}
// 玩家点击一个空位置放棋子
public void OnPhotonSerializeView(int[] data, PhotonStream stream)
{
if (stream.IsWriting)
{
stream.SendNext(data);
}
else if(stream.IsReading)
{
data = (int[])stream.ReceiveNext();
}
// 点击一个空位置的数据格式:[位置, 玩家ID]
if(data[1] == PhotonNetwork.LocalPlayer.ActorNumber)
{
board[data[0]] = activePlayer;
moveCount++;
if(IsWin())
{
Debug.Log("Player " + activePlayer.ToString() + "wins!");
}
else
{
activePlayer = (activePlayer + 1) % 2;
turnManager.SendMove(moveCount, board, true);
}
}
}
// 检测是否有玩家胜利
private bool IsWin()
{
for(int i = 0; i < 3; i++)
{
if(board[i*3] != -1 && board[i*3] == board[i*3+1] && board[i*3+1] == board[i*3+2])
{
return true;
}
if (board[i] != -1 && board[i] == board[i + 3] && board[i + 3] == board[i + 6])
{
return true;
}
}
if(board[0] != -1 && board[0