photon连mysql_PhotonServer服务器连接mysql数据库报错,实在无力了,求大神!

using NHibernate;

using NHibernate.Cfg;

using MyGameServer.Domain;

using NHibernate.Criterion;

using System.Collections.Generic;

namespace MyGameServer.Helper

{

public static class NHibernateHelper

{

private static ISessionFactory sessionFactory = null;

private static ISession session = null;

public static ISession GetSession

{

get

{

if (sessionFactory == null)

{

Configuration cfg = new Configuration();

//解析固定路径配置文件nhibernate.cfg.xml

cfg.Configure();

//映射62616964757a686964616fe59b9ee7ad9431333365633835目标程序集 解析映射文件 Student.xml ......

cfg.AddAssembly(typeof(Student).Assembly);

//获取会话对象

sessionFactory = cfg.BuildSessionFactory();

}

session = sessionFactory.OpenSession();

return session;

}

private set { }

}

//添加行

public static void AddData(T t)

{

using (ISession session = GetSession)

{

using (ITransaction transaction=session.BeginTransaction())

{

GetSession.Save(t);

transaction.Commit();

}

}

}

//添加列

public static void RemoveData(T t)

{

using (ISession session = GetSession)

{

using (ITransaction transaction = session.BeginTransaction())

{

GetSession.Delete(t);

transaction.Commit();

}

}

}

//通过ID获取对象

public static T GetDataById(int id)

{

using (ISession session = GetSession)

{

using (ITransaction transaction = session.BeginTransaction())

{

T t = session.Get(id);

transaction.Commit();

return t;

}

}

}

/// 

/// 通过名称获取对象

/// 

/// 需要获取的对象

/// 在数据库中的列名称

/// 获取对象的目标名

/// 

public static T GetDataByName(string dataBaseName, string targetName)

{

using (ISession session = GetSession)

{

T t = session.CreateCriteria(typeof(T)).Add(Restrictions.Eq(dataBaseName, targetName)).UniqueResult();

return t;

}

}

/// 

/// 得到表内的全部对象

/// 

/// 

/// 

public static ICollection GetAllUsers()

{

using (ISession session = GetSession)

{

IList ts = session.CreateCriteria(typeof(T)).List();

return ts;

}

}

//查询是否有符合id和姓名相同的对象

public static bool VerifyUser(params object[] arg)

{

using (ISession session = GetSession)

{

T t = session

.CreateCriteria(typeof(T))

.Add(Restrictions.Eq(arg[0].ToString(), arg[1]))//类属性名 属性值

.Add(Restrictions.Eq(arg[2].ToString(), arg[3]))

.UniqueResult();

if (t == null)

{

return false;

}

return true;

}

}

/// 

/// 更新数据表

/// 

/// 数据表映射的对象

/// 

public static void UpdateData(T t)

{

using (ISession session = GetSession)

{

using (ITransaction transaction=session.BeginTransaction())

{

session.Update(t);

transaction.Commit();

}

}

}

}

}

在主函数调用

[csharp] view plain copy

using NHibernate;

using NHibernate.Cfg;

using LJL.Domain;

using LJL.Helper;

namespace LJL

{

class Program

{

static void Main(string[] args)

{

Student sd = new Student { mID = 6, mName = "小张", mScore = 10 };

NHibernateHelper.AddData(sd);

}

}

}

运行程序,一切正常,打开SQLyog,在student数据表中添加一行数据

接下来就是在PhotonServer中调用,来实现与MySQL数据库交互

按图下将类、配置文件集成到类库中(注意需要修改下类和配置文件中的程序集及命名空间)

4c17b0ad8cf0954f50a0d516f823ea06.png

接下来就是在Unity3d游戏客户端中与PhotonServer通信进而访问本地数据库

在Unity3d客户端上创建UI(这里简单拖入输入框和按钮)

如下图创建脚本

c31c075e41362a437ce8f5bcfae6fbf6.png

我们的游戏有很多中请求(比如登入、注册请求等等)

所以都继承自BaseRequest

[csharp] view plain copy

using ExitGames.Client.Photon;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public abstract class BaseRequest : MonoBehaviour

{

[HideInInspector]

//该请求的操作类型

public Collective.OperationMode operationMode = Collective.OperationMode.Default;

public virtual void Start() { }

public abstract void OnOperationRequest();

public abstract void OnOperationResponse(OperationResponse operationResponse);

}

这里博主简单的做了一下登录请求

[csharp] view plain copy

using ExitGames.Client.Photon;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

public class LoginRequest : BaseRequest

{

//用户名

private InputField mInputName;

//密码

private InputField mInputPassword;

public override void Start()

{

operationMode = Collective.OperationMode.LOGIN;

GameContext.GetInstance.AddRequest(this);

mInputName = GameObject.Find("IDInputField").GetComponent();

mInputPassword = GameObject.Find("NameInputField").GetComponent();

//登录按钮点击事件

GameObject.Find("LoginButton").GetComponent().onClick.AddListener(() => { OnOperationRequest(); });

}

public override void OnOperationRequest()

{

GameContext.GetInstance.peer.OpCustom(

(byte)this.operationMode,

new Dictionary { { (byte)Collective.ParameterMode.NAME, mInputName.text }, { (byte)Collective.ParameterMode.PASSWORD, mInputPassword.text } },

true

);

}

public override void OnOperationResponse(OperationResponse operationResponse)

{

Collective.OperationResult resultCode = (Collective.OperationResult)operationResponse.ReturnCode;

if (resultCode == Collective.OperationResult.SUCCESS)

{

//登录成功

Debug.Log("用户登录成功");

}

else if(resultCode == Collective.OperationResult.FAIL)

{

//登录失败

Debug.Log("登录失败");

}

}

}

最后附上上篇博文GameContext脚本,在这里有些地方发生了更新

[csharp] view plain copy

using System.Linq;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

using ExitGames.Client.Photon;

public class GameContext : MonoBehaviour,IPhotonPeerListener

{

/// 

/// 存储操作类型与请求

/// 

public Dictionary requestDic = new Dictionary();

public PhotonPeer peer;

private static GameContext _instance;

public static GameContext GetInstance

{

get

{

if (_instance == null)

{

_instance = GameObject.Find("GameContext").GetComponent();

}

return _instance;

}

}

public void DebugReturn(DebugLevel level, string message)

{

}

//接收服务器发来的事件

public void OnEvent(EventData eventData)

{

switch (eventData.Code)

{

case 0:

//获取事件数据

object value = eventData.Parameters.FirstOrDefault(q => q.Key == 1).Value;

Debug.Log(value.ToString());

break;

default:

break;

}

}

//接收响应数据(客户端发送了请求)

public void OnOperationResponse(OperationResponse operationResponse)

{

BaseRequest request = requestDic.FirstOrDefault(q => q.Key == (Collective.OperationMode)operationResponse.OperationCode).Value;

if (request != null)

{

request.OnOperationResponse(operationResponse);

}

else

{

//获取响应数据失败

Debug.LogError("获取响应数据失败");

}

}

//连接状态发送改变

public void OnStatusChanged(StatusCode statusCode)

{

Debug.Log("数据连接状态发生的改变:" + statusCode);

}

private void Start()

{

//传输协议UDP 、 通过Listener接收服务器端的响应

peer = new PhotonPeer(this, ConnectionProtocol.Udp);

//连接本地服务器

peer.Connect("127.0.0.1:5055", "MYGameServer");

}

private void Update()

{

//和服务器实时保持数据连接

peer.Service();

}

private void OnDestroy()

{

if (peer != null && peer.PeerState == PeerStateValue.Connected)

{

//断开连接

peer.Disconnect();

}

}

public void AddRequest(BaseRequest request)

{

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值