说一下Photo服务器

2023-11-17

误打误撞学习了一下Photo服务器,自己去百度上找,有些问题大家也没说清楚,所以,在这里补充说明一下:

现在Photo官网已经更新到4.0.29(说不定有更新了),但是很多教程都是Photo3.0的版本,虽然大体还是差不多,但是对于初学者来说还是非常苦恼的

所以本人在这提供Photo3.0版本的下载链接:链接:http://pan.baidu.com/s/1pL16a2v 密码:hvwi

我使用Photo中提供的Lite实现了一个简单的聊天,因为Lite服务器中没有聊天的事件,所以我们要自己写并且注册聊天事件

首先我们仿照Lite服务器中的事件使用枚举声明聊天事件

然后,在OnGUI函数中注册这个事件:

 然后,在OnEvent()函数中就可以半段这个方法了:

完成这些,一个简单的聊天的程序就完成了,附上完整的脚本。

using UnityEngine;
using System.Collections;
using ExitGames.Client.Photon;
using ExitGames.Client.Photon.Lite;
using System.Collections.Generic;

public class GameClient : MonoBehaviour,IPhotonPeerListener {

    // Use this for initialization
    LitePeer peer;

    public enum ChatEventCode : byte { Chat = 10}
    public enum ChatEventKey : byte { UserName = 11,ChatMessage = 12}
    void Start () {
        peer = new LitePeer(this, ConnectionProtocol.Udp);
        peer.Connect("127.0.0.1:4530","Lite");

    }
    
    // Update is called once per frame
    void Update () {
        peer.Service();
    }

    void SendMessage(OperationRequest operationRequest)
    {
    
        peer.OpCustom(operationRequest,true,0,false);
    }

    string Username = "";
    string Message = "";
    string chatMessage = "";
    Dictionary<int, string> ActorLister = new Dictionary<int, string>();

    void OnGUI()
    {
        Username = GUI.TextField(new Rect(Screen.width / 2 - 50, 70, 100, 20), Username);
        if(GUI.Button(new Rect(Screen.width/2-50,100,100,30),"进入游戏房间"))
        {
            Hashtable gameProperties, actorProperties;
            gameProperties = new Hashtable();
            actorProperties = new Hashtable();
            actorProperties.Add((byte)ChatEventKey.UserName, Username);  
            peer.OpJoin("LOL",gameProperties,actorProperties,true);
            
        }

        if (GUI.Button(new Rect(Screen.width / 2 - 50, 150, 100, 30), "离开游戏房间"))
        {
            peer.OpLeave();
        }

        GUI.Label(new Rect(Screen.width / 2 - 50, 200, 150, 20), Message);

        chatMessage = GUI.TextField(new Rect(Screen.width / 2 - 50, 250, 150, 20), chatMessage);

        if (GUI.Button(new Rect(Screen.width / 2 - 50, 300, 100, 30), "发送消息"))
        {
            Hashtable chatConent = new Hashtable();
            chatConent.Add(ChatEventKey.ChatMessage,chatMessage);
            peer.OpRaiseEvent((byte)ChatEventCode.Chat,chatConent,true);
        }
    }

    public void DebugReturn(DebugLevel level, string message)
    {
        Debug.Log(message);
    }

    public void OnEvent(EventData eventData)
    {
        Debug.Log(eventData.ToStringFull());
        switch (eventData.Code)
        {
            case LiteEventCode.Join:
                {
                    string userName = ((Hashtable)eventData.Parameters[LiteEventKey.ActorProperties])[(byte)ChatEventKey.UserName].ToString();
                    Message = "玩家" + userName + "进入游戏";
                    int actNum = (int)eventData.Parameters[LiteEventKey.ActorNr];
                    if (!ActorLister.ContainsKey(actNum))
                    {
                        ActorLister.Add(actNum, userName);
                    }
                    else
                    {
                        ActorLister[actNum] = userName;
                    }
                }
                break;
            case LiteEventCode.Leave:
                {
                    int actNum = (int)eventData.Parameters[LiteEventKey.ActorNr];
                    if (ActorLister.ContainsKey(actNum))
                    {
                        Message = "玩家" + ActorLister[actNum] + "离开游戏";
                    }
                }
                break;
            case (byte)ChatEventCode.Chat:
                {
                    Hashtable customEventContent = eventData.Parameters[LiteEventKey.Data] as Hashtable;
                    string Chatmessage = customEventContent[(byte)ChatEventKey.ChatMessage].ToString();
                    int actNum = (int)eventData.Parameters[LiteEventKey.ActorNr];
                    if (ActorLister.ContainsKey(actNum))
                    {
                        Message = ActorLister[actNum] + "说:"+Chatmessage;
                    }
                }
                break;
        }
    }

    public void OnOperationResponse(OperationResponse operationResponse)
    {
        Debug.Log("Server response"+operationResponse.ToStringFull());
        switch (operationResponse.OperationCode)
        {
            case LiteOpCode.Join:
                {
                    int num = (int)operationResponse.Parameters[LiteOpKey.ActorNr];
                    Debug.Log("进入游戏房间,玩家编号:"+num);
                }
                break;
            case LiteOpCode.Leave:
                {
                    Debug.Log("离开游戏房间");
                }
                break;
            default:
                ExcuteMessage(operationResponse);
                break;
        }
    }

    void ExcuteMessage(OperationResponse operationResponse)
    {

    }

    public void OnStatusChanged(StatusCode statusCode)
    {
       switch(statusCode)
       {
           case StatusCode.Connect:
               Debug.Log("Connect Success");
               break;
           case StatusCode.Disconnect:
               Debug.Log("Connect faile");
               break;
           case StatusCode.ExceptionOnConnect:
               Debug.Log("Exception");
               break;
       }
    }
}

转载于:https://www.cnblogs.com/cJJJ/p/6758061.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

说一下Photo服务器 的相关文章

  • BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.NullPointerException

    集成mybatis plus sqlSessionFactory改为MybatisSqlSessionFactoryBean后 项目无法启动
  • 团队新人多,稳定性经验不足,研发质量怎么保障?|TakinTalks论道

    一分钟精华速览 在研发和稳定性保障过程中 人与设备 程序 组织的交互是一个复杂的过程 虽然人们极少会恶意犯错 但由于受特定情景下的实际条件影响 人为失误也时有发生 那么 如何尽可能减少这些失误的发生 如何保障研发质量和系统稳定 TakinT
  • 读《大数据时代》有感

    大数据时代 读后感 大数据时代 这本书主要描述的是大数据时代到临人们生活 工作与思维各方面所遇到的重大变革 文中清晰的阐述了大数据的基本概念和特点 并列出明确的观点 不管对于产业实践者 还是对于政府和公众机构 都非常具有价值 作者将本书分为
  • STM32系列(HAL库)——F103C8T6驱动WS2812全彩RGB模块(PWM+DMA方式)

    1 软件准备 1 编程平台 Keil5 2 CubeMX 2 硬件准备 1 某宝买的RGB模块 4个灯珠级联 2 F1的板子 本例使用经典F103C8T6 3 ST link 下载器 4 杜邦线若干 3 模块资料 1 模块简介 没什么比手册
  • 图像目标检测之cascade-rcnn实践

    最近一直在调试目标检测方面的模型 其中mmdetection中就集成了许多的目标检测模型 其中表现比较好的模型中有cascade rcnn 因此也趁这个机会具体了解一下这个模型的发展脉络 1 模型原理 在two stage模型中 常见都会预
  • 【网络云盘客户端】——项目简介

    项目简介 网络云盘客户端时基于QT C 框架实现了一个网络云盘客户端软件 主要功能包括用户的注册 登录 显示用户的个人文件列表 以及文件的上传 下载 删除 共享文件 登录界面 主窗口界面 文件属性对话框 文件展示列表 上传文件 详细实现参考
  • 【图像处理】 常用边缘检测算法对比分析

    边缘的定义 首先介绍什么是边缘 在数字图像中 边缘是指图像局部变化最显著的部分 边缘主要存在于目标与目标 目标与背景之间 是图像局部特性的不连续性 如灰度的突变 纹理结构的图标 颜色的图标等 尽管图像的边缘点产生的原因各不相同 但他们都是图

随机推荐

  • [操作系统] 分页存储管理中的页表项长度

    看到很多人有疑问 读到这里的时候我也有疑问的 在操作系统的分页存储管理方式中 写道 将页表始址与页号和页表项长度的乘积相加 便得到该表项在页表中的位置 于是可从中得到该页的物理块号 将之装入物理地址寄存器中 列出式子出来 页表始址 页号x页
  • Java excel poi 下载模板功能无法在Microsoft Excel 打开,但是可以WPS Excel打开

    问题 并且只显示前几个字段 后面的几个字段不显示 版本使用
  • 我的 Android 求职简历

    昨晚在Diycode的微信交流群里面 有位在校的童鞋想要找一份开发的实习工作 他把简历做好后在群上共享了一份 我看到后便下载了一份 看了看简历内容 我在想如果我是招聘单位看简历的 这份简历可以说是基本没戏的 因为内容基本和开发没有多大关系
  • Qt5Error:msvc-version.conf loaded but QMAKE_MSC_VER ins‘t set

    错误描述 msvc version conf loaded but QMAKE MSC VER ins t set 解决方案 这种情况一般都是修改了项目的配置之后出现的 也就是 qmake stash文件出错 删除这个文件再进行重新编译即可
  • 基于python的布尔盲注爆破脚本(sqli-libs第八关)

    写这个脚本的原因是因为布尔爆破步骤的繁琐 因此写下这个半自动化脚本来提升效率 只需输入url和标志词便可开始爆破 下面结合sqli libs第八关来详细说明 这一关是布尔盲注 布尔盲注用于页面没有回显的情况下 但是心细的同学会发现当我们注入
  • 使用Microsoft.Reporting. WebForms中ReportViewer报表查看器(Server方式)

    添加Web Reference http
  • Flex程序编译

    Makefile三要素 目标 依赖 命令 详解可见makefile 编写 周北 CSDN博客 makefile 编写 Makefile中常用函数和自动化变量 wildcard 扩展通配符 例 OBJECTS wildcard o 该找到目标
  • C++构造函数中不调用虚函数的原因

    今天在看网上一篇帖子的时候看到这个问题 试讲关于C 对象虚函数表和类型信息的 RTTI 的 正好看到了如下内容 这个是为什么在构造函数中不能调用虚函数的原因 因为任何时候在基类中的虚函数调用 都不可能到达子类的实现 因为子类的虚表初始化是在
  • [docker]搭建elasticsearch服务

    1 拉取镜像 docker pull elasticsearch 8 7 0 如果需要其他版本的话 访问 Dockerhttps hub docker com ela
  • QT从入门到入土(四)——文件的读写操作

    引言 文件的读写是很多应用程序具有的功能 甚至某些应用程序就是围绕着某一种格式文件的处理而开发的 所以文件读写是应用程序开发的一个基本功能 Qt 提供了两种读写纯文本文件的基本方法 用 QFile 类的 IODevice 读写功能直接进行读
  • uniapp中的分享功能实现(APP,小程序,公众号)

    uniapp中的分享功能实现 APP 小程序 公众号 1 APP端的分享 app端的分享可以直接使用uniapp封装的方法uni share uni app的App引擎已经封装了微信 QQ 微博的分享SDK 开发者可以直接调用相关功能 可以
  • Android交叉编译OpenCV+FFmpeg+x264的艰难历程

    前言 如果你没有兴趣看完本文 只想获得可编译的代码或编译后的产物 可以直接点击下面的链接 跟随步骤编译代码或直接下载我编译好的产物 注 编译顺序要按照 x264 gt FFmpeg gt OpenCV 这样来 x264 FFmpeg Ope
  • 使用less处理重复性background-image定位问题

    1 问题描述 使用angular的列表循环解释问题 其他框架类似 css上面使用flex布局 index html代码 div class container div class item div class div p class ite
  • CH3-HarmonyOS开发基础

    文章目录 背景 目标 一 APP 1 1 APP包组成 1 2 APP和HAP结构 二 Ability 2 1 Ability 2 2 pack info 三 libs库文件 3 1 HAR 四 resources资源文件 4 1 reso
  • shiro框架---关于用户登录退出接口的介绍

    接上一篇文章shiro框架 shiro配置用户名和密码的注意 项目已分享到GitHub上 如果需要的可以看下 springboot shiro项目Git下载地址 在我前几篇文章里有shiro配置的文件下载包 下载后里边有四个配置文件Shir
  • 618省心凑背后的新算法——个性化凑单商品打包购推荐

    作为购物导购链路的一个重要环节 凑单旨在快速帮助用户找到达成某个满减门槛 比如满300减50 的商品 完成性价比最高的跨店组合结算 前言 背景 凑单是一个历史悠久的场景 伴随着长期优化并不断升级 为用户决策提供了便捷通道 作为购物导购链路的
  • Nginx部署前端,并转发2个后台,实现负载均衡

    一 vue打包 cmd进入项目目录 执行 npm run build 会在改目录生成dist文件 假设dist目录是 D dist 二 部署 下载nginx 修改nginx conf 在http 中加入 upstream myapp1 se
  • 在SQL中直接使用存储过程查询返回的结果集

    在实际使用存储过程是 有时我们希望先判断存储过程的返回结果集是否有记录 然后走不同的业务逻辑 这是就需要在SQL语句中直接读取到存储过程的返回结果集 方式如下 先按照存储过程结果集定义一个变量 declare tbl table 门诊号 v
  • js预编译(与C预处理区别)

    目录 1 函数体内 例 2 全局 注 window 属性和 imply global属性 3 全局和函数体内结合 优先顺序 例1 例2 例3 重要提示 第一次学的时候以为和C预处理差不多 看了下才发现区别还蛮大的 例1 test 打印出 a
  • 说一下Photo服务器

    误打误撞学习了一下Photo服务器 自己去百度上找 有些问题大家也没说清楚 所以 在这里补充说明一下 现在Photo官网已经更新到4 0 29 说不定有更新了 但是很多教程都是Photo3 0的版本 虽然大体还是差不多 但是对于初学者来说还