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右擊屬性--->將啟動類型更改為自動,然後應用--->再右擊啟動--->保證服務狀態為已啟動--->關閉窗口。已安裝插件的刷新即可。