通过实例学习:游戏的存档与读档(Unity 2017.2)DAY2

1.怪物的死亡与刷新

在TargetManager中添加动物死亡和刷新的方法

    public void UpdateMonsters()
    {
        if(activeMaonster != null)
        {
            StopAllCoroutines();
            activeMaonster.SetActive(false);
            activeMaonster = null;
            StartCoroutine("AliveTimer");
        }
    }

在MonsterManager中添加新的协程和完善死亡

    IEnumerator Deactivate()
    {
        yield return new WaitForSeconds(0.9f);
        //使当前的怪物变为未激活状态,并使整个循环重新开始
        TargetManager._instance.UpdateMonsters();
    }

    private void OnCollisionEnter(Collision collision)
    {
        //如果碰撞到的物体的标签为Bullet,就销毁它
        if(collision.collider.tag == "Bullet")
        {
            Destroy(collision.collider.gameObject);
            anim.clip = dieClip;
            anim.Play();
            gameObject.GetComponent<BoxCollider>().enabled = false;
            StartCoroutine("Deactivate");
        }
    }

2.制作统计得分的UI

首先制作UI

新填UIManager

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

public class UIManager : MonoBehaviour {

    public static UIManager _instance;

    public Text shootNumText;
    public Text scoreText;

    public int shootNum = 0;
    public int score = 0;

    private void Awake()
    {
        _instance = this;
    }

    private void Update()
    {
        shootNumText.text = shootNum.ToString();
        scoreText.text = score.ToString();
    }

    public void AddShootNum()
    {
        shootNum += 1;
    }

    public void AddScore()
    {
        score += 1;
    }

}

并合适的地方添加增添分数和射击数的方法

3. 制作菜单UI

4.暂停游戏和继续游戏

创建GameManager,添加暂停和继续游戏的方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour {

    public static GameManager _instance;

    public bool isPaused = true;
    public GameObject menuGo;

    private void Awake()
    {
        _instance = this;
        UnPause();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Pause();
        }
    }

    private void Pause()
    {
        isPaused = true;
        menuGo.SetActive(true);
        Time.timeScale = 0;
        Cursor.visible = true;
    }

    private void UnPause()
    {
        isPaused = false;
        menuGo.SetActive(false);
        Time.timeScale = 1;
        Cursor.visible = false;
    }

    public void ContinueGame()
    {
        UnPause();
    }
}

为了暂停时,不会让手枪继续射击,需要在手枪添加一行if语句

if(GameManager._instance.isPaused == false)
{

}

5.新游戏和退出游戏

修改怪物更新的方法,让其同样适用于新游戏的生成。

    public void UpdateMonsters()
    {
        StopAllCoroutines();
        if (activeMaonster != null)
        {
            activeMaonster.SetActive(false);
            activeMaonster = null; 
        }
        StartCoroutine("AliveTimer");
    }

添加新游戏和退出游戏

    public void NewGame()
    {
        foreach(GameObject targetGo in targetGos)
        {
            targetGo.GetComponent<TargetManager>().UpdateMonsters();
        }
        UIManager._instance.shootNum = 0;
        UIManager._instance.score = 0;
        UnPause();
    }

    public void QuitGame()
    {
        Application.Quit();
    }

6.添加音效

在合适的物体上添加AudioSource,然后进行播放调用。

7.控制背景音乐的开关

添加背景音乐的开关

    public Toggle musicToggle;
    public AudioSource musicAudio;

    private bool musicOn = true;


    private void MusicSwitch()
    {
        if(musicToggle.isOn == false)
        {
            musicOn = false;
            musicAudio.enabled = false;
        }
        else
        {
            musicOn = true;
            musicAudio.enabled = true;
        }
    }

8.存档相关概念

PlayerPrefs:数据持久化方案。

采用键值对的方式对数据进行存储。

PlayerPrefs.SetInt("Index",1);

可以存储Int, Float, String类型的数据。

PlayerPrefs.SetFloat("Height",183.5f);

PlayerPrefs.SetString("Name","Tom");

获取数据:

PlayerPrefs.GetInt("Index");

Serialization(序列化),可以用来将对象转化为字节流。

Deserialization(反序列化),可以用来将字节流转换为对象。

常见的数据序列化方法:二进制方法,XML方法,JSON方法

9.二进制方法、XML、JSON

二进制方法

二进制方法(Binary Formatter

序列化:新建或打开一个二进制文件,通过二进制格式器将对象写入该二进制文件

反序列化:打开待反序列化的二进制文件,通过二进制格式器将文件解析成对象

 

XML

XML:扩展标记语言,用于标记电子文件使其具有结构性的标记语言。

可以用来标记数据、定义数据类型。

序列化与反序列化的方式与二进制方法十分类似。

http://blog.csdn.net/y1196645376/article/details/52541882

 

JSON

JSON:是一种语言无关的发送和接收数据的常用格式。可以使用它来跨平台的传输数据。

JSON序列化:对象      ->     JSON

JSON反序列化:JSON     ->      对象

 

对比

二进制方法:简单,但可读性差。

XML:可读性强,但是文件庞大,冗余信息多。

JSON:数据格式比较简单,易于读写,但是不直观,可读性比XML差。

10.存储背景音乐的开关状态

在UIManager中修改方法

    private void Awake()
    {
        _instance = this;
        if (PlayerPrefs.HasKey("MusicOn"))
        {
            if (PlayerPrefs.GetInt("MusicOn") == 1)
            {
                musicToggle.isOn = true;
                musicAudio.enabled = true;
            }
            else
            {
                musicToggle.isOn = false;
                musicAudio.enabled = false;
            }
        }
        else
        {
            musicToggle.isOn = true;
            musicAudio.enabled = true;
        }
    }

    public void MusicSwitch()
    {
        if(musicToggle.isOn == false)
        {
            musicOn = false;
            musicAudio.enabled = false;
            PlayerPrefs.SetInt("MusicOn", 0);
        }
        else
        {
            musicOn = true;
            musicAudio.enabled = true;
            PlayerPrefs.SetInt("MusicOn", 1);
        }
        PlayerPrefs.Save();
    }
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值