创建库存以接收从商店系统购买的商品

kyl*_*eno -14 c# unity-game-engine

我想将从我的游戏商店购买的物品(例如装饰品)制作成在购买后进入库存

店铺系统

我创建了一个带有购买按钮和东西的商店系统,但我不知道如何使库存接收物品。这些是我为商店和库存编写的脚本:

店铺系统

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

public class ShopManager : MonoBehaviour
{

    public int[,] shopItems = new int[9, 9];
    public float coins;
    public Text CoinsTXT;


    void Start()
    {
        CoinsTXT.text = "" + coins.ToString();

        //ID's
        shopItems[1, 1] = 1;
        shopItems[1, 2] = 2;
        shopItems[1, 3] = 3;
        shopItems[1, 4] = 4;
        shopItems[1, 5] = 5;
        shopItems[1, 6] = 6;
        shopItems[1, 7] = 7;
        shopItems[1, 8] = 8;

        //Price
        shopItems[2, 1] = 10;
        shopItems[2, 2] = 20;
        shopItems[2, 3] = 30;
        shopItems[2, 4] = 40;
        shopItems[2, 5] = 50;
        shopItems[2, 6] = 65;
        shopItems[2, 7] = 110;
        shopItems[2, 8] = 150;

    }


    public void Buy()
    {
        GameObject ButtonRef = GameObject.FindGameObjectWithTag("Event").GetComponent<EventSystem>().currentSelectedGameObject;

        if (coins >= shopItems[2, ButtonRef.GetComponent<ButtonInfo>().ItemID])
        {
            coins -= shopItems[2, ButtonRef.GetComponent<ButtonInfo>().ItemID];
            CoinsTXT.text = "Coins:" + coins.ToString();
        }


    }
}
Run Code Online (Sandbox Code Playgroud)

库存系统

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

public class Inventory {

    private List<Item> itemList;

    public Inventory()
    {
        itemList = new List<Item>();

        Debug.Log("Inventory");
    }

    public void AddItem(Item item)
    {
        itemList.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该添加什么才能让它收到购买的物品?

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

public class GameEvents : MonoBehaviour
{
    public static GameEvents gameEvents;

    private void Awake()
    {
        gameEvents = this;
    }

    public event Action<int> onItemPurchase;

    public void ItemPurchaseMade(Item int)
    {
        if (onItemPurchase != null)
        {
            onItemPurchase(int);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

Assets\GameEvents.cs(17,39):错误 CS1001:需要标识符

Assets\GameEvents.cs(17,39): 错误 CS1003: 语法错误,预期为 ','

Assets\GameEvents.cs(17,42):错误 CS1001:需要标识符

Assets\GameEvents.cs(21,28):错误 CS1525:无效的表达式术语“int”

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

public class GameEvents : MonoBehaviour
{
    public static GameEvents gameEvents;

    private void Awake()
    {
        gameEvents = this;
    }

    public event Action<int> onItemPurchase;

    public void ItemPurchaseMade(int itemId)
    {
        if (onItemPurchase != null)
        {
            onItemPurchase(itemId);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是我编辑 itemId 后遇到的错误:

Assets\Scripts\GameEvents.cs(6,14):错误 CS0101:命名空间“”已包含“GameEvents”的定义

Assets\Scripts\GameEvents.cs(15,25):错误 CS0246:找不到类型或命名空间名称“Item”(您是否缺少 using 指令或程序集引用?)

Assets\Scripts\GameEvents.cs(17,34):错误 CS0246:找不到类型或命名空间名称“Item”(您是否缺少 using 指令或程序集引用?)

Assets\Scripts\Inventory.cs(20,25):错误 CS0246:找不到类型或命名空间名称“Item”(您是否缺少 using 指令或程序集引用?)

Assets\Scripts\GameEvents.cs(10,18): 错误 CS0111: 类型“GameEvents”已经定义了一个名为“Awake”的具有相同参数类型的成员

Assets\Scripts\Inventory.cs(8,18):错误 CS0246:找不到类型或命名空间名称“Item”(您是否缺少 using 指令或程序集引用?)

flz*_*zzz 7

您可以使用事件使您的脚本独立“通信”。

首先你需要游戏事件。确保场景中的游戏对象上有脚本

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

public class GameEvents : MonoBehaviour
{
    public static GameEvents gameEvents;

    private void Awake()
    {
        gameEvents = this;
    }

    public event Action<Item> onItemPurchase;

    public void ItemPurchaseMade(Item item)
    {
        if(onItemPurchase != null)
        {
            onItemPurchase(item);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将触发器包含在您的购买方法中:

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

public class ShopManager : MonoBehaviour
{

    public int[,] shopItems = new int[9, 9];
    public float coins;
    public Text CoinsTXT;


    void Start()
    {
        CoinsTXT.text = "" + coins.ToString();

        //ID's
        shopItems[1, 1] = 1;
        shopItems[1, 2] = 2;
        shopItems[1, 3] = 3;
        shopItems[1, 4] = 4;
        shopItems[1, 5] = 5;
        shopItems[1, 6] = 6;
        shopItems[1, 7] = 7;
        shopItems[1, 8] = 8;

        //Price
        shopItems[2, 1] = 10;
        shopItems[2, 2] = 20;
        shopItems[2, 3] = 30;
        shopItems[2, 4] = 40;
        shopItems[2, 5] = 50;
        shopItems[2, 6] = 65;
        shopItems[2, 7] = 110;
        shopItems[2, 8] = 150;

    }


    public void Buy()
    {
        GameObject ButtonRef = GameObject.FindGameObjectWithTag("Event").GetComponent<EventSystem>().currentSelectedGameObject;

        if (coins >= shopItems[2, ButtonRef.GetComponent<ButtonInfo>().ItemID])
        {
            coins -= shopItems[2, ButtonRef.GetComponent<ButtonInfo>().ItemID];
            CoinsTXT.text = "Coins:" + coins.ToString();

            Item yourItem = Item() //get your Item from ID

            GameEvents.gameEvents.ItemPurchaseMade(yourItem);
        }


    }
}
Run Code Online (Sandbox Code Playgroud)

然后监听库存类中的事件:

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

public class Inventory {

    private List<Item> itemList;

    public Inventory()
    {

        GameEvents.gameEvents.onItemPurchase += AddItem;

        itemList = new List<Item>();

        Debug.Log("Inventory");
    }

    public void AddItem(Item item)
    {
        itemList.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

目前尚不清楚您从哪里通过其 ID 获取该项目。这就是为什么我省略了那部分。作为替代方案,您可以通过事件传递 itemId 并获取库存类中的项目。

  • 根据您的编码风格,我建议您首先学习基础知识,而不是针对您遇到的每个问题发布问题。它将使您对编码有更深入的了解。并且会为您在 StackOverflow 上节省大量时间。在 youtube 上有很多很棒的教程,尤其是关于 Unity 的教程 (2认同)