接上一篇,运行效果如下:
嗯现在大家可以看到已经可以输入了,现在咱们再回到脚本上来,新建一个C#脚本,命名为CreateRole,脚本如下: - using UnityEngine;
- using System.Collections;
- using System;
- public class CreateRole : MonoBehaviour {
- private XmlDataStructure role ;
- private XmlManager xmlMan ;
- /// <summary>
- /// The name input.获取几个input,得到他们的内容
- /// </summary>
- public UIInput nameInput ;
- public UIInput occuInput ;
- public UIInput levelInput ;
- public UIInput expInput ;
-
- public UIButton _backlaod ;
- void Start(){
- xmlMan = new XmlManager();
- EventDelegate.Add(_backlaod.onClick,delegate() {
- //Application.LoadLevel(1);
- });
- }
- /// <summary>
- /// Raises the click event.点击创建按钮新建一个角色,然后添加到xml文件里面去
- /// </summary>
- void OnClick(){
- try{
- if(xmlMan.GetDataFromXml(XmlManager.XmlRandS.xml_role).Count >=5){
- print("你已经拥有5个角色,如果需要继续创建,请先删除");
- }else{
- role = new XmlDataStructure(nameInput.value,
- occuInput.value,
- Convert.ToInt32(levelInput.value),
- Convert.ToInt32(expInput.value),
- DateTime.Now.ToShortDateString());
- xmlMan.AddRole(role,XmlManager.XmlRandS.xml_role);
- //Application.LoadLevel(1);
- }
- }
- catch{
- print("请输入正确的格式like,int 、 int 、 string 、 string");
- }
- }
- }
复制代码这个脚本的目的是读取input里面的内容,然后写入到xml文件里面去,然后通过给按返回登录钮添加委托,实现界面的跳转(当然啦这里大家可以不用委托,在写个脚本给返回登录按钮,在OnClick里面调用loadlevel也行,不过我觉得这样脚本多了不好控制);
把这个脚本绑给Create按钮,并且把上面的那几个input分别拖进去对应起来,将Load按钮托给_load变量,那么输入后,点击Create后,我们退出后可以看到项目下面多出了一个xmlDir的文件夹,里面有Role和Save这2个xml文件,并且Role里面的内容就是刚才输入的信息,效果如下:
好了接下来我们开始做角色列表,在Prefabs下创建一个叫UIPrefab的Prefab,然后将UIRoot拖给这个Prefab形成一个预设,再将这个scene保存,然后新建一个scene,将UIPrefab拖进去,然后删掉delete按钮,把Create身上的CreateRole脚本删掉并将Create按钮复制2个,并改名Delete和Load,然后将他们的label分别改为:返回创建、删除角色、进入游戏,继续将Info的panel的所有子项清空,结果如下:
然后在panel下创建一个Toggle并命名为RoleListItem,修改它的Label位置最终效果如下:
然后我们再去编写脚本,新建一个C#脚本,并命名为RoleListItem,这个脚本很简单,只是声明一个xmldatastructure变量与这个item绑定,代码如下:- using UnityEngine;
- using System.Collections;
- public class RoleListItem : MonoBehaviour {
- public XmlDataStructure roleData ;
- // Use this for initialization
- void Awake(){
- roleData = new XmlDataStructure();
- EventDelegate.Add(GetComponent<UIButton>().onClick,delegate() {
- //print(roleData.id);
- });
- }
- // Update is called once per frame
- void Update () {
- }
- }
复制代码 怎么样这代码很简单吧,后面会用到这个roleData,然后我们再新建一个脚本命名为RoleList,这个脚本用来读取xml文件的角色信息,并制作一个列表显示,其中又用到了委托,给按钮添加事件,代码如下:- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public class Rolelist : MonoBehaviour {
- /// <summary>
- /// The _create.声明3个按钮变量
- /// </summary>
- public UIButton _create ;
- public UIButton _delete ;
- public UIButton _load ;
- private XmlManager xmlMan ;
- /// <summary>
- /// The roles list.声明一个存放角色的线性表
- /// </summary>
- private List<XmlDataStructure> rolesList ;
- /// <summary>
- /// The item prefab.这个是item预设
- /// </summary>
- public GameObject itemPrefab ;
- // Use this for initialization
- void Start () {
- xmlMan = new XmlManager();
- LoadRoles();
- /// <summary>
- /// EventDelegate.给3个按钮添加事件
- /// </summary>
- EventDelegate.Add(_create.onClick,delegate() {
- Application.LoadLevel(0);
- });
- EventDelegate.Add(_delete.onClick,delegate() {
- try{
- xmlMan.RemoveItemById(UIToggle.GetActiveToggle(1).gameObject.GetComponent<RoleListItem>().roleData.id,
- XmlManager.XmlRandS.xml_role);
- Destroy(UIToggle.GetActiveToggle(1).gameObject);
- gameObject.GetComponent<UITable>().Reposition();
- }catch{
- print("您还没有角色,请先创建角色");
- }
- });
- EventDelegate.Add(_load.onClick,delegate() {
- try{
- print("你选择登录的角色信息为:"+UIToggle.GetActiveToggle(1).gameObject.GetComponent<RoleListItem>().roleData.id+
- "姓名:"+UIToggle.GetActiveToggle(1).gameObject.GetComponent<RoleListItem>().roleData.name+
- "门派:"+UIToggle.GetActiveToggle(1).gameObject.GetComponent<RoleListItem>().roleData.occupation);
- }catch{
- print("请选择要登录的角色");
- }
- });
- }
- /// <summary>
- /// Loads the roles.从xml文件读取信息,并创建item然后将信息与item绑定
- /// </summary>
- void LoadRoles(){
- rolesList = new List<XmlDataStructure>();
- rolesList = xmlMan.GetDataFromXml(XmlManager.XmlRandS.xml_role);
- foreach(XmlDataStructure role in rolesList){
- GameObject itemClone = (GameObject)Instantiate(itemPrefab,transform.position,Quaternion.identity);
- itemClone.transform.parent = this.transform;
- itemClone.transform.localScale = new Vector3(1,1,1);
- RoleListItem itemScript = itemClone.GetComponent<RoleListItem>();
- itemScript.roleData.id = role.id ;
- itemScript.roleData.occupation = role.occupation;
- itemScript.roleData.name = role.name;
- itemScript.roleData.level = role.level;
- itemScript.roleData.freeExp = role.freeExp;
- itemScript.roleData.createtime = role.createtime;
- itemClone.GetComponentInChildren<UILabel>().text = "名称:"+itemScript.roleData.name+
- "\n门派:"+itemScript.roleData.occupation+
- "\n等级:"+itemScript.roleData.level+
- "\n时间:"+itemScript.roleData.createtime;
- }
- //gameObject.GetComponent<UITable>().Reposition
- }
- // Update is called once per frame
- /// <summary>
- /// Update this instance.如果当前没有选择角色或者没有角色,删除和进入游戏按钮不可用
- /// </summary>
- void Update () {
- if(rolesList.Count <= 0 || UIToggle.GetActiveToggle(1) == null){
- _load.enabled = false ;
- _delete.enabled = false ;
- }else{
- _load.enabled = true ;
- _delete.enabled = true ;
- }
- }
- }
复制代码 然后我们将RoleListItem脚本与RoleListItem这个物体绑定,新建一个预设,将RoleListItem这个Toggle拖进去,形成一个预设,删掉Info的子panel下的RoleListItem,然后将RoleList脚本拖给Info下的panel,并将上面的按钮变量正确的拖进去,其中的itemPrefab就是刚才新建的RolelistItem预设,效果如图:
然后我们将工程built设置一下,要按图中的顺序啊,如图:
然后将CreateRole脚本里面的Application.LoadLevel(1);(有2个地方有,共有2句,很好找)的注释去掉,现在我们跳转到第一个Scene,然后运行可以看到结果,当跳转到第2个场景的时候就有了刚才创建的角色信息了:第二个场景效果如图
好了到现在为止咱们做了角色信息的列表,如果是存档的话其中的输入就变成了玩家进入存档点时记录的信息了,原理是一样的,小弟将在以后的帖子中实现存档的制作。
下面是工程源码和我用到的NGUI
|