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

如何在Unity3D中通过代码实现购买商店物品时修改主模型?

实现商店购买后切换飞船模型的完整方案

嘿,我来帮你搞定这个飞船加火箭的需求!咱们得把整个流程拆成几个关键部分:购买条件校验、状态持久化、模型切换逻辑,还要加上避免重复购买的处理,这样用户体验才够完整。

1. 先整理基础数据结构

别只靠Money判断购买,最好加个HasRocket的标记——不然玩家钱够了每次进入游戏都触发切换就麻烦了。先定义几个统一的PlayerPrefs键,避免拼写错误:

// 用常量维护键名,后续修改更方便
private const string PlayerMoneyKey = "Money";
private const string HasRocketUpgradeKey = "HasRocket";

2. 完整的购买逻辑实现

你的初始代码只判断了金钱,咱们补上扣钱、标记已购买,还有模型切换的核心逻辑:

public void BuyRocketUpgrade()
{
    // 获取当前玩家的金钱和已购买状态(默认值防止首次无数据)
    int currentMoney = PlayerPrefs.GetInt(PlayerMoneyKey, 0);
    bool hasRocket = PlayerPrefs.GetInt(HasRocketUpgradeKey, 0) == 1;

    // 双重校验:钱够且未购买过
    if (currentMoney >= 500 && !hasRocket)
    {
        // 扣减金钱
        currentMoney -= 500;
        PlayerPrefs.SetInt(PlayerMoneyKey, currentMoney);
        
        // 标记已购买火箭,立即保存防止崩溃丢失数据
        PlayerPrefs.SetInt(HasRocketUpgradeKey, 1);
        PlayerPrefs.Save();
        
        // 触发模型切换
        SwitchToRocketShip();
    }
    else if (hasRocket)
    {
        Debug.Log("你已经拥有火箭部件啦!");
    }
    else
    {
        Debug.Log("金钱不够,攒够500再来吧!");
    }
}

3. 模型切换的具体实现

根据你的场景情况,有两种常用的切换方式:

方式一:激活/失活场景内的模型(适合已提前放置两个模型)

假设场景里有普通飞船normalShip和带火箭的rocketShip两个对象:

public GameObject normalShip;
public GameObject rocketShip;

private void SwitchToRocketShip()
{
    // 隐藏普通飞船,显示带火箭的飞船
    normalShip.SetActive(false);
    rocketShip.SetActive(true);
}

方式二:动态替换模型组件(适合单对象替换网格/材质)

如果你的飞船是单个GameObject,只需要替换网格或材质:

public MeshFilter shipMeshFilter;
public Mesh rocketShipMesh; // 带火箭的飞船网格资源
public Material rocketShipMaterial; // 可选:对应的材质

private void SwitchToRocketShip()
{
    shipMeshFilter.mesh = rocketShipMesh;
    // 如果需要替换材质,加上下面这行
    shipMeshFilter.GetComponent<Renderer>().material = rocketShipMaterial;
}

4. 游戏启动时恢复状态

别忘了在游戏加载时自动检查购买状态,避免玩家重启后模型又变回原样:

private void Start()
{
    bool hasRocket = PlayerPrefs.GetInt(HasRocketUpgradeKey, 0) == 1;
    if (hasRocket)
    {
        SwitchToRocketShip();
    }
    else
    {
        // 默认显示普通飞船
        normalShip.SetActive(true);
        rocketShip.SetActive(false);
    }
}

额外小建议

  • 把购买、状态管理的逻辑放到单独的PlayerUpgradeManager单例类里,别直接写在UI按钮的点击事件里,这样代码更整洁,也方便其他地方调用。
  • 如果是单机游戏,PlayerPrefs足够用;如果担心玩家修改数据,可以给PlayerPrefs的内容做简单加密,或者用Unity的PlayerPrefsX扩展工具。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:05:12