Skip to content

Unity客户端使用SDK

ilvxna edited this page Aug 5, 2018 · 5 revisions

u3d客户端使用sdk: demo例子代码Avatar.zip。 服务器中定义的包含客户端的实体都会自动生成 ***Base.cs的实体模块, def属性和方法都已经自动生成好, 需要用户继承这个模块例如:

c# public class Avatar : AvatarBase

继承后, 可以监听属性的改变和调用mailbox与服务器通讯以及监听服务器调用客户端的方法做适当编程, 例如触发事件告诉UI层

1: 服务器中types.xml中定义的所有字典和列表等类型在客户端都会自动生成相对应的类型结构, 可以在客户端直接使用并传输给服务器端。 例如demo中的定义,

<ENTITYID_LIST> ARRAY ENTITY_ID </ENTITYID_LIST>

<AVATAR_DATA>	FIXED_DICT
	<implementedBy>AVATAR_DATA.inst</implementedBy>
	<Properties>
		<param1>
			<Type>	INT8	</Type>
		</param1>
		<param2>
			<Type>	BLOB	</Type>
		</param2>
	</Properties>
</AVATAR_DATA>

<AVATAR_INFOS>	FIXED_DICT
	<implementedBy>AVATAR_INFOS.avatar_info_inst</implementedBy>
	<Properties>
		<dbid>
			<Type>	DBID	</Type>
		</dbid>
		<name>
			<Type>	UNICODE	</Type>
			<DatabaseLength> 256 </DatabaseLength>
		</name>
		<roleType>
			<Type>	UINT8	</Type>
		</roleType>
		<level>
			<Type>	UINT16	</Type>
		</level>
		<data>
			<Type>	AVATAR_DATA	</Type>
		</data>
	</Properties>
</AVATAR_INFOS>	

生成的代码:

public class ENTITYID_LIST : List<Int32>
{
}

public class AVATAR_DATA
{
	public SByte param1 = 0;
	public byte[] param2 = new byte[0];
}

public class AVATAR_INFOS
{
	public UInt64 dbid = 0;
	public string name = "";
	public Byte roleType = 0;
	public UInt16 level = 0;
	public AVATAR_DATA data = new AVATAR_DATA();
}

2: 假如服务器定义了一个HP是客户端同步类属性, 底层默认会在**Base类中生成这个属性的定义和它的值改变时的回调方法, 继承类可以重写回调监听改变

	public override void onHPChanged(Int32 oldValue)
	{
		// Dbg.DEBUG_MSG(className + "::set_HP: " + old + " => " + v); 
		Event.fireOut("set_HP", new object[]{this, HP, HP_Max});
	}
       当回调被触发说明值已改变,此时可以触发给UI修改怪物的血条。
       如果客户端要直接访问实体的HP属性, 可以直接如:x = (Avatar)entity.HP或者 x = this.HP

3: 调用服务器的方法如: 像服务器中一样的用法直接调用实体的cell部分的mailbox中的方法,方法请求会自动传输到服务器(Avatar.cs)

	public void jump()
	{
		cellMailbox.jump();
	}

4:监听服务器调用客户端的方法, 底层会在**Base类中生成这个方法并设置为纯虚函数, 用户需要实现这个方法, 当方法被调用时就可以做一些事情, 例如告诉UI层。

	public override void onRemoveSkill(Int32 skillID)
	{
		Dbg.DEBUG_MSG(className + "::onRemoveSkill(" + skillID + ")"); 
		Event.fireOut("onRemoveSkill", new object[]{this});
		SkillBox.inst.remove(skillID);
	}
Clone this wiki locally