好友系统有两个特殊性,一个是需要让客户端接受添加好友的请求,发送请求响应。
二是在服务器端添加后处理器,作用是在发送响应给客户端前,可以往后处理器里添加一些通用的方法,将一些需要时常刷新的消息(例如新的好友列表)添加到响应里,顺路一起发送给客户端。
客户端:
先在客户端拼好UI,使用了之前的ListView加ListView.Item的方法,详细可以看任务系统,暂时不赘述。书写刷新UI的方法,并且注册给FriendService的OnFriendUpdate,只要有数据变化就刷新列表。先清空,再重置数据,数据从FriendManager中取得,该方法的数据会在角色进入游戏时(OnGameEnter方法)初始化,主要存储了该角色的好友相关信息。
刷新UI的方法与其他大同小异,Instantiate 绑定的Prefab 并且生成在指定区域。
然后为增加好友的按钮绑定上InputBox方法,InputBox.Show()出现输入框,.OnSubmit是点击确认后的事件。
public void OnClickFriendAdd() {
InputBox.Show("添加好友", "输入要添加的好友名称或者ID").OnSubmit+=OnFriendAddSubmit;
//OnFriendAddSubmit(string input, out string tips)
}
OnFriendAddSubmit方法会将输入框的字符串提交到FriendService.Instance.SendFriendAddRequest(friendId,friendName);
并且在InputBox内部将tips的字符串赋在输入框的提示text上。
而后,FriendService会构造一个FriendAddRequest()请求,将自身ID与被请求者ID发送至服务器端。
经过服务器端处理后,将会收到OnFriendAddResponse的响应,并且根据响应的结果是成功与否,调用MessageBox显示出有是与否按钮的消息框,给是与否的按钮绑定SendFriendAddResponse的方法。
var confirm = MessageBox.Show(string.Format("{0} 请求加你为好友",request.FromName)
,"好友请求",MessageBoxType.Confirm,"接受","拒绝");
confirm.buttonYes.onClick.AddListener(() =>
{
this.SendFriendAddResponse(true,request);
});
在SendFriendAddResponse里构造FriendAddRequest请求,连同请求方的request,同意与否的信息一起传送到服务器端。
public void SendFriendAddResponse(bool accept, FriendAddRequest request)
{
Debug.Log("SendFriendAdd");
NetMessage message = new NetMessage();
message.Request = new NetMessageRequest();
//源自于被请求方的响应
message.Request.friendAddRes = new FriendAddResponse();
message.Request.friendAddRes.Result = accept? Result.Success :Result.Failed;
message.Request.friendAddRes.Errormsg = accept ? "对方同意" : "对方拒绝";
message.Request.friendAddRes.Request = request;
NetClient.Instance.SendMessage(message);
}
之后就会收到添加成功的消息,弹出MessageBox点击确认。而由于服务器端后处理的作用,OnFriendList也会收到顺带的FriendListResponse,里面有更新后的好友列表,之后就调用绑定了UI层刷新方法的事件,刷新UI。