进行小说软件开发,用户充值功能的实现

这篇博客详细介绍了如何在Unity中搭建小说软件的充值界面,包括UI搭建、充值功能的实现、与Server端的交互以及数据库处理。通过监听事件来响应充值请求,Server端接收并处理充值请求,更新数据库中的金币数,最后将充值结果反馈给客户端。
摘要由CSDN通过智能技术生成

充值功能的UI搭建

Unity搭建充值界面
小说软件开发创建界面的脚本
获取相关UI
向Server端发请求充值的请求
RechargePanel :Unity充值UI脚本

using DG.Tweening;
using Protocol.Code;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class RechargePanel : MonoBehaviour
{
    private GameObject goods;
    private Button[] btnGoodsArr;//所有的充值按钮
    private Button btn_Close;
    private int RechargeCount;//每次充值的金币数
    private void Awake()
    {
        Init();
    }
    private void Init()
    {
        EventCenter.AddListener(EventDefine.ShowRechargePanel,Show);
        //监听收到Server端完成充值后的回应的方法
        EventCenter.AddListener<int>(EventDefine.SendRechargePanel,UpdateCoinCount);
        goods = transform.Find("goods").gameObject;
        btnGoodsArr = new Button[goods.transform.childCount];
        //得到所有充值按钮
        for (int i = 0; i < goods.transform.childCount; i++)
        {
            btnGoodsArr[i] = goods.transform.GetChild(i).GetComponentInChildren<Button>();
        }    
        btn_Close = transform.Find("btn_Close").GetComponent<Button>();
        btn_Close.onClick.AddListener(() =>
        {
            OnCloseButtonClick();
        });
        //添加每个充值按钮的点击事件
        btnGoodsArr[0].onClick.AddListener(delegate{ OnRechargeButtonClick(10); });
        btnGoodsArr[1].onClick.AddListener(delegate{ OnRechargeButtonClick(20); });
        btnGoodsArr[2].onClick.AddListener(delegate{ OnRechargeButtonClick(50); });
        btnGoodsArr[3].onClick.AddListener(delegate{ OnRechargeButtonClick(100); });
        btnGoodsArr[4].onClick.AddListener(delegate{ OnRechargeButtonClick(200); });
        btnGoodsArr[5].onClick.AddListener(delegate{ OnRechargeButtonClick(500); });
    }
    /// <summary>
    /// 关闭按钮的点击
    /// </summary>
    private void OnCloseButtonClick()
    {
        transform.DOScale(Vector3.zero, 0.3f);
    }
    //显示的方法
    private void Show()
    {
        transform.DOScale(Vector3.one, 0.3f);
    }

    /// <summary>
    /// 充值按钮的点击
    /// </summary>
    /// <param name="coin"></param>
    private void OnRechargeButtonClick(int coin)
    {
        RechargeCount = coin;
        NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetRecharge_CREQ,coin);
    }
    /// <summary>
    /// 金币充值成功的提示
    /// </summary>
    private void UpdateCoinCount(int value)
    {
        Models.GameModel.userDto.Coin = value;//保存每次充值后的金币数
        EventCenter.Broadcast(EventDefine.Hint,"充值"+RechargeCount+"金币成功");
    }

    private void OnDestroy()
    {
        //移除监听
        EventCenter.RemoveListener<int>(EventDefine.SendRechargePanel, UpdateCoinCount);
        EventCenter.RemoveListener(EventDefine.ShowRechargePanel, Show);
    }
}

数据库的处理:更新金币数,加上每次需要充值的金币,并返回充值成功后的金币数量 

   /// <summary>
        /// 更新金币数量
        /// </summary>
        public static int UpdateCoinCount(int userId,int value)
        {
            MySqlCommand cmd = new MySqlCommand("select Coin From userinfo where ID=@id",sqlConnect);
            cmd.Parameters.AddWithValue("id",userId);
            MySqlDataReader reader= cmd.ExecuteReader();
            if (reader.HasRows)
            {
                reader.Read();
                int remainCoinCount = reader.GetInt32("Coin");
                reader.Close();

                MySqlCommand updateCmd = new MySqlCommand("update userinfo set Coin=@coin where ID=@id",sqlConnect);
                updateCmd.Parameters.AddWithValue("coin",remainCoinCount+value);
                updateCmd.Parameters.AddWithValue("id", userId);
                updateCmd.ExecuteNonQuery();
                return remainCoinCount + value;
            }
            reader.Close();
            return 0;
        }
    }

Server端的处理:发送给客户端充值成功后的金币

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GameServer.DadaBase;
using MyServer;
using Protocol.Code;
using Protocol.Dto;

namespace GameServer.Logic
{
    /// <summary>
    /// 账号模块的处理
    /// </summary>
    public class AccountHandler : IHandler
    {
        public void DisConnected(ClientPeer clientPeer)
        {
            DatabaseManager.OffLine(clientPeer);
        }
        /// <summary>
        /// 处理所有的子操作码
        /// </summary>
        public void Receive(ClientPeer client, int subCode, object value)
        {
            switch (subCode)
            {
                case AccountCode.Register_CREQ:
                    Register(client,value as AccountDto);
                    break;
                case AccountCode.Login_CREQ:
                    Login(client,value as AccountDto);
                    break;
                case AccountCode.GetUserInfo_CREQ:
                    GetUserInfo(client);
                    break;
                case AccountCode.GetRankList_CRES:
                    GetRankList(client);
                    break;
                case AccountCode.GetRecharge_CREQ:
                    GetRecharge_CREQ(client,(int)value);
                    break;
                   
            }
        }

        /// <summary>
        /// 客户端请求充值的处理
        /// </summary>
        private void GetRecharge_CREQ(ClientPeer client,int coinCount)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
                int count = DatabaseManager.UpdateCoinCount(client.id, coinCount);
                //完成充值请求后的处理,回应给客户端
                client.SendMsg(OpCode.Account, AccountCode.GetRecharge_SRES, count);
            });
        }

        /// <summary>
        /// 客户端请求排行榜的处理
        /// </summary>
        private void GetRankList(ClientPeer client)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
               RankListDto dto= DatabaseManager.GetRankListDto();
                client.SendMsg(OpCode.Account, AccountCode.GetRankList_SRES, dto);
            });
        }

        /// <summary>
        /// 客户端请求获得用户信息的处理
        /// </summary>
        private void GetUserInfo(ClientPeer client)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
                UserDto dto = DatabaseManager.GetUserInfo(client);
                client.SendMsg(OpCode.Account, AccountCode.GetUserInfo_SRES, dto);
            });
        }

        /// <summary>
        /// 客户端请求登陆的处理
        /// </summary>
        private void Login(ClientPeer client, AccountDto dto)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
                if (DatabaseManager.IsExistUserName(dto.userName)==false)
                {
                    //用户名不存在
                    client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -1);
                    return;
                }
                if (DatabaseManager.IsMatch(dto.userName,dto.password)==false)
                {
                    //账号密码不匹配
                    client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -2);
                    return;
                }
                if (DatabaseManager.IsOnline(dto.userName))
                {
                    //当前用户已在线
                    client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -3);
                    return;
                }
                DatabaseManager.Login(dto.userName,client);
                //登陆成功
                client.SendMsg(OpCode.Account, AccountCode.Login_SRES, 0);
            });
        }

        /// <summary>
        ///客户端注册请求的处理
        /// </summary>
        private void Register(ClientPeer client, AccountDto dto)
        {
            ///单线程执行
            ///作用:防止多个线程同时访问,数据错乱
            SingleExecute.Instacne.Execute(()=> 
            {
                //判断数据库中是否存在该用户,存在就给客户端返回-1
                if (DatabaseManager.IsExistUserName(dto.userName))
                {
                    client.SendMsg(OpCode.Account, AccountCode.Register_SRES, -1);
                    return;
                }
                //判断数据库中是否存在该用户,不存在就创建该用户并给客户端返回0
                DatabaseManager.CreatUser(dto.userName, dto.password);
                client.SendMsg(OpCode.Account, AccountCode.Register_SRES, 0);
            });
           
        }
    }
}

客户端处理Server端的回应:

using Protocol.Code;
using Protocol.Dto;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class AccountHandler : BaseHandler
{
    
    public override void OnReceive(int subCode, object value)
    {
        switch (subCode)
        {
            case AccountCode.Register_SRES:
                Register_SRES((int)value);
                break;
            case AccountCode.Login_SRES:
                Login_SRES((int)value);
                break;
            case AccountCode.GetUserInfo_SRES:
                GetUserInfo_SRES(value as UserDto);
                break;
            case AccountCode.GetRankList_SRES:
                GetRankList_SRES(value as RankListDto);
                break;
            case AccountCode.GetRecharge_SRES:
                //发送到充值脚本自己处理
                EventCenter.Broadcast(EventDefine.SendRechargePanel, (int)value);
                break;
        }
    }

    /// <summary>
    /// 处理服务器端注册后的回应
    /// </summary>
    private void Register_SRES(int value)
    {
        if (value==-1)
        {
            EventCenter.Broadcast(EventDefine.Hint,"该用户已经被注册");
            return;
        }
        if (value==0)
        {
            EventCenter.Broadcast(EventDefine.Hint, "注册成功");
        }
    }

    /// <summary>
    ///  处理服务器端登陆后的回应
    /// </summary>
    private void Login_SRES(int value)
    {
       
        switch (value)
        {
            case -3:
                EventCenter.Broadcast(EventDefine.Hint, "当前用户已在线");
                break;              
            case -2:
                EventCenter.Broadcast(EventDefine.Hint, "账号密码不匹配");
                break;
            case -1:
                EventCenter.Broadcast(EventDefine.Hint, "用户名不存在");
                break;
            case 0:
                //请求获得用户信息
                NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetUserInfo_CREQ,null);
                EventCenter.Broadcast(EventDefine.Hint, "登陆成功");
                break;
        }
    }

    /// <summary>
    /// 处理获取用户信息服务器端的回应
    /// </summary>
    private void GetUserInfo_SRES(UserDto dto)
    {
        Models.GameModel.userDto = dto;//把用户信息存储到数据中心(model层)
        SceneManager.LoadScene("02.Main");
    }

    /// <summary>
    /// 处理获取排行榜信息服务器的回应
    /// </summary>
    /// <param name="dto"></param>
    private void GetRankList_SRES(RankListDto dto)
    {
        //把排行榜信息发送到RankPanel去处理
        EventCenter.Broadcast(EventDefine.SendRankListDto,dto);
    }
}

小说软件开发处理充值成功后的操作

RechargePanel 脚本中监听handler里发送的事件
广播一下充值了多少金币
在Main界面更新人物的金币数量,并保存在Model里
声明:本文由云豹科技转发自我是赵某人博客,如有侵权请联系作者删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值