暗黑战神学习

一、初始场景和UI制作

1.1 灯光效应

通过平行光源(Directional light long)把龙的轮廓给打亮,点光源(Point light)就是模拟月亮透过云层发出来的光。灯光Mode不需要选择Mixed,不存在性能问题,同时也不需要去开启Realtime Global IIIur,没有效果。

二、UI逻辑框架

2.1 框架图

三、XML在C#与Unity3D中的实战运用

3.1 XML文件是什么?

XML是可扩展标记语言,Extensible Markup Language的缩写。

3.2 XML文件有什么用?

用来传输和存储数据,比如网络通讯、本地配置文件等。

3.3 XML文件长什么样?

一个文件示例:(包含了三个数据项,每个数据项里面有名字、年龄、性别这三个属性)

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item ID="1">
         <name>Plane</name>
         <age>24</age>
         <sex>1</sex>
    </item>
    <item ID="2">
         <name>wang</name>
         <age>28</age>
         <sex>0</sex>
    </item>
    <item ID="3">
         <name>ding</name>
         <age>30</age>
         <sex>1</sex>
    </item>
</root>

3.4 如何生成XML文件

制作xml模板格式文件(必须要有两个相同的数据项,否则无法在Excel中进行映射)

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item ID="">
         <name></name>
         <age></age>
         <sex></sex>
    </item>
    <item ID="">
         <name></name>
         <age></age>
         <sex></sex>
    </item>
</root>

1、将模板文件导入Excel

在Excel中打开自定义菜单文件-选项-自定义功能区-主选项卡,将开发工具添加到主选项。

在开发工具面板里:XML-源-XML映射-添加模板文件。

选中源面板里的模板,映射到表格里。

2、在Excel中填充数据

数据不会类型,最终都会转化为字符串类型。

3、从Excel中导出附带数据的xml文件

在开发工具面板里:XML导出。

3.5 如何使用xml文件?

1、加载xml文件

使用Unity资源系统加载文件。

TextAsset xml=Resources.Load<TextAsset>(filePath);
XmlDocument doc=new XmlDocument();
doc.LoadXml(xml.text);

 2、在C#文件IO接口加载文件

XmlDocument doc=new XmlDocument();
doc.Load("D:\Dev\info.xml");

3.6 解析xml文件

1、获取根节点下的所有子节点的List:

XmlNodeList nodLst=doc.SelectSingleNode("root").ChildNodes;

2、将某个节点转化为一个XmlElement:

XmlElement ele=nodLst[i] as XmlElement;

3、从XmlElement里获取名称为“ID”的数据:

string value=ele.GetAttributeNode("ID").InnerText;

数据都是以字符串的形式存储,需要自己转化为对应的数据类型。

3.7 备注说明

关于XML头声明和standalone的解释

<?xml version="1.0" encodeing="utf-8" standalone="yes"?>

1、version="1.0",它是表示版本为1.0;

2、standalone表示该xml是不是独立的,如果是yes,则表示这个XML文档是独立的,不能外部DTD规范文件;如果是no,则该XML文档不是独立的,表示可以用外部的DTD规范文档。 

四、网络通讯与服务器逻辑框架

 4.1 网络通讯

计算设备之间传输数据,而这些数据可以用起来去达到我们的目的。

4.2 PESocket的使用示意

1、创建Socket服务器

PESocket<ClientSession,NetMsg> client=new PESocket<ClientSession,NetMsg>();
client.StartAsServer("127.0.0.1",17666);

2、创建Socket客户端

PESocket<ClientSession,NetMsg> client=new PESocket<ClientSession,NetMsg>();
client.StartAsClient("127.0.0.1",17666);

3、网络消息定义

网络消息需要继承自PEMsg类,并且打上[Serializable]标签,便于使用C#语言的序列化功能。消息体支持多层嵌套。

[Serializable]
public class NetMsg:PEMsg
{
  public int id;
  public string name;
  public int coin;
}

4、发送网络消息

使用ClientSession/ServerSession类中的SendMsg(T Msg)函数以及重载函数SendMsg(byte[] data)可以风别发送打包好的网络消息以及完成序列化二进制网络消息。

NetMsg msg=new NetMsg
{
  id=10086;
  name="Liulei";
  coin=9999;
};

this.SendMsg(msg);

5、接收网络消息

在自定义的ClientSession/ServerSession类中重写OnReciveMsg(T msg)可以接收网络消息。

protected override void OnReciveMsg(NetMsg msg)
{
  base.OnReciveMsg(msg);
  //TODO,增加处理网络消息的业务逻辑
  PETool.LogMsg("Msg_id:"+msg.id);
  PETool.LogMsg("Msg_name:"+msg.name);
  PETool.LogMsg("Msg_coin:"+msg.coin);
}

6、第三方日志工具接口

通过SetLog(bool log=true,Action<string,int> logCB=null)接口,可以传入第三方日志显示工具。(下面以Unity为例,实现Unity编辑器控制台中输出日志消息)

skt.SetLog(true,(string msg,int lv)=>{
  switch (lv)
  {
     case 0:
       msg="Log:"+msg;
       Debug.Log(msg);
       break;
     case 1:
       msg="Warn:"+msg;
       Debug.Log(msg);
       break;
     case 2:
       msg="Error:"+msg;
       Debug.Log(msg);
       break;
     case 3:
       msg="Info:"+msg;
       Debug.Log(msg);
       break;
  }
});

7、服务器框架

 8、连接数据库

创建数据库管理类DBMgr

private MySqlConnection conn;

    public void Init()
    {
        conn = new MySqlConnection("server=localhost;User Id=root;password=;Database=lldarkgod;Charset=utf8;");
        conn.Open();
}

查询账号的函数运用try{} catch(Exception e){}来查找错误

 try
        {
            MySqlCommand cmd = new MySqlCommand("select * from account where acct= @acct", conn);
            cmd.Parameters.AddWithValue("acct", acct);
            reader = cmd.ExecuteReader();
            if (reader.Read())
            {
                isNew = false;
                string _pass = reader.GetString("pass");
                if (_pass.Equals(pass))
                {
                    //密码正确,返回玩家数据
                    playerData = new PlayerData
                    {
                        id = reader.GetInt32("id"),
                        name = reader.GetString("name"),
                        lv = reader.GetInt32("level"),
                        exp = reader.GetInt32("exp"),
                        power = reader.GetInt32("power"),
                        coin = reader.GetInt32("coin"),
                        diamond = reader.GetInt32("diamond")
                        //TOADD
                    };
                }
            }
        }
        catch (Exception e)
        {
            PECommon.Log("Query PlayerData By Acct&Pass Error:" + e, LogType.Error);
        }

 插入玩家数据函数

 private int InsertNewAcctData(string acct, string pass, PlayerData pd)
    {
        int id = -1;
        try
        {
            MySqlCommand cmd = new MySqlCommand(
                "insert into account set acct=@acct,pass=@pass,name=@name,level=@level,exp=@exp,power=@power,coin=@coin,diamond=@diamond", conn);
            cmd.Parameters.AddWithValue("acct", acct);
            cmd.Parameters.AddWithValue("pass", pass);
            cmd.Parameters.AddWithValue("name", pd.name);
            cmd.Parameters.AddWithValue("level", pd.lv);
            cmd.Parameters.AddWithValue("exp", pd.exp);
            cmd.Parameters.AddWithValue("power", pd.power);
            cmd.Parameters.AddWithValue("coin", pd.coin);
            cmd.Parameters.AddWithValue("diamond", pd.diamond);

            //TOADD
            cmd.ExecuteNonQuery();
            id = (int)cmd.LastInsertedId;
        }
        catch (Exception e)
        {
            PECommon.Log("Insert PlayerData Error:" + e, LogType.Error);
        }
        return id;
    }

更新玩家数据的函数

MySqlCommand cmd = new MySqlCommand("select * from account where name=@name", conn);
MySqlCommand cmd = new MySqlCommand("update account set name=@name,level=@level,exp=@exp,power=@power,coin=@coin,diamond=@diamond where id=@id", conn);
            cmd.Parameters.AddWithValue("id", id);
            cmd.Parameters.AddWithValue("name", playerData.name);
            cmd.Parameters.AddWithValue("level", playerData.lv);
            cmd.Parameters.AddWithValue("exp", playerData.exp);
            cmd.Parameters.AddWithValue("power", playerData.power);
            cmd.Parameters.AddWithValue("coin", playerData.coin);
            cmd.Parameters.AddWithValue("diamond", playerData.diamond);

五、主城UI逻辑与角色控制

 1、跳转主城逻辑

2、增加角色属性

a、更改数据库account表

b、修改PlayerData类

public int hp;
public int ad;
public int ap;
public int addef;
public int apdef;
public int dodge;//闪避概率
public int pierce;//穿透比率
public int critical;//暴击概率

 c、修改DBMgr.cs

//QueryPlayerData()
hp=reader.GetInt32("hp"),
ad=reader.GetInt32("ad"),
ap=reader.GetInt32("ap"),
addef=reader.GetInt32("addef"),
apdef=reader.GetInt32("apdef"),
dodge=reader.GetInt32("dodge"),
pierce=reader.GetInt32("pierce"),
critical=reader.GetInt32("critical"),

d、默认账号数据

 hp = 2000,
 ad = 275,
 ap = 265,
 addef = 67,
 apdef = 43,
 dodge = 7,
 pierce = 5,
 critical = 2

 //InsertNewAcctData()sql增加:

"hp=@hp,ad=@ad,ap=@ap,addef=@addef,apdef=@apdef,dodge=@dodge,pierce=@pierce,critical=@critical"

//InsertNewAcctData()参数增加:

cmd.Parameters.AddWithValue("hp",pd.hp);
cmd.Parameters.AddWithValue("ad",pd.ad);
cmd.Parameters.AddWithValue("ap",pd.ap);
cmd.Parameters.AddWithValue("addef",pd.addef);
cmd.Parameters.AddWithValue("apdef",pd.apdef);
cmd.Parameters.AddWithValue("dodge",pd.dodge);
cmd.Parameters.AddWithValue("pierce",pd.pierce);
cmd.Parameters.AddWithValue("critical",pd.critical);

//UpdatePlayerData()sql增加:

 "hp=@hp,ad=@ad,ap=@ap,addef=@addef,apdef=@apdef,dodge=@dodge,pierce=@pierce,critical=@critical"

//UpdatePlayerData()参数增加:

cmd.Parameters.AddWithValue("hp",playerData.hp);
cmd.Parameters.AddWithValue("ad",playerData.ad);
cmd.Parameters.AddWithValue("ap",playerData.ap);
cmd.Parameters.AddWithValue("addef",playerData.addef);
cmd.Parameters.AddWithValue("apdef",playerData.apdef);
cmd.Parameters.AddWithValue("dodge",playerData.dodge);
cmd.Parameters.AddWithValue("pierce",playerData.pierce);
cmd.Parameters.AddWithValue("critical",playerData.critical);

六、引导数据网络协议处理

七、战斗逻辑框架

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值