一、下载和安装U3D插件
1、下载SDK和运行的API demo
下载SDK解压后打开sample\MatchVSDemo-Unity3D\Assets\MatchVSDemo.unity文件(需安装Unity3D),通过Unity编辑器的菜单Edit->Play(ctrl+p)运行 如下:
可通过Conslole查看运行日志.通过浏览DEMO了解MatchVS的基本功能。
2、运行U3D MatchVS 网络对战游戏Demo(暂未推出)
3、使用MatchVS的U3D插件打开Unity.exe编辑器(新建一个U3D工程或在已有U3D工程上) 通过 Assets ->Import Package->Custom Package 导入下载的插件MatchVS-U3D.unitypackage
4、导入MatchVS-U3D.unitypackage后在U3D工程目录的/Assets/Plugins文件下会出现Android 平台的so,window平台的dll,iOS平台bundle,在Assets/MatchVS下会出现MatchVS的C#接口文件.通过这些接口开发Unity网络对战游戏。
二、调试
通过Unity编辑器调试 如果遇到consle输出错误
Exception: JNI: Init'd AndroidJavaClass with null ptr!
UnityEngine.AndroidJavaClass..ctor (IntPtr jclass) (at C:/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:556)
UnityEngine.AndroidJavaObject.get_JavaLangClass () (at C:/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:534)
请通过Unity编辑器的菜单File->Build Settings(ctrl+shift+B)选择Switch Platfrom为PC,Mac&Linux.
因为这里使用android平台特有的JNI特性.
三、发布
- Window
通过Unity编辑器的菜单File->Build Settings(ctrl+shift+B)选择Switch Platfrom为PC,Mac&Linux,点击Build或者Build And Run 保存为xxxx.exe文件(xxxx应该替换成实际的项目名)
发布成功后会出现xxxx.exe文件和 xxxx_Data目录即为发布成功
Tips : Window平台运行时报如下错误,DllnotFoundException:..\xxxx_Data\Plugins\MatchSDK.dll
请将 ..\xxxx_Data\Plugins\ 下的
libevent_core-2-0-5.dll
libevent_extra-2-0-5.dll
libevent-2-0-5.dll
pthread.dll
拷贝至..\目录下(..\代表xxxx.exe所在目录)
-
Android
通过Unity编辑器的菜单File->Build Settings(ctrl+shift+B)选择Switch Platfrom为Android点击Build或者Build And Run
详细配置请参考Unity Android打包官方教程
如果遇到打包后的APK运行崩溃 并出现如下LOG信息
Invalid serialized file version. File: Expected version: 5.3.3f1. Actual version: 5.3.4f1.
请保持unity3D编辑器和android打包插件(UnitySetup-Android-Support-for-Editor-xxxx.exe)的版本一致(卸载重装unity) 重新打包即可
- tips:
默认Android是正式环境,win为测试1环境.因服务器不同,用户不能相互连接,android与win不能相互通信.
解决方法: 在C#调用初始化接口时使用如下配置 切换到正式环境.使得android与win互通.(建议在win平台测试通过后再切换到正式环境)
MatchVSEngine.getInstance().init(null, MatchVSEngineConfigBuilder.getDefault().setMode(0));
五、对战-接口说明
public interface IMatchVSEngineListener;
以下为接口用于接收来自引擎功能调用后的反馈.
游戏登录
/**
* 登录大厅结果通知
*
* @param ko_lobby_login_rsp_t
*/
void onEnterLobbyRsp(int responseCode);
游戏开始通知
/**
* 游戏开始
*/
void onGameStart(long pRoundID);
更换房主通知
/**
* 房主更换
*
* @param userid 房主ID
*/
void onRoomMasterChanged(int pMasterUserID);
进入房间通知
/**
* 进入房间
* @param 进入房间结果码 小于0为失败,大于0为进入的房间ID
*/
void onEnterRoom(int pRet);
房间成员动态变化通知
/**
* 当前房间动态,房间用户变化
*
* @param pUserID 用户ID
* @param pStatus
*
*/
void onRoomUsersChanged(MatchVSRoomUserState[] pMatchVSRoomUserStates);
房间延迟通知
/**
* 当前房间延迟情况
* @param pMatchVSRoomUserStates 房间每个用户的延迟
*/
void onRoomDelay(MatchVSRoomDelay[] pMatchVSRoomDelay);
游戏结束通知
/**
* 游戏结束 表示游戏已经结束
* @param pScore 空的数据 游戏结果以OnGameResult为准
*/
void onGameOver(MatchVSScore[] pScore);
游戏结果通知
/**
* 游戏结果通知
* @param pScores 所有玩家的游戏对战结果
*/
void onGameResult(int pResultCode, MatchVSScore[] pScores, String pMessage);
接收用户数据通知
/**
* 接收用户数据
*
* @param userid 发送数据的玩家UserID
* @param pData 数据
*/
void onDataReceived(int pUserid, byte[] pData);
引擎异常通知
/**
* 引擎所有异常和错误回调
* @param pErrorCode 错误码
* @param pMessage 错误信息
*/
void onError(int pErrorCode);
退出大厅通知
/**
* 退出大厅成功
*/
void onExitLobby();
MatchVSEngine类说明
对战引擎的所提供的所有功能都通过下列方法实现.
/**
*获得引擎实例
*@return 引擎实例
*//
Public static MatchVSEngine.getinstance();
注册对战引擎监听
/**
*注册对战引擎监听
*@param pListener 监听对象
*//
Public void addMatchVSEngineListener;
反注册对战引擎
/**
*反注册对战引擎监听
*@param pListener 监听对象
*//
Public void removeMatchVSEngineListener;
初始化SDK
/**
* 初始化SDK
*
* @param pApplication
*
* @return
* @throws IllegalAccessException
*/
public bool init(Application pApplication)
进入游戏大厅
/**
* 用户进入大厅和登录游戏授权
*
* @param pDevelopID
* @param pUserID
* @param pGameID
* @param pGameVersion
* @param pToken
* @
*/
public void enterLobby(int pDevelopID, int pUserID, int pGameID, int pGameVersion, String pToken)
退出大厅
/**
* 退出大厅
*
* @return
* @
* @throws NotEntryLobbyException
*/
public void exitLobby()
是否已经初始化
/**
* 是否已经初始化SDK
*
* @return
*/
public bool isInit()
是否已经进入大厅
/**
* 是否进入过大厅
*
* @return
*/
public bool isEnterLobby()
是否游戏中
/**
* 游戏是否开始
* @return
*/
public bool isGameStart()
房间成员准备状态
/**
* 是否其他成员已经准备
*
* @return
*/
public bool isRoomOtherUserReadyed()
传送数据
/**
* 发送数据给房间其他人
*
* @param pRoomUser
* 默认是所有人
* @param pData
* 数据
*/
public void sendData(MatchVSRoomUser pRoomUser, byte[] pData)
传送可靠数据
/**
* 发送数据给房间其他人(可靠,无丢包)
* @param pRoomUser 默认是所有人
* @param pData 数据
* @
*/
public void sendReliableData(MatchVSRoomUser pRoomUser, byte[] pData)
进入房间
/**
*进入某场次内的房间
*@param pRoomID 正数为指定进入房间,0为随机进入房间
*/
public void enterRoom(int pRoomID)
更换房间
/**
* 更换房间,在当前房间中重新进入另一个房间.随机匹配.
*/
public void changeRoom()
退出房间
/**
* 退出房间
*
* @param pRoomID
*/
public void exitRoom(int pRoomID)
准备游戏
/**
* 游戏准备. 多人游戏中房主后准备
*/
public void gameReady()
开始游戏
/**
* 游戏开始 v1.1
*/
public void gameStart()
取消准备
/**
* 取消准备 v1.1
*/
public void gameCancel()
游戏结束
/**
* 结束游戏.
*
* @param pScore
* 游戏得分,用于结算
*/
public void gameOver(MatchVSScore pScore)
反初始化引擎
/**
* 反初始化引擎
*/
public void uninit();
得到引擎状态
/**
* 得到引擎的状态
*
* @return
*/
public int getEngineState()
是否房主
/**
* 是否是房主
* @return
*/
public bool isRoomMaster()
获取房主ID
/**
* 获取房主用户ID
* @return
*/
public int getRoomMasterID()
得到用户对战信息
/**
* 获取用户对战信息
*
* @param pCallBack
* @param pUserID
*/
public void getUserDetail(int pUserID, MatchVSCallback<MatchVSBattleDetail> pCallBack)
登录结果
/**
*登录结果
*/
public void onLogin(int returnCode)
六、错误码
错误码 | 常量 | 说明 |
---|---|---|
CODE_SUCCESS | 0 | 调用方法成功 |
ROOM_RTN_OK | 200 | 成功 |
ROOM_RTN_FAILED | 300 | 调用方法失败 |
CODE_TOKEN_INVALUE | 201 | token无效 |
KO_LOBBY_ERRCODE_AUTH_FAILED | 500 | 认证失败 |
KO_LOBBY_ERRCODE_NO_THIS_USER | 501 | 无此用户 |
KO_LOBBY_ERRCODE_NO_USER_CACHE | 502 | 用户缓存已满 |
KO_LOBBY_ERRCODE_NO_THIS_ROOM | 600 | 无此房间 |
KO_ROOM_ERRCODE_NO_THIS_ROOM | 101 | 无此房间 |
KO_ROOM_ERRCODE_FULL_USERS | 102 | 用户已满 |
KO_ROOM_ERRCODE_ALREADY_IN | 103 | 用户已经在房间内 |
KO_ROOM_ERRCODE_ALREADY_OUT | 104 | 用户已经离开 |
KO_ROOM_ERRCODE_EMPTY | 105 | 房间是空的 |
KO_ROOM_ERRCODE_NO_THIS_USER | 106 | 无此用户 |
KO_ROOM_ERRCODE_NOT_ENOUGH | 107 | 用户钱不够或者金币太多 |
KO_ROOM_ERRCODE_NO_THIS_FIELD | 108 | 无此场 |
KO_ROOM_ERRCODE_FIELD_THRES_FAILED | 109 | 门槛进不去 |
KO_ROOM_ERRCODE_FIELD_CHECK_FAILED | 110 | 场校验失败 |
KO_ROOM_ERRCODE_FIELD_NO_THIS_GAME | 111 | 无此游戏 |
KO_ROOM_ERRCODE_ALREADY_STATE_READY | 112 | 用户已经在准备了 |
KO_ROOM_ERRCODE_ALREADY_STATE_PLAY | 113 | 用户已经开始了 |
KO_ROOM_ERRCODE_ALREADY_STATE_OVER | 114 | 用户已经结束了 |
KO_ROOM_ERRCODE_ROOM_PLAYING | 120 | 房间正在游戏中 |
KO_ROOM_ERRCODE_ROOM_NOT_PLAYING | 121 | 房间不在游戏中 |
KO_ROOM_ERRCODE_ROOM_OVER_NOT_EXPIRE | 130 | 房间暂时还不能进 |
KO_ROOM_ERRCODE_USER_NOT_ENOUTH_TO_PLAY | 140 | 用户数还不够对战人数下限 |
KO_ROOM_ERRCODE_USER_NOT_OWNER | 141 | 用户非房主 |
KO_ROOM_ERRCODE_USER_NOT_READY | 142 | 用户没有准备 |
KO_ROOM_ERRCODE_VERSION_NOT_SURPPORT_REAL | 161 | 当前版本不支持中途加入 |
KO_ROOM_ERRCODE_NO_ROOM_FOR_TRAIL | 162 | 不存在中途加入的房间 |
KO_ROOM_ERRCODE_SET_ROOM_ATTR_FAILED | 163 | 不能设置此房间属性 |
ERRCODE_NETWORK_DISCONNECT | 1606 | 连接断开 |
ERRCODE_ROOM_DISCONNECT | 1607 | 与房间失去连接 |
ENTERLOBBY_RTNFAIL | -1 | 进入大厅失败 |
EXITLOBBY_RTNFAIL | -2 | 退出大厅失败 |
EXITGAME_RTNFAIL | -3 | 退出游戏失败 |
ERR_ENTEROOM_BEFORE_EXITROOM | -4 | 未退出上一个房间就进入下一个房间 |
ERR_CURRENT_ROOMID | -5 | 当前的房间ID与方法传入的房间ID不一致 |
ERRCODE_INVALID_PARAMETER | 12 | 参数不正确 |
ERRCODE_USER_NOT_EXIST | 13 | 用户不存在 |
ERRCODE_AUTHRIZATION_FAILED | 15 | 授权失败 |
ERRCODE_TOKEN_TIMEOUT | 16 | Token已过期 |
ERRCODE_USER_NOT_BIND_THIS_THIRD_ACCOUNT | 30 | 无法绑定这个第三方账号 |
ERRCODE_USER_HAS_BIND_THIS_THIRD_ACCOUNT | 31 | 此游客账号已经绑定第三方账号 |
ERRCODE_THIS_THIRD_ACCOUNT_HAS_BIND | 32 | 这个第三方账号存在绑定 |
ERRCODE_THIS_COUNTRY_IS_FORBIDDEN | 110 | 国家或地区被限制 |
ERRCODE_UNKNOWN | 200 | 未知错误 |
ERRCODE_USER_PRODUCT_NOT_ENOUGH | 1001 | 用户商品不足 |
ERRCODE_USER_DIAMOND_NOT_ENOUGH | 1002 | 用户钻石不足 |
ERRCODE_USER_GOLD_NOT_ENOUTH | 1003 | 用户金币不足 |
ERRCODE_USER_PRODUCT_EXPIRED | 1004 | 用户商品已过期 |
ERRCODE_USER_MONEY_NOT_PAYED | 1005 | 用户佣金未支付 |
ERRCODE_PRODUCT_NOT_BELONGED_THIS_GAME | 1006 | 此商品不属于该游戏 |
ERRCODE_DIAMONE_COULD_NOT_EXCHANGED | 1007 | 不可兑换成钻石 |
ERRCODE_KEYCODE_EXPIRED | 1009 | K码已过期 |
ERRCODE_PRODUCT_EXISTS | 2001 | 商品已存在 |
ERRCODE_PRODUCT_NOT_EXISTS | 2002 | 商品未存在 |
ERRCODE_PERMISSION_DENY | 3001 | 权限受限 |
ERRCODE_ROOM_DISCONNECT | 1607 | 与房间失去连接 |
ENTERLOBBY_RTNFAIL | -1 | 进入大厅失败 |
EXITLOBBY_RTNFAIL | -2 | 退出大厅失败 |
EXITGAME_RTNFAIL | -3 | 退出游戏失败 |
ERR_ENTEROOM_BEFORE_EXITROOM | -4 | 未退出上一个房间就进入下一个房间 |
ERR_CURRENT_ROOMID | -5 | 当前的房间ID与方法传入的房间ID不一致 |
ERRCODE_INVALID_PARAMETER | 12 | 参数不正确 |
ERRCODE_USER_NOT_EXIST | 13 | 用户不存在 |
ERRCODE_AUTHRIZATION_FAILED | 15 | 授权失败 |
ERRCODE_TOKEN_TIMEOUT | 16 | Token已过期 |
ERRCODE_USER_NOT_BIND_THIS_THIRD_ACCOUNT | 30 | 无法绑定这个第三方账号 |
ERRCODE_USER_HAS_BIND_THIS_THIRD_ACCOUNT | 31 | 此游客账号已经绑定第三方账号 |
ERRCODE_THIS_THIRD_ACCOUNT_HAS_BIND | 32 | 这个第三方账号存在绑定 |
ERRCODE_THIS_COUNTRY_IS_FORBIDDEN | 110 | 国家或地区被限制 |
ERRCODE_UNKNOWN | 200 | 未知错误 |
ERRCODE_USER_PRODUCT_NOT_ENOUGH | 1001 | 用户商品不足 |
ERRCODE_USER_DIAMOND_NOT_ENOUGH | 1002 | 用户钻石不足 |
ERRCODE_USER_GOLD_NOT_ENOUTH | 1003 | 用户金币不足 |
ERRCODE_USER_PRODUCT_EXPIRED | 1004 | 用户商品已过期 |
ERRCODE_USER_MONEY_NOT_PAYED | 1005 | 用户佣金未支付 |
ERRCODE_PRODUCT_NOT_BELONGED_THIS_GAME | 1006 | 此商品不属于该游戏 |
ERRCODE_DIAMONE_COULD_NOT_EXCHANGED | 1007 | 不可兑换成钻石 |
ERRCODE_KEYCODE_EXPIRED | 1009 | K码已过期 |
ERRCODE_PRODUCT_EXISTS | 2001 | 商品已存在 |
ERRCODE_PRODUCT_NOT_EXISTS | 2002 | 商品未存在 |
ERRCODE_PERMISSION_DENY | 3001 | 权限受限 |