You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 3D多子对象角色解锁按钮功能实现求助

角色解锁系统实现方案(基于PlayerPrefs)

核心思路

用PlayerPrefs存储每个角色的解锁状态和玩家金币,切换角色时动态更新解锁按钮的显示,点击解锁时校验金币并更新状态。


步骤1:添加必要UI元素

在场景中新增:

  • 一个Text组件:显示当前角色的解锁价格
  • 一个Text组件:显示玩家当前拥有的金币
  • 一个Button组件:解锁按钮(默认隐藏或禁用,根据角色解锁状态调整)

步骤2:修改角色选择脚本

以下是修改后的完整代码,关键改动已标注注释:

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

public class CharacterSelect : Singleton<CharacterSelect>
{
    GameObject[] characters;
    int index;
    
    // 每个角色的解锁价格,第一个角色默认免费解锁
    public int[] characterCosts;
    // UI元素引用
    public Text costText;
    public Text coinText;
    public Button unlockBtn;

    public GameObject leftBtn, rightBtn;
    public Button play;

    void Start()
    {
        // 初始化角色数组(原逻辑保留)
        characters = new GameObject[transform.childCount - 3];
        for (int i = 0; i < characters.Length; i++)
        {
            characters[i] = transform.GetChild(i).gameObject;
        }

        // 初始化所有角色为隐藏
        foreach (GameObject go in characters)
        {
            go.SetActive(false);
        }

        // 默认显示第一个角色
        if (characters.Length > 0)
        {
            characters[0].SetActive(true);
            // 首次进入游戏时,标记第一个角色为已解锁
            if (!IsCharacterUnlocked(0))
            {
                SetCharacterUnlocked(0, true);
            }
        }

        // 首次进入游戏时给玩家初始金币(比如100)
        if (!PlayerPrefs.HasKey("PlayerCoins"))
        {
            PlayerPrefs.SetInt("PlayerCoins", 100);
        }

        // 更新初始UI显示
        UpdateCharacterUI();
    }

    // 检查角色是否已解锁
    bool IsCharacterUnlocked(int charIndex)
    {
        return PlayerPrefs.GetInt($"Unlocked_{charIndex}", 0) == 1;
    }

    // 设置角色解锁状态
    void SetCharacterUnlocked(int charIndex, bool isUnlocked)
    {
        PlayerPrefs.SetInt($"Unlocked_{charIndex}", isUnlocked ? 1 : 0);
        PlayerPrefs.Save(); // 立即保存防止数据丢失
    }

    // 获取玩家当前金币
    int GetPlayerCoins()
    {
        return PlayerPrefs.GetInt("PlayerCoins", 0);
    }

    // 扣除玩家金币
    void DeductCoins(int amount)
    {
        int currentCoins = GetPlayerCoins();
        PlayerPrefs.SetInt("PlayerCoins", currentCoins - amount);
        PlayerPrefs.Save();
    }

    // 更新角色选择界面的UI状态
    void UpdateCharacterUI()
    {
        // 更新金币显示
        coinText.text = $"金币: {GetPlayerCoins()}";

        bool isUnlocked = IsCharacterUnlocked(index);
        // 处理解锁按钮和Play按钮状态
        if (isUnlocked)
        {
            unlockBtn.gameObject.SetActive(false);
            play.interactable = true; // 已解锁才能点击Play
        }
        else
        {
            unlockBtn.gameObject.SetActive(true);
            play.interactable = false; // 未解锁不能点击Play
            // 更新价格显示
            costText.text = $"解锁价格: {characterCosts[index]}";
            // 金币不足时禁用解锁按钮
            unlockBtn.interactable = GetPlayerCoins() >= characterCosts[index];
        }
    }

    // 修改切换逻辑:切换后更新UI
    public void SelectLeft()
    {
        characters[index].SetActive(false);
        index--;
        if (index < 0)
        {
            index = characters.Length - 1;
        }
        characters[index].SetActive(true);
        UpdateCharacterUI(); // 切换后同步UI状态
    }

    public void SelectRight()
    {
        characters[index].SetActive(false);
        index++;
        if (index == characters.Length)
        {
            index = 0;
        }
        characters[index].SetActive(true);
        UpdateCharacterUI(); // 切换后同步UI状态
    }

    // 解锁按钮点击事件
    public void OnUnlockButtonClick()
    {
        int cost = characterCosts[index];
        if (GetPlayerCoins() >= cost)
        {
            DeductCoins(cost);
            SetCharacterUnlocked(index, true);
            UpdateCharacterUI(); // 解锁后更新UI
        }
    }
}

步骤3:配置参数

  1. 在Unity Inspector面板中,给CharacterSelect脚本的characterCosts数组设置长度(和角色数量一致),第一个角色填0(默认解锁),其余角色填写对应价格。
  2. 将新增的UI元素(costText、coinText、unlockBtn)拖到脚本对应的引用槽中。
  3. 给解锁按钮的OnClick()事件绑定CharacterSelect脚本的OnUnlockButtonClick方法。

关键注意事项

  • 数据持久化:每次修改PlayerPrefs后调用Save(),确保数据写入本地。
  • 初始状态:首次进入游戏时自动给玩家初始金币,同时默认解锁第一个角色。
  • UI同步:每次切换角色必须调用UpdateCharacterUI(),保证按钮和文本状态正确。

内容的提问来源于stack exchange,提问作者Ukrainian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:57:10