HOME
BLOG
Unity 资源管理
9月 14 2022

资源导入与导出

导出: 右键想要导出的物体或文件夹 –》Export Package

导入: 将对象拖入 Assets 即可


预制体实例化

游戏中大多数情况下我们都需要通过代码生成子弹,刷新小兵等,所以需要将预制体实例化到场景中

GameObject.Instantiate() :有多个重载,根据情况选择

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

public class L10_2Demo : MonoBehaviour
{
    public GameObject Prefab_Cube;
    void Start()
    {

    }
    private void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Input.GetMouseButtonDown(0) && Physics.Raycast(ray, out RaycastHit hitinfo, 1000))
        {
            GameObject cube = GameObject.Instantiate(Prefab_Cube, hitinfo.point, Quaternion.identity, transform);
        }
    }
}

Resource 资源加载

特殊文件夹:Resource

目的:预制体、Sprite 等资源在目录中,动态的加载进来

使用:Resource.Load<GameObject>("path");

重要:Resource 进行的预制体加载,不等于实例化

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

public class L10_2Demo : MonoBehaviour
{
    private GameObject prefab_Cube;
    public Sprite sprite;
    void Start()
    {
        prefab_Cube = Resources.Load<GameObject>("Prefabs/Cube");
        sprite = Resources.Load<Sprite>("Test");
    }

    private void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Input.GetMouseButtonDown(0) && Physics.Raycast(ray, out RaycastHit hitinfo, 1000))
        {
            GameObject cube = GameObject.Instantiate(prefab_Cube, hitinfo.point, Quaternion.identity, transform);
        }
    }
}

数据存档 - PlayerPrefsr

单机游戏存放在本地,网络游戏中一般存放在服务端的数据库,一些没那么关键的数据也可以存放在本地

PlayerPrefsr 是 Unity 提供的一种存档方式

| 存储和获取

存储

  • PlayerPrefs.SetInt("Key",999);

  • PlayerPrefs.SetFloat("Key",1.11f);

  • PlayerPrefs.SetString("Key","Hello");

获取

  • int value = PlayerPrefs.GetInt("key");

  • float value = PlayerPrefs.GetFloat("key");

  • string value = PlayerPrefs.GetString("key");

| 删除数据、查找数据

删除全部:

  • PlayerPrefs.DeleteAll();

删除指定的数据:

  • PlayerPrefs.DeleteKey("key");

查找有没有这个key的数值:

  • bool exist = PlayerPrefs.HasKey("key");

| 数据位置

存储在注册表的 HKEY_CURRENT_USER\Software[company name][product name]

打开方式:cmd 中 regedit.exe

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

public class L10_4Demo : MonoBehaviour
{
    void Start()
    {
        // Save
        PlayerPrefs.SetString("PlayerName", "Morikiiii");
        PlayerPrefs.SetFloat("floatValue", 2.5f);
        PlayerPrefs.SetInt("Age", 22);

        //PlayerPrefs.DeleteAll();
        PlayerPrefs.DeleteKey("Age");

        // Load
        string playName = PlayerPrefs.GetString("PlayerName");
        float floatValue = PlayerPrefs.GetFloat("floatValue");
        int age = -1;
        if (PlayerPrefs.HasKey("Age"))
        {
            age = PlayerPrefs.GetInt("Age");
        }

        Debug.Log(playName);
        Debug.Log(floatValue);
        Debug.Log(age);
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            PlayerPrefs.SetString("PlayerName", "Kiyoki");
        }
    }
}

游戏场景加载

根据功能来划分场景,比如:登录场景、游戏大厅、角斗场、战斗场景、副本场景、不同的关卡场景

场景就是 Unity 中的一个一个 Scene,我们重点需要掌握:

  • 场景切换

场景切换的前提:

该场景必须被打包,也就是 File –》Build Setting 将场景拖拽进Scenes in Build,排序第一(编号 0 代表的场景)的场景会作为游戏开始的开场场景

完成场景切换::

  • 命名空间:using UnityEngine.SceneManagement;

  • 加载场景:SceneManager.LoadScene(); ,多个重载方式

    • int:场景编号

    • string:场景名称

  • 数据保留

场景切换,会导致前面一个场景的全部游戏物体都销毁,但是实际开发中,有时候我们可能希望将一些游戏物体带到下一个场景中。

  • GameObject.DontDestroyOnLoad(object) :加载场景不销毁

    • object:一般直接使用 gameObject ,即可将整个游戏物体以及数据带入下一个场景
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class L10_5Demo : MonoBehaviour
{
    private void Awake()
    {
        GameObject.DontDestroyOnLoad(gameObject);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            SceneManager.LoadScene(1);
            //SceneManager.LoadScene("1.资源导入与导出");
        }
    }
}

声音系统

音效必不可少

AudioListener 组件:可以让我们听到音效,本身并没有其他额外功能

| Audio Source

(1)AudioClip (音频剪辑):指定播放的音频文件。在 Unity 引擎中的资源类型都是 AudioClip 类型。

(3)Mute (是否静音):主要是针对游戏中的音效,优势在于不会卸载声音数据,可以做到及时播放,音效一般比较多、占用内存小,使用静音可以让画面快速响应,且可以立刻恢复当前音效。

(7)Play On Awake (启动播放开关):勾选就会在绑定组件的GameObiect加载并启用时立刻播放音频。

(8)Loop (循环播放开关):音频播放结束自动循环。

(9)Priority(播放优先级):决定音源在场景中存在的所有音源中的播放优先级。

(10)Volume (音量):调节音量的大小。

(11)Pitch(音调):播放音频时速度的变化量,默认值1,表示正常的播放速度。(当 <1 时,慢速播放;当 >1 时,快速播放。速度越快,音调越高。)

(12)Stereo Pan(声道占比)

(13)Spatial Blend(空间混合):指定音源是2D音源(0)、3D音源(1)或者是二者插值的复合音源。

(14)Reverb Zone Mix(回音混合)

(15)3D Sound Settings(3D音频设置)

| 常用方法

  • play() 函数:播放音频剪辑

  • Stop() 函数:停止播放

  • Pause() 函数:暂停播放

  • PlayOneShot(AudioClip) :播放某个片段一次,可以叠加,Play是播放面板上的音效,而 PlayOneShot 适合播放射击音效这种,会重叠,并且很确定播放一次即可


案例:玩家设置保存

目标:使用 UI 控制背景音乐大小,并且音量设置要保存在本地,下次启动时依然有效

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

public class L10_7Demo : MonoBehaviour
{
    public AudioSource audioSource;
    public Slider slider;
    void Start()
    {
        slider.onValueChanged.AddListener(SliderOnValueChanged);
        float volume = 1;
        if (PlayerPrefs.HasKey("audioVolume"))
        {
            volume = PlayerPrefs.GetFloat("audioVolume");
        }
        audioSource.volume = volume;
        slider.value = volume;
    }

    // Change Volume
    // Save Setting
    void SliderOnValueChanged(float value)
    {
        audioSource.volume = value;
        PlayerPrefs.SetFloat("audioVolume", value);
    }
}

Windows 打包发布

  • 游戏发布

    • 指从 Unity 中的工程项目转换为玩家可以直接打开的 exe 程序
  • 设置发布场景

    • File –> Build Settings –> Scenes In Build

    • 可以将场景文件直接拖拽进去

    • 编号 0 就是游戏启动场景

  • 发布常规设置

    • Company Name:企业 / 发布人名称

    • Product Name:产品名称 即游戏名称

    • Version:版本号

    • Default Icon:游戏图标

    • Default Cursor:游戏鼠标

  • 常用发布分辨率设置

    • Resolution and Presentation:分辨率和显示 设置栏目

      • Fullscreen Mode:显示模式,主要设置是否全屏

      • Default is Native Resolution:自动设置分辨率,如果取消可以手动设置游戏分辨率

  • 一切设置完成后,点击 Build 选择发布目录即可



👾森木清树👾

Unity Study