KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
查看: 2545|回复: 1

failed to convert parameters (kbengine_unity3d_plugins)

[复制链接]

4

主题

20

帖子

96

积分

注册会员

Rank: 2

积分
96
发表于 2016-2-13 13:21:40 | 显示全部楼层 |阅读模式
I'm implimenting a client in Unity3d.

On the server side, I've defined a simple Account entity
  1. <root>
  2.         <Properties>
  3.                 <characters>
  4.                         <Type> CHARACTER_INFO_LIST </Type>
  5.                         <Flags> BASE </Flags>
  6.                         <Persistent> true </Persistent>
  7.                 </characters>

  8.                 <lastSelectedCharacter>
  9.                         <Type> DBID </Type>
  10.                         <Flags> BASE_AND_CLIENT </Flags>
  11.                         <Default> 0 </Default>
  12.                         <Persistent> true </Persistent>
  13.                 </lastSelectedCharacter>

  14.                 <activeCharacter>
  15.                         <Type> MAILBOX </Type>
  16.                         <Flags> BASE </Flags>
  17.                 </activeCharacter>
  18.         </Properties>
  19.         <ClientMethods>
  20.                 <onReqCharacterList>
  21.                         <Arg> CHARACTER_INFO_LIST </Arg>
  22.                 </onReqCharacterList>

  23.                 <onCreateCharacterResult>
  24.                         <Arg> UINT8 </Arg> <!-- result code (0: success, >0: failure) -->
  25.                         <Arg> CharacterInfo </Arg>
  26.                 </onCreateCharacterResult>

  27.                 <onCharacterDelete>
  28.                         <Arg> DBID </Arg>
  29.                 </onCharacterDelete>
  30.         </ClientMethods>

  31.         <BaseMethods>
  32.                 <reqCharacterList>
  33.                         <Exposed/>
  34.                 </reqCharacterList>

  35.                 <reqCharacterCreate>
  36.                         <Exposed/>
  37.                         <Arg> UNICODE </Arg> <!-- name -->
  38.                         <Arg> UINT8 </Arg> <!-- Strength -->
  39.                         <Arg> UINT8 </Arg> <!-- Dexterity -->
  40.                         <Arg> UINT8 </Arg> <!-- Stamina -->
  41.                         <Arg> UINT8 </Arg> <!-- Intelligence -->
  42.                         <Arg> UINT8 </Arg> <!-- Wisdom -->
  43.                         <Arg> UINT8 </Arg> <!-- Charisma -->
  44.                 </reqCharacterCreate>

  45.                 <reqCharacterDelete>
  46.                         <Exposed/>
  47.                         <Arg> DBID </Arg>
  48.                 </reqCharacterDelete>


  49.                 <selectCharacterGame>
  50.                         <Exposed/>
  51.                         <Arg> DBID </Arg>
  52.                 </selectCharacterGame>
  53.         </BaseMethods>

  54.         <CellMethods>
  55.         </CellMethods>

  56. </root>

复制代码

This makes use of CHARACTER_INFO_LIST which is defined in alias.xml:

  1. <root>
  2.         <DBID> UINT64 </DBID>

  3.         <CharacterInfo> FIXED_DICT
  4.                 <Properties>
  5.                         <databaseID>
  6.                                 <Type> DBID </Type>
  7.                         </databaseID>
  8.                         <Name>
  9.                                 <Type> UNICODE </Type>
  10.                         </Name>

  11.                 </Properties>
  12.         </CharacterInfo>

  13.         <CHARACTER_INFO_LIST> ARRAY <of> CharacterInfo </of></CHARACTER_INFO_LIST>
  14. </root>

复制代码


The relevant portion of my base/Account.py is very simple:

  1. class Account(KBEngine.Proxy):
  2.         def __init__(self):
  3.                 KBEngine.Proxy.__init__(self)

  4.         def reqCharacterList(self):
  5.                 """
  6.                 exposed.
  7.                 """
  8.                 DEBUG_MSG("Account[%i].reqCharacterList: size=%i." % (self.id, len(self.characters)))
  9.                 self.client.onReqCharacterList(self.characters)  # calls onReqCharacterList() in the client context (Unity)
  10. ...

复制代码


On the client side, I've setup an Account.cs script that is a subclass of KBEngine.Entity

It has defined onReqCharacterList as so:

  1.         // Client methods from kbengine (defined in entity_defs/Account.def on the server)
  2.         public void onReqCharacterList(List<Dictionary<string,object>> characterList)
  3.         {
  4.             characters.Clear();

  5.             Dbg.DEBUG_MSG("Account::onReqCharacterList: characterList.Count=" + characterList.Count);
  6.             for (int i = 0; i < characterList.Count; i++)
  7.             {
  8.                 Dictionary<string, object> character = (Dictionary<string, object>)characterList[i];
  9.                 Dbg.DEBUG_MSG("Account::onReqCharacterList: [" + i + "] name: " + (string)character["name"]);
  10.                 characters.Add((UInt64)character["dbid"], character);
  11.             }

  12.             // send a copy of the list to Unity (for the UI)
  13.             Dictionary<UInt64, Dictionary<string, object>> charList = new Dictionary<ulong, Dictionary<string, object>>(characters);
  14.             Event.fireOut("onReqCharacterList", new object[] { charList });
  15.         }

复制代码



The issue, is that when the server (base/Account.py) calls client.onReqCharacterList(self.characters) I get the following error on the Unity side:

  1. [2016-02-12 23:41:04 121] KBEngine::Client_onRemoteMethodCall: Account(4), callMethod(Account.onReqCharacterList) is error!
  2. error=System.ArgumentException: failed to convert parameters
  3.   at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00063] in /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:192
  4.   at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115
  5.   at KBEngine.KBEngineApp.onRemoteMethodCall_ (Int32 eid, KBEngine.MemoryStream stream) [0x000c3] in C:\Users\Public\Documents\Unity Projects\cyber_mmo\Assets\Plugins\kbengine\kbengine_unity3d_plugins\KBEngine.cs:1601

复制代码


What am I doing wrong?  With the current test, the character list is empty (the user hasn't created a character yet), but the kbengine_unity3d_demo handles this just fine.  The only real difference between the demo and my code is that the demo is wrapping the FIXED_DICT in a custom python object that basically puts the dict inside a nested dict containing a single key "values".  I can't really understand why it does that, but maybe it is related.  Is it possible to send an ARRAY of FIXED_DICT normally in KBE?  Or does it have to be bundled inside of a custom object that wraps it in an FIXED_DICT for transport?
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2016-2-13 18:46:31 | 显示全部楼层
Because plug-in code does not find a better way, there are some limitations
It should be like this:

  1. public void onReqCharacterList(List<object> characterList)
  2.         {
复制代码

Maybe in the future it will be improved:)
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-10 19:22 , Processed in 0.033751 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表