一、初始场景和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);
六、引导数据网络协议处理
七、战斗逻辑框架