unity使用PhotonEngine实现多人联机游戏开发(二)
上一篇由于Mac没电了,写的有点仓促,可能逻辑不是太好,有些说明有遗漏。先来补充一下:
申请免费光子云的正确步骤应该是先去全球官网注册账号,接着建立photon cloud application,得到一个APP ID,然后拿着这个APP ID去那个中文网页申请,申请的时候还需注意APP ID类型选择 Photon PUN
OK,现在开始逐一实现上一篇说的目标:
- unity中搜索Load Balancing Client脚本并打开
找到NameServerHost,原本是http://ns.exitgame.com,改为http://ns.photonengine.cn并保存
然后到
在Fixed Region那里填上cn - 初始场景的建设和链接网络脚本的编写:
建一个button按钮和一个名为NetworkingManager的脚本,再建一个挂载这个脚本的空物体,也命名为NetworkingManager,
- 脚本编写
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//引入命名空间
using Photon.Pun;
using Photon.Realtime;
//让脚本继承MonoBehaviourPunCallbacks类,这个类是关于回调函数的
public class NetworkingManager : MonoBehaviourPunCallbacks
{
[SerializeField]
private int sceneIndex;
//当按钮被点击的时候判断一下是否与服务器链接,如果链接成功就加入房间,否则开始链接。
public void ClickBtn()
{
if (PhotonNetwork.IsConnected)
{
PhotonNetwork.JoinRandomRoom();
}
else
{
PhotonNetwork.ConnectUsingSettings();
}
}
//尝试与主服务器进行链接时调用
public override void OnConnectedToMaster()
{
PhotonNetwork.JoinRandomRoom();
}
//当链接成功时调用
public override void OnConnected()
{
Debug.Log("------链接成功------");
}
//当链接失败的时候
public override void OnDisconnected(DisconnectCause cause)
{
Debug.Log("------链接失败------");
}
//当加入大厅成功的时候
public override void OnJoinedLobby()
{
Debug.Log("------加入大厅成功------");
}
//加入房间失败的时候调用,加入房间失败,并创建房间,可容纳最大人数为5人
public override void OnJoinRandomFailed(short returnCode, string message)
{
Debug.Log("------加入房间失败------");
Debug.Log("------建立新房间,最大可容纳5人------");
PhotonNetwork.CreateRoom("RoomName",new RoomOptions { MaxPlayers = 5 });
}
//创建房间成功
public override void OnCreatedRoom()
{
Debug.Log("------创建房间成功------");
}
//创建房间失败
public override void OnCreateRoomFailed(short returnCode, string message)
{
Debug.Log("------创建房间失败------");
}
//加入房间成功,并跳转场景至游戏界面
public override void OnJoinedRoom()
{
Debug.Log("------加入房间成功------");
PhotonNetwork.LoadLevel(sceneIndex);
}
//离开房间时调用
public override void OnLeftRoom()
{
Debug.Log("------离开房间------");
}
//离开大厅时调用
public override void OnLeftLobby()
{
Debug.Log("------离开大厅------");
}
}
各个回调函数的注释已经写的很详细了,就不再一一介绍了。编写完成后,在button上添加点击后所要触发的方法ClickBtn()
可以开始运行然后点击连接测试一下,下图是我运行测试的结果
- 场景跳转后,做个简单的交互(WASD键控制player移动)
这里虽然简单但是值得注意的是因为我们需要在网络中同步别的玩家,因此我们在做玩家这种预制体的时候需要加两个组件,分别是PhotonView和PhotonTransformView。还有就是需要将预制体放到一个名为Resource的文件夹下,这样引擎才能根据这个目录找到我们的player。
交互的代码我写在了一个空物体上,命名为GameManager上
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//引入命名空间
using Photon.Pun;
public class GameManager : MonoBehaviourPun //继承MonoBehaviourPun类
{
[SerializeField]
private GameObject Player;
private GameObject go = null;
//游戏一开始就把玩家实例话出来
private void Awake()
{
go = PhotonNetwork.Instantiate(Player.name, Vector3.zero, Quaternion.identity);
}
/// <summary>
/// WASD键跟新player的位置信息
/// </summary>
private void Update()
{
go.transform.position += Input.GetAxis("Horizontal") * Vector3.right * 0.4f;
go.transform.position += Input.GetAxis("Vertical") * Vector3.forward * 0.4f;
}
}
- 导出保存并运行