Unity3D跑酷游戏开发-游戏结束分数排名当前高能显示 (原创教程)

 

一般游戏结束后都会有个分数排名板。

Unity3D跑酷游戏开发-游戏结束分数排名当前高能显示 (原创教程)_第1张图片

 

Unity3D跑酷游戏开发-游戏结束分数排名当前高能显示 (原创教程)_第2张图片

接下来让分析这功能。

1.游戏结束后显示高分排列,当前玩家分数高能显示。(如果能进入排名板)

2.数据必须持久化,切换场景,关闭开启游戏都要能用。。。

 

流程:

游戏结束后,调出排名板。

1.取得上次的所有排名数据保存到list泛型,如上图只有5个。

2.把当前玩家数据添加到list里,然后根据分数降序再删除最后一个。(最后一名)

3.删除替换更新原来的排名数据。

 

接下来让我们用Linq To XML 来实现。

 

1.XML 格式,这里我使用这样的。目录为  /VC/my.xml



  
    
      1
      39
      
    
    
      2
      39
      
    
    
      3
      38
      
    
    
      4
      29
      
    
    
      5
      28
      
    
  


2.根据XML格式新建一个model,取名GameInfoModel和XML的元素一一对应。

using UnityEngine;
using System.Collections;
using System;

public class GameInfoModel
{

    public int Id { set; get; }
    public int Score { set; get; }
    public string Time { set; get; }

}


3.编写核心代码  HelperXML类

using UnityEngine;
using System.Collections;
using System.Xml.Linq;
using System.Xml;
using System.IO;
using System;
using System.Collections.Generic;
using System.Linq;

/// 
/// By:略知CSharp 
/// 
public class HelperXML : MonoBehaviour
{
     string filePath = string.Empty;

    void Awake()
    {
        //此属性用于返回程序的数据文件所在文件夹的路径。例如在Editor中就是Assets了。
        filePath = Application.dataPath + @"/VC/my.xml";
    }

    /// 
    /// 1.遍历读取XML
    /// 
    /// 
    public List VCLoadXMLManage()
    {
        XElement root = XElement.Load(filePath);
        List list = new List();
        foreach (var item in root.Element("Group").Elements("Item"))    //遍历XElement
        {
           list.Add(new GameInfoModel
           {
               Id = Convert.ToInt32(item.Element("ID").Value),
               Score = Convert.ToInt32(item.Element("Score").Value),
               Time = item.Element("Time").Value
           }
          );
        }
        return list;
    }
    /// 
    /// 2.删除第三级所有节点 
    /// 
    public void VCRemoveXmlElement()
    {
        XElement root = XElement.Load(filePath);
        XElement node = root.Descendants().Where(p => p.Name == "Group").Last();
        node.Elements().Remove();
        root.Save(filePath);
    }
    /// 
    /// 3.添加第三级
    /// 
    /// 
    public void VCAddXml(List list)
    {
         XElement root = XElement.Load(filePath);
         XElement node = root.Descendants().Where(p => p.Name == "Group").Last();
         for (int i = 0, count = list.Count; i < count; i++)
         {
             XElement child = new XElement("Item",
                        new XElement("ID", i + 1),
                        new XElement("Score", list[i].Score),
                        new XElement("Time", list[i].Time)
                    );
             node.Add(child);
         }
         root.Save(filePath);
    }

}

 

4.实现主逻辑,主要就是游戏结束后调用这个类,这里继承了上面的类。

 

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using System;
using System.Linq;
using System.Text;


/// 
/// UI管理器
/// 
public class UICon : HelperXML
{
    public GameObject UI_Info; //游戏结束图片//计分板
    public Text scoreText;     //得分版
    public Text countText;     //计分板

    int scoreCount = 0;
  
    /// 
    /// 游戏结束显示相关UI
    /// 
    public void UIGameVoer()
    {
        //显示记分板
        UI_Info.SetActive(true);
        //遍历获取XML
        List list = base.VCLoadXMLManage();
        //当前分数
        int nowScore = scoreCount;
        //添加当前分数信息
        var mod = new GameInfoModel {
            Score = nowScore,
            Time = DateTime.Now.ToString("MM月dd日")
        };
        list.Add(mod);
        //倒序
        list = list.OrderByDescending(p => p.Score).ToList();
        //删除最后一个最少的
        if(list.Count>5)
        list.RemoveAt(list.Count - 1);
        //显示最新排名版
        StringBuilder sb = new StringBuilder();
        int index = 1;
        list.ForEach(p=> sb.Append(p.Score==mod.Score? 
            ("" + index++ + "    " + p.Score + "米    " + p.Time + "\n"): 
            ( index++ + "    " + p.Score + "米    " + p.Time + "\n"))
            );
        countText.text = sb.ToString();
        //更新XML
        base.VCRemoveXmlElement();
        base.VCAddXml(list);
    }
}


 

每次游戏结束都会更新排名板,利用XML持久化数据能实现大部分游戏的记录功能。

如场景信息、关卡信息、人物坐标、任务系统、NPC对话等等。。。。

Unity3D跑酷游戏开发-游戏结束分数排名当前高能显示 (原创教程)_第3张图片

 

 

项目小结:Linq 、lambda糖果是个好东西.foreach啥的以后少用了,官方歧视这些高能货。。

 

此游戏教程本来去年就要写完的,到后面发现做成视频教程都要好几个小时,何况全程高能红箭头标识的图文教程。要唠叨的东东太多了,还请大家见谅。

 

 

By:略知CSharp

2015年04月20日 00:00:23

 

 


 

 

 

 

 

 

 

你可能感兴趣的:(Unity,游戏世界)