(C#) 在条件下实例化,否则重用
(C#) Instantiated Under Conditions, Else Reuse
我对编程非常陌生,所以请多多包涵。
public void clickWood()
{
//Check If The Player Has Gotten Wood Previously
if(_hasWood == false)
{
GameObject newItem = Instantiate(wood_prefab) as GameObject;
//Initial Displayed Name
newItem.GetComponent<ButtonSetter>().setName("WOOD: ");
//Starts with 0 Wood, set to 1
newItem.GetComponent<ButtonSetter>().item_count += 1;
newItem.transform.SetParent(GameObject.Find("Content").transform,false);
//Got their first wood, should run else from now on
_hasWood = true;
}
else
{
//SEE CONTINUED POST
}
}
所以,在 else 语句中,我想基本上说,
他们得到了第一块木头,所以我们创建了一个面板来显示有关他们拥有的木头的信息。现在我想说,既然我们已经实例化了 displayPanel,我们只想从那里开始工作并调整控制 "Wood: 0"
整数部分的对象变量
这应该是
newItem.GetComponent<ButtonSetter>().item_count
但是如果我尝试在 else 语句中访问它,如下所示:
newItem.GetComponent<ButtonSetter>().item_count += 1;
它告诉我当前上下文中不存在 newItem。
如何在特定条件下实例化某些东西,然后在满足条件后,获取实例化对象并使用其 script/variables?
Visual representation of my issue
按照目前的写法,newItem 仅存在于代码的 "IF" 子句中,因此 "ELSE" 子句看不到它。
如果您将它分配给 class 级别的字段(就像您在 class 级别分配了 _hasWood 一样)那么您将能够在 "IF" 或 "ELSE" 块,并在调用对象 "clickWood()" 的生命周期内维护计数。
private bool _hasWood;
private GameObject _woodItem;
public void clickWood()
{
//Check If The Player Has Gotten Wood Previously
if(_hasWood == false)
{
_woodItem= Instantiate(wood_prefab) as GameObject;
//Initial Displayed Name
_woodItem.GetComponent<ButtonSetter>().setName("WOOD: ");
//Starts with 0 Wood, set to 1
_woodItem.GetComponent<ButtonSetter>().item_count += 1;
_woodItem.transform.SetParent(GameObject.Find("Content").transform,false);
//Got their first wood, should run else from now on
_hasWood = true;
}
else
{
_woodItem.GetComponent<ButtonSetter>().item_count += 1;
}
}
我认为您需要稍微重构一下代码。
这就是我的做法
public class Item : MonoBehaviour {
public string itemName;
public int count;
}
我将创建一个底座 class Item
用于木头、铁或您游戏中的任何东西。
接下来,我将创建一个处理程序脚本,用于跟踪所有 clicked/not 单击的项目
Handler.cs
public class 处理程序:MonoBehaviour {
public Item itemPrefab;
public Dictionary<string, Item> displayItems= new Dictionary<string, Item>();
public void OnWoodClicked()
{
OnItemClicked("wood");
}
public void OnIronClicked()
{
OnItemClicked("iron");
}
private void OnItemClicked(string itemKey)
{
if (displayItems.ContainsKey(itemKey))
{
displayItems[itemKey].count++;
}
else
{
Item item = Instantiate(itemPrefab);
item.count = 1;
item.itemName=itemKey;
displayItems.Add(itemKey, item);
}
}
}
所以为了跟踪创建的项目,我创建了一个字典 public Dictionary<string, Item> displayItems;
在此脚本中 OnItemClicked(string itemKey)
方法将检查是否已创建此类型的项目。 (通过检查该密钥是否存在)
如果未创建该项目,那么我们将实例化新的 Item
(要显示的显示项目的预制件)并根据其键将其添加到字典中。
但是如果它已经存在,那么只要你喜欢displayItems[itemKey]
就可以访问那个对象
例如,如果您点击木材,您将获得木材显示项目 displayItems["wood"]
。
希望对您有所帮助。
如果您想让我说得更清楚,请发表评论。
我对编程非常陌生,所以请多多包涵。
public void clickWood()
{
//Check If The Player Has Gotten Wood Previously
if(_hasWood == false)
{
GameObject newItem = Instantiate(wood_prefab) as GameObject;
//Initial Displayed Name
newItem.GetComponent<ButtonSetter>().setName("WOOD: ");
//Starts with 0 Wood, set to 1
newItem.GetComponent<ButtonSetter>().item_count += 1;
newItem.transform.SetParent(GameObject.Find("Content").transform,false);
//Got their first wood, should run else from now on
_hasWood = true;
}
else
{
//SEE CONTINUED POST
}
}
所以,在 else 语句中,我想基本上说,
他们得到了第一块木头,所以我们创建了一个面板来显示有关他们拥有的木头的信息。现在我想说,既然我们已经实例化了 displayPanel,我们只想从那里开始工作并调整控制 "Wood: 0"
整数部分的对象变量这应该是
newItem.GetComponent<ButtonSetter>().item_count
但是如果我尝试在 else 语句中访问它,如下所示:
newItem.GetComponent<ButtonSetter>().item_count += 1;
它告诉我当前上下文中不存在 newItem。 如何在特定条件下实例化某些东西,然后在满足条件后,获取实例化对象并使用其 script/variables?
Visual representation of my issue
按照目前的写法,newItem 仅存在于代码的 "IF" 子句中,因此 "ELSE" 子句看不到它。
如果您将它分配给 class 级别的字段(就像您在 class 级别分配了 _hasWood 一样)那么您将能够在 "IF" 或 "ELSE" 块,并在调用对象 "clickWood()" 的生命周期内维护计数。
private bool _hasWood;
private GameObject _woodItem;
public void clickWood()
{
//Check If The Player Has Gotten Wood Previously
if(_hasWood == false)
{
_woodItem= Instantiate(wood_prefab) as GameObject;
//Initial Displayed Name
_woodItem.GetComponent<ButtonSetter>().setName("WOOD: ");
//Starts with 0 Wood, set to 1
_woodItem.GetComponent<ButtonSetter>().item_count += 1;
_woodItem.transform.SetParent(GameObject.Find("Content").transform,false);
//Got their first wood, should run else from now on
_hasWood = true;
}
else
{
_woodItem.GetComponent<ButtonSetter>().item_count += 1;
}
}
我认为您需要稍微重构一下代码。
这就是我的做法
public class Item : MonoBehaviour {
public string itemName;
public int count;
}
我将创建一个底座 class Item
用于木头、铁或您游戏中的任何东西。
接下来,我将创建一个处理程序脚本,用于跟踪所有 clicked/not 单击的项目
Handler.cs
public class 处理程序:MonoBehaviour {
public Item itemPrefab;
public Dictionary<string, Item> displayItems= new Dictionary<string, Item>();
public void OnWoodClicked()
{
OnItemClicked("wood");
}
public void OnIronClicked()
{
OnItemClicked("iron");
}
private void OnItemClicked(string itemKey)
{
if (displayItems.ContainsKey(itemKey))
{
displayItems[itemKey].count++;
}
else
{
Item item = Instantiate(itemPrefab);
item.count = 1;
item.itemName=itemKey;
displayItems.Add(itemKey, item);
}
}
}
所以为了跟踪创建的项目,我创建了一个字典 public Dictionary<string, Item> displayItems;
在此脚本中 OnItemClicked(string itemKey)
方法将检查是否已创建此类型的项目。 (通过检查该密钥是否存在)
如果未创建该项目,那么我们将实例化新的 Item
(要显示的显示项目的预制件)并根据其键将其添加到字典中。
但是如果它已经存在,那么只要你喜欢displayItems[itemKey]
就可以访问那个对象
例如,如果您点击木材,您将获得木材显示项目 displayItems["wood"]
。
希望对您有所帮助。 如果您想让我说得更清楚,请发表评论。