说一下Photo服务器

误打误撞学习了一下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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值