【Unity2D游戏开发入门第三卷】✨Unity入门总结Sunnyland示例(下卷)
✨✨目录
一、入门卷【下卷】
[入门卷] 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.