【Unity2D游戏开发入门第三卷】✨Unity入门总结Sunnyland示例(下卷)

✨✨目录










一、入门卷【下卷】

回到顶部

  1. 简单 UI

  2. 主菜单

  3. 暂停菜单

  4. 安卓测试游戏(触控操作)

  5. 游戏生成

[入门卷] 12. 简单 UI

A. 添加 Text

这里使用的是旧版本 Text

在之前的画布上创建文本

更改属性,这里设置锚点,适应不同分辨率

调整文本居中,设置文本

Ctrl + D 拷贝一份 Text,作为收集物数目记录

B. 示例代码

创建新脚本 UI_CollectionNum.cs

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

public class UI_CollectionNum : MonoBehaviour
{
    
    
    // --- public --------------------------------------
    public Text m_TextCollectionNum;
    public PlayerController m_Player;

    // --- private -------------------------------------
    private void Update()
    {
    
    
        m_TextCollectionNum.text = m_Player.m_CollectionsCount.ToString();
    }
}

我挺喜欢这个深紫色背景,所以我将文本颜色改成了白色
这里可以设置很多属性,自己多尝试一下,这样才印象深刻
试过之后会发现挺简单的

C. 小节示例










[入门卷] 13. 游戏开始主菜单

A. 新建场景

新建一个场景,并命名为 MainMenu

B. 设置画布面板背景

这里将背景设置为 None,保证完全填充

可能你会发现游戏画面并不是全黑(即使你将颜色变黑,可能你忘记了设置透明度?小坑)

你也可以截取一张图片,我这里截取了一张 场景2 的图片作为面板的背景图

将面板重命名为 BG

C. 设置画布面板按钮

再添加一个面板,重命名为 MainMenu

我们在上面添加一些按钮

可能会让你导入一些扩展包,这里我两个都导入了

属性设置你可以适当的调节

大概是这样

再复制一份,更改文本为 “Button”

D. 设置标题

E. 添加脚本

添加 C# 脚本 MainMenu.cs

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

public class MainMenu : MonoBehaviour
{
    
    
    /// <summary>
    /// @brief 开始游戏
    /// </summary>
    public void PlayGame()
    {
    
    
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); 
    }

    /// <summary>
    /// @brief 退出游戏
    /// </summary>
    public void QuitGame()
    {
    
    
        // 下面两个都可以
        //Application.Quit();  // 这个要发布游戏才能有效
        UnityEditor.EditorApplication.isPlaying = false;  // 用这个吧
    }
}

这里将脚本 MainMenu 挂在 MainMenu 对象上,点击按钮,按钮的 Button 组件下有 On Click

可以在被点击是调用函数,将 MainMenu 对象拖进去,选中我们添加的脚本

现在可以运行游戏测试一下【不要忘记在 BuildSettings 中设置场景的 Build Index

在添加一个渐变动画吧,这里可以适当调节 Samples,然后将动画循环取消勾选(点击 anim 文件就能看到)

让动画播放完再显示文本和按钮

创建一个空对象管理

MainMenu 中添加代码

/// <summary>
/// @brief 激活UI,显示
/// </summary>
public void ShowUI()
{
    
    
    GameObject.Find("Canvas/MainMenu/UI").SetActive(true);
}

Ok,那么这个菜单场景就完成了

F. 小节演示










[入门卷] 14. 暂停菜单

A. 设置 UI

在第一个场景中,我们在画布上添加一个暂停按钮

如果你想输入中文,其中有一种方法是创建中文字体

再创建一张画布,作为菜单弹出的页面,这个颜色随意,我仅做演示

创建滑动条,设置滑动条颜色

更改填充颜色

B. 添加脚本

创建 GamePauseMenu.cs

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

public class GamePauseMenu : MonoBehaviour
{
    
    
    // --- public ----------------------------------------------
    public Slider m_Slider;  // 滑动条,控制音量
    public GameObject Panel_PauseMenu;

    /// <summary>
    /// @brief 暂停游戏
    /// </summary>
    public void OnClickPause()
    {
    
    
        Panel_PauseMenu.SetActive(true);
        Time.timeScale = 0.0f;
    }

    /// <summary>
    /// @brief 恢复游戏
    /// </summary>
    public void OnClickResume()
    {
    
    
        Panel_PauseMenu.SetActive(false);
        Time.timeScale = 1.0f;
    }

    /// <summary>
    /// @brief 退出游戏
    /// </summary>
    public void OnClickQuit()
    {
    
    
        UnityEditor.EditorApplication.isPlaying = false;
    }
}

不要忘记给按钮添加函数,更之前是一样的做法

C. 滑动条调节音量

调节音量有很多方法,这里先提供一种我常用的

注意到这里有个 Output,需要 Audio Mixer

Window -> Audio -> Audio Mixer

点击添加,重命名为 MainMixer

你可以手动创建,如果我打开 Audio Mixer 面板添加会自动创建到项目目录下

然后双击是可以打开该面板的

现在,将所有的 Audio Source 的 Output 设置为 MainMixer 关联起来

可能不能直接拖拽,需要点击右边按钮设置指定 Mixer,应该很简单,主要是熟悉流程

这里调节一下滑动条的值

需要创建一个参数

GamePauseMenu.cs 中添加脚本

using UnityEngine.Audio;

public AudioMixer m_MainMixer;

/// <summary>
/// @brief 调节音量
/// </summary>
/// <param name="value"></param>
public void OnChangedVolume(float value)
{
    
    
    m_MainMixer.SetFloat("MasterVolume", value);
}

private void Start()
{
    
    
    // 开局先设置一次音量,不然开始没刷新,突然调节音量会突然变化
    m_MainMixer.SetFloat("MasterVolume", -15.0f);
}

给滑动条设置函数

GamePauseMenu.cs 完整代码

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

public class GamePauseMenu : MonoBehaviour
{
    
    
    // --- public ----------------------------------------------
    public Slider m_Slider;  // 滑动条,控制音量
    public GameObject Panel_PauseMenu;
    public AudioMixer m_MainMixer;  // MainMixer

    /// <summary>
    /// @brief 暂停游戏
    /// </summary>
    public void OnClickPause()
    {
    
    
        Panel_PauseMenu.SetActive(true);
        Time.timeScale = 0.0f;
    }

    /// <summary>
    /// @brief 恢复游戏
    /// </summary>
    public void OnClickResume()
    {
    
    
        Panel_PauseMenu.SetActive(false);
        Time.timeScale = 1.0f;
    }

    /// <summary>
    /// @brief 退出游戏
    /// </summary>
    public void OnClickQuit()
    {
    
    
        UnityEditor.EditorApplication.isPlaying = false;
    }

    /// <summary>
    /// @brief 调节音量
    /// </summary>
    /// <param name="value"></param>
    public void OnChangedVolume(float value)
    {
    
    
        m_MainMixer.SetFloat("MasterVolume", value);
    }

    private void Start()
    {
    
    
        // 开局先设置一次音量,不然开始没刷新,突然调节音量会突然变化
        m_MainMixer.SetFloat("MasterVolume", -15.0f);
    }
}

Ok,现在菜单功能完成了,你可以试一下,然后也可以增加更多功能










[入门卷] 15. 安卓测试游戏(触控操作)

A. 手机测试

这里演示安卓平台的

file -> build settings

切换到安卓平台,没安装的需要安卓一下

连接数据线,可能要你勾选一下选项,都勾选,然后切换一下设备

现在运行游戏应该可以看到手机上同步了

B. 触控操作

添加这个插件,✨Unity Asset Store 可以找到

PlayerController.cs 移动更改

/// <summary>
/// @brief 水平移动
/// </summary>
private void HorizontalMove()
{
    
    
    // 获取水平输入 [-1, 1],松开按键时为 0
    //float horizontalValue = Input.GetAxis("Horizontal");
    float horizontalValue = m_Joystick.Horizontal;  // 手机端触控遥控
    
    // ...

PlayerContrller.cs 改动

[Header("手机触控操作")]
public Joystick m_Joystick;
public bool m_BClickJump = false;

/// <summary>
/// @brief 检测状态
/// </summary>
private void CheckState()
{
    
    
    // 跑动
    m_BAnimRunning = (Mathf.Abs(m_Rb.velocity.x) > 0.1f && !m_BAnimCrouching && !m_BAnimJumping && !m_BAnimFalling);
    // 下落
    m_BAnimFalling = m_Rb.velocity.y < -0.1f;
    // 跳跃
    if ((m_BOnGround && (m_BDoJump || m_BClickJump)) || (!m_BOnGround && m_AllowAirJumpCount > 0 && (m_BDoJump || m_BClickJump)))
    {
    
    
        m_BAnimJumping = true;
    }
    else if (m_BAnimFalling)
    {
    
    
        m_BAnimJumping = false;
    }
    // 下蹲
    m_BAnimCrouching = (m_BOnGround && ((m_BPressedCrouch && (!m_BAnimJumping || !m_BAnimFalling)) || m_BTopHasWall));
    // 闲置
    m_BAnimIdling = (m_BOnGround && !m_BAnimCrouching && !m_BAnimFalling);
}

/// <summary>
/// @brief 跳跃
/// </summary>
private void Jump()
{
    
    
    if (m_BOnGround && (m_BDoJump || m_BClickJump))
    {
    
    
        m_BDoJump = false;
        m_BClickJump = false;
        m_Rb.velocity = new Vector2(m_Rb.velocity.x, m_JumpSpeedPerSecond * Time.fixedDeltaTime);
        // 播放音效
        AudioManager.GetInstance().PlayJumpAudio();
    }
    if (!m_BOnGround && m_CurrentAllowAirJumpCount > 0 && (m_BDoJump || m_BClickJump))
    {
    
    
        // 空中跳跃
        m_BDoJump = false;
        m_BClickJump = false;
        --m_CurrentAllowAirJumpCount;
        m_Rb.velocity = new Vector2(m_Rb.velocity.x, m_JumpSpeedPerSecond * Time.fixedDeltaTime);
        // 播放音效
        AudioManager.GetInstance().PlayJumpAudio();
    }
}

GamePasueMenu

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

public class GamePauseMenu : MonoBehaviour
{
    
    
    // --- public ----------------------------------------------
    public Slider m_Slider;  // 滑动条,控制音量
    public GameObject Panel_PauseMenu;
    public AudioMixer m_MainMixer;  // MainMixer
    public PlayerController m_Player;

    /// <summary>
    /// @brief 暂停游戏
    /// </summary>
    public void OnClickPause()
    {
    
    
        Panel_PauseMenu.SetActive(true);
        Time.timeScale = 0.0f;
    }

    /// <summary>
    /// @brief 恢复游戏
    /// </summary>
    public void OnClickResume()
    {
    
    
        Panel_PauseMenu.SetActive(false);
        Time.timeScale = 1.0f;
    }

    /// <summary>
    /// @brief 退出游戏
    /// </summary>
    public void OnClickQuit()
    {
    
    
        UnityEditor.EditorApplication.isPlaying = false;
    }

    /// <summary>
    /// @brief 调节音量
    /// </summary>
    /// <param name="value"></param>
    public void OnChangedVolume(float value)
    {
    
    
        m_MainMixer.SetFloat("MasterVolume", value);
    }

    private void Start()
    {
    
    
        // 开局先设置一次音量,不然开始没刷新,突然调节音量会突然变化
        m_MainMixer.SetFloat("MasterVolume", -15.0f);
    }

    /// <summary>
    /// @brief 按下跳跃按键
    /// </summary>
    public void OnClickJump()
    {
    
    
        m_Player.m_BClickJump = true;
    }
}

现在可以试一下,然后你还可以添加更多功能,比如用按键实现跳跃

C. 小节演示










[入门卷] 16. 游戏生成

以安卓平台为例

也可以设置项目设置

选择平台,Build

Build 可能有个小坑,之前代码

这个不能在安卓平台使用,用第一个即可

UnityEditor.EditorApplication.isPlaying = false;  // 用这个吧
/// <summary>
/// @brief 退出游戏
/// </summary>
public void QuitGame()
{
    
    
    // 下面两个都可以
    Application.Quit();  // 这个要发布游戏才能有效
    //UnityEditor.EditorApplication.isPlaying = false;  // 用这个吧
}

应该有两个地方要改,都改成第一种方式即可正常导出

还有一个,主场景UI,其他 UI 可以自己调整

设置默认竖屏旋转










二、杂项卷

[杂项卷] 1. 将画布 UI 变预制体后切换场景无效

这个还是基础问题

可能你忘记了 EventSystem

添加一个 EventSystem 即可










三、最后

那么,Sunnyland 示例到这里就完结了,其实安卓平台还有很多问题没讲,之后会出单独模块介绍

The End.

猜你喜欢

转载自blog.csdn.net/weixin_50114337/article/details/128303539