1.拖入人物物体

找到战士和丧尸的人物包,将他们拖拽到3D窗口中去,人物资源包在Toon_Zombies_extended/prefabs/specials文件夹里边

unity实现丧尸围城项目(第二天)

在Resources文件夹下面新建两个动画操控器,这两个动画操控器分别操控两个物体的动画,比如在这儿咱们能够一运转项目的时分,会出现丧尸在吃战士的动画作用

新建动画操控器Hulk,一起将TZ_crouch_eating动画拖入大动画器窗格中,动画处在Toon_Zombies_extended/animation/Generic文件夹下,并将新建好的操控器拖入到TZ_Hulk_03的操控源中,这样咱们就完好的将人物与动画绑定上了。

unity实现丧尸围城项目(第二天)

一起TZ_Soldier_01人物也是这样的过程,双击solidier动画操控器,翻开动画器窗格,将动画拖到动画器窗格中,并将动画操控器拖入到TZ_Soldier_01的操控源中

unity实现丧尸围城项目(第二天)

运转项目,作用如下:

2.建立丧尸围城UI主页

1.设置UI界面

正如向上面的作用图也看到了有对应的按钮,图画,其实这些都是通过UI来完成的淡入淡出的作用,当然了,不可否认这儿仍是要通过UI管理器以及单例模式代码来完成。

下一步咱们完成设置按钮的UI窗口,也便是当咱们点击设置按钮的时分,会翻开设置的UI界面,在里边咱们能够设置丧尸围城项目的音乐音效的敞开封闭,调理音乐音效的巨细。

unity实现丧尸围城项目(第二天)

设置UI窗口如下:新建一个面板名为SettingPanle,在面板下新建一个图片作为设置界面的底图,新建1个封闭按钮,完成它设置窗口的封闭,名为btnClose。新建两个toggle(单选框)、Slider(滑块),操控音乐音效。总体布局如下:

unity实现丧尸围城项目(第二天)

2.创立脚本文件

将SettingPanle脚本文件挂载到创立好的面板SettingPanle之中,首要完成其功能之前,咱们先考虑操控音效音乐封闭敞开、巨细,以及封闭窗口,这些控件的功能都是要揭露变量,将他们作为预制体拖入进行绑定才能在代码里边更好的获取。在这儿咱们引入了JSON数据的概念。通过JSON传递这些参数咱们完成这是按钮对应的功能。

首要呢咱们创立一个音乐数据结构类,在这个类中咱们存储的是对应要修改的数据类型

//音乐的数据结构类
public class MusicData
{
    //单独作为一个存储数据的类
    //音乐是否静音
    public bool musicOpen = true;
    //音乐音量
    public float musicValue = 0.2f;
    //音效是否静音
    public bool soundOpen = true;
    //音效音量
    public float soundValue = 0.2f;
}

创立GameDataMgr类,在这个脚本文件里边完成的是首要采用静态办法将类实例化,静态类在运转项目的时分只会实例化一次,被其他类所共享,并且项目运转期间一直都存在。咱们先界说了一个自界说类型的MusicData类,通过GameDataMgr的结构办法咱们先将MusicData里边的参数进行初始化加载(因为他们一开始是有默许值的,咱们需要先加载它),一起界说了SavaMusicData办法,这个办法完成保存你修改后的数据(便是用户修改了之后的数据咱们要更新在MusicData一切变量中),一起并通过结构办法进行加载再次的赋值,这样设置才不会脱节。

GameDataMgr代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameDataMgr
{
    //首要这儿应该有一个保存的办法,第一步加载音乐数据获取当时的音乐信息
    public static GameDataMgr Instance = new GameDataMgr();
    //在这个类中创立一个音乐数据变量来存储音乐信息,然后UI中改动的音乐信息就直接改动这个变量中的数据
    //然后在讲数据更新到文件中
    public MusicData musicData;
    private GameDataMgr() //结构办法中加载文件中的数据
    {
        //一开始玩游戏是没有存储音乐文件信息的,所以这儿做了判别,返回了默许的MusicData类对应的目标的值
        musicData = JsonMgr.Instance.LoadData<MusicData>("MusicData");
    }
    //保存我的音乐数据
    public void SavaMusicData()
    {
        //第一个参数是更新的数据,第二个参数是保存的文件名
        JsonMgr.Instance.SaveData(musicData, "MusicData");
    }
}

JsonMgr脚本文件代码如下:

    using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
/// <summary>
/// 序列化和反序列化Json时  运用的是哪种方案
/// </summary>
public enum JsonType
{
    JsonUtlity,
    LitJson,
}
/// <summary>
/// Json数据管理类 首要用于进行 Json的序列化存储到硬盘 和 反序列化从硬盘中读取到内存中
/// </summary>
public class JsonMgr
{
    private static JsonMgr instance = new JsonMgr();
    public static JsonMgr Instance => instance;
    private JsonMgr() { }
    //存储Json数据 序列化
    public void SaveData(object data, string fileName, JsonType type = JsonType.LitJson)
    {
        //确认存储途径
        string path = Application.persistentDataPath + "/" + fileName + ".json";
        //序列化 得到Json字符
        string jsonStr = "";
        switch (type)
        {
            case JsonType.JsonUtlity:
                jsonStr = JsonUtility.ToJson(data);
                break;
            case JsonType.LitJson:
                jsonStr = JsonMapper.ToJson(data);
                break;
        }
        //把序列化的Json字符串 存储到指定途径的文件中
        File.WriteAllText(path, jsonStr);
    }
    //读取指定文件中的 Json数据 反序列化
    public T LoadData<T>(string fileName, JsonType type = JsonType.LitJson) where T : new()
    {
        //确认从哪个途径读取
        //首要先判别 默许数据文件夹中是否有咱们想要的数据 假如有 就从中获取
        string path = Application.streamingAssetsPath + "/" + fileName + ".json";
        //先判别 是否存在这个文件
        //假如不存在默许文件 就从 读写文件夹中去寻觅
        if(!File.Exists(path))
            path = Application.persistentDataPath + "/" + fileName + ".json";
        //假如读写文件夹中都还没有 那就返回一个默许目标
        if (!File.Exists(path))
            return new T();
        //进行反序列化
        string jsonStr = File.ReadAllText(path);
        //数据目标
        T data = default(T);
        switch (type)
        {
            case JsonType.JsonUtlity:
                data = JsonUtility.FromJson<T>(jsonStr);
                break;
            case JsonType.LitJson:
                data = JsonMapper.ToObject<T>(jsonStr);
                break;
        }
        //把目标返回出去
        return data;
    }
}

里边的SaveData办法完成的是获取确认的存储途径,将变量类型转化为JSON数据类型进行值的传递,一起通过写文件的形式将变量值写入对应的变量之中。当然LoadData办法便是读文件的操作了。在这儿就不一一介绍了,理解为一种封装好的模板,咱们直接调用即可

GameDataMgr和MusicData是新建在Resources/Data文件夹下。

unity实现丧尸围城项目(第二天)
Json包是通过导入资源包生成的

unity实现丧尸围城项目(第二天)

创立一个空目标,名为BGM,一起增加音频源组件Audio Source,将音乐导入项目中,并将音乐拖入到音频源中,一起新建脚本文件BGM,并挂载到BGM空目标身上。

BGM脚本文件如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BGM : MonoBehaviour
{
    public static BGM Instance;
    // 当我播映音乐的时分,这儿是不是要设置上默许的音乐参数\
    MusicData musicData;
    //获取音乐组件
    AudioSource audio;
    private void Awake()
    {
        Instance = this; //Instance=当时的游戏目标
        audio = GetComponent<AudioSource>();
        musicData = GameDataMgr.Instance.musicData;
        //给当时的音乐组件设置值
        changeOpen(musicData.musicOpen);
        changeValue(musicData.musicValue);
    }
    //创立一个办法来完成音乐静音
    public void changeOpen(bool isOpen) //打钩表示便是有声音
    {
        audio.mute = !isOpen;
    }
    //创立一个办法来完成改动音量的办法
    public void changeValue(float v)
    {
        audio.volume = v;
    }
}

在BGM脚本文件中完成的是:通过AWake办法当项目加载的时分,主动唤醒办法,加载musicData的默许值,并且每次运转完项目后再次翻开项目仍是得要保存上次用户设置的值,所以在这儿面完成。

上述设置好后,咱们就需要在面板脚本文件SettingPanle完成事务。 SettingPanle脚本文件如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SettingPanle : basePanle
{
    //相关设置面板的一些控件
    public Button btnClose;
    public Toggle togMusic;
    public Toggle togSound;
    public Slider musicSlider;
    public Slider soundSlider;
    //
    public override void Init() //这个初始化的办法咱们都知道它在basePanle中Start运转
    {
        togMusic.isOn = GameDataMgr.Instance.musicData.musicOpen;
        togSound.isOn = GameDataMgr.Instance.musicData.soundOpen;
        musicSlider.value = GameDataMgr.Instance.musicData.musicValue;
        soundSlider.value = GameDataMgr.Instance.musicData.soundValue;
        btnClose.onClick.AddListener(() =>
        {
            GameDataMgr.Instance.SavaMusicData(); //保存当时设置的音乐信息
            //封闭设置面板
            UIManager.Instance.hidePanle<SettingPanle>();
        });
        //监听按钮,修改按钮值后也一起监听到
        togMusic.onValueChanged.AddListener((v) =>
        {
            GameDataMgr.Instance.musicData.musicOpen = v;
            //更改背景音乐
            BGM.Instance.changeOpen(v);
        });
        musicSlider.onValueChanged.AddListener((v) => {
            GameDataMgr.Instance.musicData.musicValue = v; //更改音乐的数据
            BGM.Instance.changeValue(v); //更改播映音乐目标的音量
        });
    }
}

SettingPanle类继承基类basePanle,完成笼统办法Init办法,在办法里边咱们进行值的获取,并且当咱们点击封闭按钮的时分,咱们要保存当时用户调理的参数值后再将设置UI界面淡出。

当一切设置好后,把SettingPanle作为预制体拖入到Resources/UI文件夹里边去。当咱们运转项目的时分,点击设置按钮,调用设置事务

UIManager.Instance.showpanle<SettingPanle>();

调用UI管理器中的showpanle办法,翻开设置界面,在SettingPanle脚本文件里边,加载每次的musicData的值,保存每次修改后设置的值,封闭按钮点击后,保存值,封闭设置UI界面,这样咱们的功能就完成好了。

3.作用如下: