准备环境:
安装PhotonServer。
PhotonServer教程
安装Photon插件。
Photon插件
然后需要打开Photon的官网注册一个账号
登录以后,点击新建一个APP:
类型的话,如果是聊天室可以选择Photon Chat,普通的选择Photon PUN就可以了
复制App ID,到Unity项目中的Photon/PhotonUnityNetworking/Resources/PhotonServerSettings的
App Id Realtim
Photon云端服务器不稳定,所以在Server Address填上服务器IP地址
Server Port写5058,
然后就是代码设置:
随便找个场景中的物体挂载这三个脚本,脚本是插件自带的。
ConnectAndJoinRandom 这个脚本自动连接到PhotonServer,尝试加入一个随机的房间,如果没有发现并创建一个。
DemoBoxesGui是运行时在左下角显示连接状态的,并会生成一个ongui按钮,实现断开与连接,可以不挂载。(新版插件已删除)
ShowStatusWhenConnecting 是在登录时在屏幕中间显示连接状态,可以不挂载。(新版插件已删除)
1.新建场景,新建一个Plane,和Cube,将Cube设成预制体,放到Resouces文件夹:
2.给Cube加上Photon View组件,如果要同步的话,这个组件是必须的
将Cube的Transform拖入Observed Components
Observe Option字段让你选择更新如何发送以及何时被发送。该字段还会影响到OnPhotonSerializeView被调用的频率。
Off 顾名思义,关掉。如果该PhotonView被保留为RPCs限定时可以很有用。
Unreliable 更新如是被发送,但可能会丢失。这个想法是,下一次更新很快到来,并提供所需的正确的/绝对的值。这对于位置和其他绝对数据来说是有利的,但对于像切换武器这样触发器来说是不好的。当用于同步的游戏对象的位置,它会总是发送更新,即使该游戏对象停止运动(这是不好的)。
Unreliable on Change 将检查每一个更新的更改。如果所有值与之前发送的一样,该更新将作为可靠的被发送,然后所有者停止发送更新直到事情再次发生变化。这对于那些可能会停止运动的以及暂时不会创建进一步更新的游戏对象来说是有利的。例如那些在找到自己的位置后就不再移动的箱子。
Reliable Delta Compressed 将更新的每个值与它之前的值进行比较。未更改的值将跳过以保持低流量。接收端只需填入先前更新的值。任何你通过OnPhotonSerializeView写入的都会自动进行检查并以这种方式被压缩。如果没有改变, OnPhotonSerializeView不会在接收客户端调用。该“可靠的”部分需要一些开销,所以对于小的更新,应该考虑这些开销。
3.新建脚本ClickFloor,将脚本付给Plane
using Photon.Pun;
using UnityEngine;
public class ClickFloor : MonoBehaviour
{
public GameObject m_Prefab;
void Update()
{
if (Input.GetMouseButtonDown(1))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
PhotonNetwork.Instantiate(m_Prefab.name, hit.point + new Vector3(0, 3, 0), Quaternion.identity, 0);
}
}
}
}
using UnityEngine;
using Photon.Pun;//导入Photon命名空间
using Photon.Realtime;
public class PhotonConnect : MonoBehaviour
{
void Start()
{
//初始化版本号
PhotonNetwork.ConnectUsingSettings();
PhotonNetwork.GameVersion = "1";
}
//按钮事件 创建房间
public void Btn_CreateRoom(string _roomName)
{
//设置房间属性
RoomOptions m_Room = new RoomOptions { IsOpen = true, IsVisible = true, MaxPlayers = 4 };
PhotonNetwork.CreateRoom(_roomName, m_Room);
}
//根据房间名加入房间
public void Btn_JoinRoom(string _roomName)
{
PhotonNetwork.JoinRoom(_roomName);
}
//随机加入已经创建的房间
public void Btn_JoinRandomRoom()
{
PhotonNetwork.JoinRandomRoom();
}
void OnGUI()
{
//显示连接信息
GUILayout.Label(PhotonNetwork.NetworkClientState.ToString(), GUILayout.Width(300), GUILayout.Height(100));
}
}
5.将脚本付给Main Camera(任意一个场景中的对象就行),然后新建3个按钮,绑定事件:
6.Cube预制体Apply一下,然后从场景中删除,运行,运行后看到左上角出现
参考:恬静的小魔龙