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:配置参数
- 在Unity Inspector面板中,给
CharacterSelect脚本的characterCosts数组设置长度(和角色数量一致),第一个角色填0(默认解锁),其余角色填写对应价格。 - 将新增的UI元素(costText、coinText、unlockBtn)拖到脚本对应的引用槽中。
- 给解锁按钮的
OnClick()事件绑定CharacterSelect脚本的OnUnlockButtonClick方法。
关键注意事项
- 数据持久化:每次修改
PlayerPrefs后调用Save(),确保数据写入本地。 - 初始状态:首次进入游戏时自动给玩家初始金币,同时默认解锁第一个角色。
- UI同步:每次切换角色必须调用
UpdateCharacterUI(),保证按钮和文本状态正确。
内容的提问来源于stack exchange,提问作者Ukrainian
相关产品推荐
相关产品推荐

