ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Unity 使用Photon Server 联网开发(二)

2021-09-06 15:00:19  阅读:327  来源: 互联网

标签:同步 Photon void photon transform Server Unity position rotation


photon联机的配置:

直接去官网下载Pun的资源包导入项目,设置PhotonServerSettings配置文件,配置appid、通讯协议、服务器地址、端口号;服务器地址可以配置成自己本地服务器、云服务器、直接使用photon服务器。也可以查看photon server 联机配置

photon server服务器配置:

官网下载photoncontrol,配置流程很简单:photon server 联机配置

获取房间列表的方式:

  • PUN2之前:调用PhotonNetwork.GetRoomList() 就可以了,但是如果刚进入大厅就获取,可能数据还没来得及同步,可以进入大厅后写个回调等一会再获取;
  • PUN2:PUN2把GetRoomList方法去掉了,可以继承MonoBehaviourPunCallbacks;重写OnRoomListUpdate这个回调,当大厅内的房间列表发生变化是,会自动调用。
 	/// <summary>
    /// 刷新房间列表回调
    /// </summary>
    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        Debug.Log("刷新房间列表");        
    }

主动刷新房间列表:调一下GetCustomRoomList(PhotonNetwork.urrentLobby,null)

 private void Start()
    {
        // 刷新房间列表(此时要处于一个游戏大厅才行)
        // 参数1:游戏大厅;参数2:查找条件;null为所有房间列表
        PhotonNetwork.GetCustomRoomList(PhotonNetwork.CurrentLobby, null);
    }

    /// <summary>
    /// 刷新房间列表回调
    /// </summary>
    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        Debug.Log("刷新房间列表");        
    }

PS:

  • photon前期配置流程很简单,photon PUN的开发API,网上资料大部分都是PUN2之前的例子,比较老了,PUN2的例子很少,但其实使用起来都差不多的,不了解可以直接找源码PhotonNetWork.cs看暴露的属性及方法,注释写的也很详细。联机开发进入大厅,展示房间列表,创建房间/加入房间;基本上就是一套固定的流程;
  • 当本地连接服务器时,如果photon server正常运行但unity链接不上,关闭电脑的安全管家等软件再试一下。如果还不行请查看电脑是否开放了指定的端口号。photon默认的端口号是5055。

photon同步方式:

**1)同步物体上挂载photon view组件,该组件可以同步你想同步的组件数据。现在photon自身支持同步transform、rigidbody和animator。
在这里插入图片描述

***2)***自己编写支持photon view同步方式的同步脚本,想要同步的脚本继承一个接口就行;IPunObservable实现接口的方法;在方法内效仿transform的同步方式写自己想要同步的数据。

using Photon.Pun;
using UnityEngine;

public class MySyncScript : MonoBehaviourPun, IPunObservable
{
    public bool isSyncPostion;
    public bool isSyncRotation;

    public bool isLerp = true;

    private Vector3 m_position;
    private Quaternion m_rotation;
    private float lerpSpeed = 10.0f;    //内插速度

    //初始化玩家位置与朝向
    private void Start()
    {
        m_position = transform.position;
        m_rotation = transform.rotation;
    }

    private void Update()
    {
        if (!PhotonNetwork.IsConnected) return;

        if (!photonView.IsMine)     //如果玩家对象不属于本地玩家,需要根据接收的数据更新玩家对象的位置与朝向
        {
            SyncData();
        }
    }

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        //本地玩家发送数据
        if (stream.IsWriting)
        {
            if (isSyncPostion)
            {
                stream.SendNext(transform.position);
            }

            if (isSyncRotation)
            {
                stream.SendNext(transform.rotation);
            }
        }
        //远程玩家接收数据
        else
        {
            if (isSyncPostion)
            {
                m_position = (Vector3)stream.ReceiveNext();
            }

            if (isSyncRotation)
            {
                m_rotation = (Quaternion)stream.ReceiveNext();
            }
        }
    }


    /// <summary>
    /// 同步数据
    /// </summary>
    private void SyncData()
    {
        if (isSyncPostion)
        {
            if (isLerp)
            {
                transform.position = Vector3.Lerp(transform.position, m_position, Time.deltaTime * lerpSpeed);   //使用Lerp函数实现玩家的平滑移动
            }
            else
            {
                transform.position = m_position;
            }
        }

        if (isSyncRotation)
        {
            if (isLerp)
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, m_rotation, Time.deltaTime * lerpSpeed);   //使用Lerp函数实现玩家的平滑转动
            }
            else
            {
                transform.rotation = m_rotation;
            }
        }
    }
}

在这里插入图片描述

***3)***RPC同步;该同步方式是给某个/多个客户端发送RPC指令,去执行一个函数;实现方式就是函数名称上面加一个 [PUNRpc] 的标签。在挂载该脚本的物体上挂载一个photon view组件,使用photonview发送数据:photonView.RPC(“FunctionName”, RpcTarget.All, param);

	private void Start()
    {
        photonView.RPC("ReceptionSyncStrMessage", RpcTarget.All, "hello world");
    }
    
    // RPC函数,在信息交互时,所有客户端都会执行这个函数
    // 第一个参数必须为基本类型,如string,int,v3等,第二个参数可不加
    // 如果参数想用自己定义的类型,必要先序列化注册好了之后才能使用。
    /// <summary>
    /// 同步字符串消息
    /// </summary>
    [PunRPC]
    public void ReceptionSyncStrMessage(string message)
    {
        Debug.Log(message);
    }

***4)***注册事件的方式进行同步,这个方式还没有仔细看过,具体实现方式及优缺点也不是很清楚。

PS:

使用photon开发时,会碰到同步位置时运动卡顿、同步延迟的问题。

  • 运动卡顿 使用 差值计算 在本地处理位置达到流畅的效果是可以解决的,在开发该类型的功能时注意自己的实现方式,运动卡顿基本上就可以解决。
  • 同步延迟 我现在所知道的就只有 提高网速、提高服务器的配置 ;也可以把同步消息的频率调高看看能不能解决:PhotonNetwork.SendRate=50;

标签:同步,Photon,void,photon,transform,Server,Unity,position,rotation
来源: https://blog.csdn.net/a0_67/article/details/120133551

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有