二十九.关卡界面

关卡界面

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节点中添加两个标识,分别是钻石和时间

请添加图片描述

设置好位置,初始化设置隐藏

image-20240630153623764

在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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值