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();
}