关卡界面
1.显示信息区域
在Canvas下新建Panel,命名为LevelInfoPanel,修改大小、位置、属性
在LevelInfoPanel下新建Text,命名为LevelNameText,修改属性,内容为:关卡名
2.LSUIController
添加参数,分别指向UI界面的关卡LevelInfoPanel和Text,显示的关卡信息panel和关卡名信息
public GameObject levelInfoPanel; //关卡信息panel
public Text levelName; //关卡名Text
添加显示和隐藏关卡信息函数
//显示信息
public void ShowInfo(MapPoint levelPoint)
{
levelName.text = levelPoint.levelName;
levelInfoPanel.SetActive(true);
}
//隐藏信息
public void HideInfo()
{
levelInfoPanel.SetActive(false);
}
3.MapPoint
添加参数,表示关卡名信息
public string levelName; //关卡名信息
在各关卡填写信息
4.LevelSelectPlayer
Update中,判断跳转关卡后,加入显示当前关卡信息LSUIController.sInstance.ShowInfo(currentPoint);
//跳转关卡
if (currentPoint.isLevel && currentPoint.levelToLoad != "" && currentPoint.isLocked == false)
{
//显示当前关卡信息
LSUIController.sInstance.ShowInfo(currentPoint);
if(Input.GetButtonDown("Jump"))
{
levelLoading = true;
//加载场景
theManager.LoadLevel();
}
}
显示下一个时移动点,加入隐藏当前关卡信息LSUIController.sInstance.HideInfo();
//设置下一个移动点
public void SetNextPoint(MapPoint nextPoint)
{
currentPoint = nextPoint;
//隐藏当前关卡信息
LSUIController.sInstance.HideInfo();
}
5.添加关卡显示信息
新建两个UI->Image,表示钻石和时间信息
新建3个Text,表示钻石的信息
新建3个Text,表示时间的信息
MapPoint.cs中添加4个参数,分别表示4个值
public int gemsCollected; //获取到的钻石
public int totalGem; //关卡总钻石
public float bestTime; //最好时间
public float targetTime; //目标时间
LSUIController.cs中添加4个参数,分别指向4个Text,并绑定4个节点
public Text gemsFound; //当前钻石数
public Text gemsTarget; //关卡目标总钻石数
public Text bestTime; //最好时间
public Text timeTarget; //目标时间
显示信息函数ShowInfo中,设置4个Text的显示值
//显示信息
public void ShowInfo(MapPoint levelPoint)
{
levelName.text = levelPoint.levelName;
gemsFound.text = "获取钻石数:" + levelPoint.gemsCollected;
gemsTarget.text = "关卡:" + levelPoint.totalGem;
timeTarget.text = "目标:" + levelPoint.targetTime + "s";
if(levelPoint.bestTime == 0)
{
bestTime.text = "最好时间:----";
}
else
{
// .ToString("F1")保留为小数
bestTime.text = "最好时间:" + levelPoint.bestTime.ToString("F1") + "s";
}
levelInfoPanel.SetActive(true);
}
6.存储时间、获取钻石等信息
LevelManager.cs中,添加通关时间参数,在Start()中初始化,在Update()中更新
public float timeInLevel; //通关关卡花费的时间
void Start()
{
timeInLevel = 0f;
}
void Update()
{
timeInLevel += Time.deltaTime;
}
在EndLevelCo()中存储信息后,添加存储信息:获取钻石数,通关时间
//存储信息
PlayerPrefs.SetInt(SceneManager.GetActiveScene().name + "_unlocked", 1);
PlayerPrefs.SetInt(SceneManager.GetActiveScene().name + "_gems", gemCollected);
PlayerPrefs.SetFloat(SceneManager.GetActiveScene().name + "_time", timeInLevel);
在MapPoint.cs中的if (isLevel && levelToLoad != null)
后面获取存储的信息:钻石数和通关时间,赋值给定义好的参数
//获取钻石数和通关时间
if(PlayerPrefs.HasKey(levelToLoad + "_gems"))
{
gemsCollected = PlayerPrefs.GetInt(levelToLoad + "_gems");
}
if (PlayerPrefs.HasKey(levelToLoad + "_time"))
{
bestTime = PlayerPrefs.GetFloat(levelToLoad + "_time");
}
7.设置存储最好成绩
LevelManager.cs中修改存储的信息为最好成绩:钻石数和最好成绩
//钻石信息
if(PlayerPrefs.HasKey(SceneManager.GetActiveScene().name + "_gems"))
{
if(gemCollected > PlayerPrefs.GetInt(SceneManager.GetActiveScene().name + "_gems"))
{
PlayerPrefs.SetInt(SceneManager.GetActiveScene().name + "_gems", gemCollected);
}
}
else
{
PlayerPrefs.SetInt(SceneManager.GetActiveScene().name + "_gems", gemCollected);
}
//通关时间信息
if (PlayerPrefs.HasKey(SceneManager.GetActiveScene().name + "_time"))
{
if (timeInLevel < PlayerPrefs.GetFloat(SceneManager.GetActiveScene().name + "_time"))
{
PlayerPrefs.SetFloat(SceneManager.GetActiveScene().name + "_time", timeInLevel);
}
}
else
{
PlayerPrefs.SetFloat(SceneManager.GetActiveScene().name + "_time", timeInLevel);
}
8.设置获取最好成绩标识
在MapPoint节点中添加两个标识,分别是钻石和时间
设置好位置,初始化设置隐藏

在MapPoint.cs中,添加参数
public GameObject gemBadge; //最优钻石标识
public GameObject timeBadge; //最优时间标识
在Unity中指向两个节点,并Overrides预制体,是所有的MapPoint都生效
可以看到所有的都更改了,但不是level的点也改变了信息,需要将其改回去
在MapPoint.cs中,Start()函数中,if (isLevel && levelToLoad != null)
判断中,在获取钻石数和通关时间后,加入判断显示钻石标识和时间标识
//设置显示最优钻石和时间标识
if(gemsCollected > totalGem)
{
gemBadge.SetActive(true);
}
if(bestTime < targetTime && bestTime != 0)
{
timeBadge.SetActive(true);
}
9.加载到正确进入的关卡点
LevelManager.cs中,存储信息后添加存储当前关卡信息
PlayerPrefs.SetString("CurrentLevel", SceneManager.GetActiveScene().name);
LSManager.cs中,添加参数allPoints表示所有的MapPoint,并在Start()中初始化,同时判断当前关卡信息,来设置关卡场景中正确的关卡点
private MapPoint[] allPoints;
void Start()
{
allPoints = FindObjectsOfType<MapPoint>();
if(PlayerPrefs.HasKey("CurrentLevel"))
{
foreach(MapPoint point in allPoints)
{
if(point.levelToLoad == PlayerPrefs.GetString("CurrentLevel"))
{
thePlayer.transform.position = point.transform.position;
thePlayer.currentPoint = point;
}
}
}
}
在暂停界面,PauseMenu.cs中,跳转关卡选择场景,LevelSelectScene()函数开始时,存储当前关卡点
//存储当前关卡点
PlayerPrefs.SetString("CurrentLevel", SceneManager.GetActiveScene().name);
10.添加音效
添加预制体声音管理AudioManager到当前场景
将LevelSelectMusic拖到AudioManager下的BgMusic中
设置当前AudioManager节点下的MainLevel的属性Play On Awake为false
LevelSelectPlayer.cs中,添加移动音效
//设置下一个移动点
public void SetNextPoint(MapPoint nextPoint)
{
//...
//移动音效
AudioManager.sInstance.playSFX(5);
}
LSManager.cs中,添加关卡选择音效
public IEnumerator LoadLevelCo()
{
//关卡选择音效
AudioManager.sInstance.playSFX(4);
//...
}
11.胜利通关音乐
调整层级LevelInfoPanel在FadeScreen前面,优化游戏显示效果
AudioManager.cs中,添加函数PlayLevelVictory():播放胜利通关音乐
//通关胜利音乐
public void PlayLevelVictory()
{
bgMusic.Stop();
levelEndMusic.Play();
}
LevelManager.cs中,函数EndLevelCo()里第一行添加播放胜利音乐
修改持续时间0.25s为3s,使游戏结束持续一段时间播放胜利音乐
//通关胜利音乐
AudioManager.sInstance.PlayLevelVictory();
yield return new WaitForSeconds((1f / UIController.sInstance.fadeSpeed) + 3f);
函数PlayLevelVictory():播放胜利通关音乐
```c#
//通关胜利音乐
public void PlayLevelVictory()
{
bgMusic.Stop();
levelEndMusic.Play();
}
LevelManager.cs中,函数EndLevelCo()里第一行添加播放胜利音乐
修改持续时间0.25s为3s,使游戏结束持续一段时间播放胜利音乐
//通关胜利音乐
AudioManager.sInstance.PlayLevelVictory();
yield return new WaitForSeconds((1f / UIController.sInstance.fadeSpeed) + 3f);