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 指令或程序集引用?)
您可以使用事件使您的脚本独立“通信”。
首先你需要游戏事件。确保场景中的游戏对象上有脚本:
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 并获取库存类中的项目。
| 归档时间: |
|
| 查看次数: |
291 次 |
| 最近记录: |