peerunity挖矿
A. 准备自学unity3D,从C#开始。。。请问是买Macbookpro好还是PC台式机好
当然是PC了,C#是运行在.NET平台上的,而.NET对MacOS系统非常不友好,因此还是推荐WIndows系统的PC
B. unity 运行没问题 出的apk经常与服务器断开连接是什么回事
最近被一个问题纠缠了好久,终于找到解决办法,这里做个记录。
我们做的一款游戏在编辑器里跑的好好的,一打包的手机上就各种崩溃;
而且是不确定什么时候出现,用logcat查看了系统日志,就看到是异常地址访问的log,没有什么有价值的信息。
重复试了好多次之后,发现每次进一个测试关卡的时候必闪退,于是一路上加日志,希望能知道是哪一句导致程序崩溃。
加到最后,场景加载完了,一切都正常。可以推断加载场景过程没问题,应该是在某一个组件脚本的update里面出问题的。
这下线索又断了,因为挂update的组件太多,而且不知道有哪些组件运行;这里就想到一个想法,我们以后的代码应该都由程序自己去调用update,
不要直接用u3d的update,这样我们可以很容易的知道哪些代码在运行,而且是可以保证调用次序的。
接着想了个办法,就是进场景后,逐个把有update的函数禁用,发现某个组件禁用后就不闪退了,于是问题定位到这个组件的update函数。
通过逐条的增加日志,最终定位到一个空引用访问上,导致程序在安卓机上闪退!怀疑是安卓sdk在运行时的jit直接变成了机器指令,导致可能的空异常。
这个问题让我很惊讶,原来以为会抛出空引用异常,没想到很c#的空指针访问一样会导致进程崩溃。于是组织大家把所有可能为空的地方排查可一遍。
另外在编辑器里没问题,是因为编辑器里加载资源是同步加载的,所以加载完直接使用加载后的对象是没问题的;
但是在手机上要从assertbundle中加载,使用了异步过程,会导致后续的访问可能存在访问空异常;
于是把编辑器里的加载也改成异步加载,编辑器中就能跟手机上一样的加载过程,尽量暴露手机上运行可能出现的问题
C. PhotonServer服务器连接mysql数据库报错,实在无力了,求大神!
本文将对NHibernate数据进行简单封装,方便在PhotonServer服务器中进行调用
[csharp]view plain
usingNHibernate;
usingNHibernate.Cfg;
usingMyGameServer.Domain;
usingNHibernate.Criterion;
usingSystem.Collections.Generic;
namespaceMyGameServer.Helper
{
{
=null;
privatestaticISessionsession=null;
{
get
{
if(sessionFactory==null)
{
Configurationcfg=newConfiguration();
//解析固定路径配置文件nhibernate.cfg.xml
cfg.Configure();
//映射目标程序集解析映射文件Student.xml......
cfg.AddAssembly(typeof(Student).Assembly);
//获取会话对象
sessionFactory=cfg.BuildSessionFactory();
}
session=sessionFactory.OpenSession();
returnsession;
}
privateset{}
}
//添加行
publicstaticvoidAddData<T>(Tt)
{
using(ISessionsession=GetSession)
{
using(ITransactiontransaction=session.BeginTransaction())
{
GetSession.Save(t);
transaction.Commit();
}
}
}
//添加列
publicstaticvoidRemoveData<T>(Tt)
{
using(ISessionsession=GetSession)
{
using(ITransactiontransaction=session.BeginTransaction())
{
GetSession.Delete(t);
transaction.Commit();
}
}
}
//通过ID获取对象
publicstaticTGetDataById<T>(intid)
{
using(ISessionsession=GetSession)
{
using(ITransactiontransaction=session.BeginTransaction())
{
Tt=session.Get<T>(id);
transaction.Commit();
returnt;
}
}
}
///<summary>
///通过名称获取对象
///</summary>
///<typeparamname="T">需要获取的对象</typeparam>
///<paramname="dataBaseName">在数据库中的列名称</param>
///<paramname="targetName">获取对象的目标名</param>
///<returns></returns>
publicstaticTGetDataByName<T>(stringdataBaseName,stringtargetName)
{
using(ISessionsession=GetSession)
{
Tt=session.CreateCriteria(typeof(T)).Add(Restrictions.Eq(dataBaseName,targetName)).UniqueResult<T>();
returnt;
}
}
///<summary>
///得到表内的全部对象
///</summary>
///<typeparamname="T"></typeparam>
///<returns></returns>
publicstaticICollection<T>GetAllUsers<T>()
{
using(ISessionsession=GetSession)
{
IList<T>ts=session.CreateCriteria(typeof(T)).List<T>();
returnts;
}
}
//查询是否有符合id和姓名相同的对象
publicstaticboolVerifyUser<T>(paramsobject[]arg)
{
using(ISessionsession=GetSession)
{
Tt=session
.CreateCriteria(typeof(T))
.Add(Restrictions.Eq(arg[0].ToString(),arg[1]))//类属性名属性值
.Add(Restrictions.Eq(arg[2].ToString(),arg[3]))
.UniqueResult<T>();
if(t==null)
{
returnfalse;
}
returntrue;
}
}
///<summary>
///更新数据表
///</summary>
///<typeparamname="T">数据表映射的对象</typeparam>
///<paramname="t"></param>
publicstaticvoidUpdateData<T>(Tt)
{
using(ISessionsession=GetSession)
{
using(ITransactiontransaction=session.BeginTransaction())
{
session.Update(t);
transaction.Commit();
}
}
}
}
}
usingNHibernate;
usingNHibernate.Cfg;
usingLJL.Domain;
usingLJL.Helper;
namespaceLJL
{
classProgram
{
staticvoidMain(string[]args)
{
Studentsd=newStudent{mID=6,mName="小张",mScore=10};
NHibernateHelper.AddData(sd);
}
}
}
usingExitGames.Client.Photon;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
:MonoBehaviour
{
[HideInInspector]
//该请求的操作类型
publicCollective.OperationModeoperationMode=Collective.OperationMode.Default;
publicvirtualvoidStart(){}
();
();
}
usingExitGames.Client.Photon;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
usingUnityEngine.UI;
publicclassLoginRequest:BaseRequest
{
//用户名
privateInputFieldmInputName;
//密码
;
publicoverridevoidStart()
{
operationMode=Collective.OperationMode.LOGIN;
GameContext.GetInstance.AddRequest(this);
mInputName=GameObject.Find("IDInputField").GetComponent<InputField>();
mInputPassword=GameObject.Find("NameInputField").GetComponent<InputField>();
//登录按钮点击事件
GameObject.Find("LoginButton").GetComponent<Button>().onClick.AddListener(()=>{OnOperationRequest();});
}
()
{
GameContext.GetInstance.peer.OpCustom(
(byte)this.operationMode,
newDictionary<byte,object>{{(byte)Collective.ParameterMode.NAME,mInputName.text},{(byte)Collective.ParameterMode.PASSWORD,mInputPassword.text}},
true
);
}
()
{
Collective.OperationResultresultCode=(Collective.OperationResult)operationResponse.ReturnCode;
if(resultCode==Collective.OperationResult.SUCCESS)
{
//登录成功
Debug.Log("用户登录成功");
}
elseif(resultCode==Collective.OperationResult.FAIL)
{
//登录失败
Debug.Log("登录失败");
}
}
}
usingSystem.Linq;
usingSystem.Collections.Generic;
usingUnityEngine;
usingUnityEngine.UI;
usingExitGames.Client.Photon;
publicclassGameContext:MonoBehaviour,IPhotonPeerListener
{
///<summary>
///存储操作类型与请求
///</summary>
publicDictionary<Collective.OperationMode,BaseRequest>requestDic=newDictionary<Collective.OperationMode,BaseRequest>();
publicPhotonPeerpeer;
privatestaticGameContext_instance;
{
get
{
if(_instance==null)
{
_instance=GameObject.Find("GameContext").GetComponent<GameContext>();
}
return_instance;
}
}
publicvoidDebugReturn(DebugLevellevel,stringmessage)
{
}
//接收服务器发来的事件
publicvoidOnEvent(EventDataeventData)
{
switch(eventData.Code)
{
case0:
//获取事件数据
objectvalue=eventData.Parameters.FirstOrDefault(q=>q.Key==1).Value;
Debug.Log(value.ToString());
break;
default:
break;
}
}
//接收响应数据(客户端发送了请求)
publicvoidOnOperationResponse()
{
BaseRequestrequest=requestDic.FirstOrDefault(q=>q.Key==(Collective.OperationMode)operationResponse.OperationCode).Value;
if(request!=null)
{
request.OnOperationResponse(operationResponse);
}
else
{
//获取响应数据失败
Debug.LogError("获取响应数据失败");
}
}
//连接状态发送改变
publicvoidOnStatusChanged(StatusCodestatusCode)
{
Debug.Log("数据连接状态发生的改变:"+statusCode);
}
privatevoidStart()
{
//传输协议UDP、通过Listener接收服务器端的响应
peer=newPhotonPeer(this,ConnectionProtocol.Udp);
//连接本地服务器
peer.Connect("127.0.0.1:5055","MYGameServer");
}
privatevoidUpdate()
{
//和服务器实时保持数据连接
peer.Service();
}
privatevoidOnDestroy()
{
if(peer!=null&&peer.PeerState==PeerStateValue.Connected)
{
//断开连接
peer.Disconnect();
}
}
publicvoidAddRequest(BaseRequestrequest)
{
在主函数调用
[csharp]view plain
运行程序,一切正常,打开SQLyog,在student数据表中添加一行数据
接下来就是在PhotonServer中调用,来实现与MySQL数据库交互
按图下将类、配置文件集成到类库中(注意需要修改下类和配置文件中的程序集及命名空间)
我们的游戏有很多中请求(比如登入、注册请求等等)
所以都继承自BaseRequest
[csharp]view plain
这里博主简单的做了一下登录请求
[csharp]view plain
最后附上上篇博文GameContext脚本,在这里有些地方发生了更新
[csharp]view plain
D. 点点币钱包下载全是英文看不懂怎么办
大部分比特币钱包都是英文版的,因为英文是全球使用范围和使用人数最多的一种语言,大多数全球性的应用型手机APP首先开发是英文版的,其它的版本会随后开通。目前,手机比特币钱包有中文版本的,例如比太钱包。比太钱包是国内的一个技术团队开发运作的,技术团队实力不容小觑,虽然币价不景气,但其团队仍然不离不弃,在不懈的努力,值得尊敬。比太钱包也非常好用,目前支持安卓和苹果系统。
E. UNITY3D游戏下载不了
很简单。多刷新几次。或者点击windows开始--->运行--->输入services.msc 然后在服务里面选Terminal Services右击属性--->将启动类型更改为自动,然后应用--->再右击启动--->保证服务状态为已启动--->关闭窗口。已安装插件的刷新即可。