【问题标题】:Instantiating a new clone of a prefab whilst setting the previous clone as inactive实例化预制件的新克隆,同时将前一个克隆设置为非活动
【发布时间】:2017-02-25 00:14:41
【问题描述】:

我正在开发一款让玩家轮流拼写单词的游戏。我有一个输入字段预制件,只要玩家按下按钮就会添加。 这是我到目前为止所做的: 当用户点击完成按钮时,这些代码行实例化了一个新的输入字段

//show next input field to enter letter
private void ShowInputField(){
    GameObject inputFieldGameObject = inputFieldObjectPool.GetObject();
    inputFieldGameObject.transform.SetParent (inputFieldParent);
    Canvas.ForceUpdateCanvases ();
    GameObject.Find ("ScrollView").GetComponent<ScrollRect> ().horizontalNormalizedPosition = 1;
}

这里是调用 ShowInputField 函数和 NextPlayerTurn 函数的完成按钮的代码:

public void DoneButton(){
    NextPlayerTurn ();
    ShowInputField ();
}

现在我要添加的是,当按下完成按钮时,预制件的先前实例化克隆应设置为非活动状态,新添加的实例化预制件是唯一活动的预制件,这样玩家就无法编辑先前输入的字母。

任何帮助将不胜感激。提前谢谢你。

【问题讨论】:

  • prevObject.SetActive(false);?或者更确切地说,Destroy(prevObject);?
  • @Fredrik 你能详细说明你的评论吗
  • @Abdul 谢谢我遇到了同样的问题,您的问题帮助我找到了解决方案

标签: c# unity3d


【解决方案1】:

您必须创建一个临时游戏对象来保存最后一个InputField。按下按钮后检查是否为null

如果为空,则没有最后一个输入。如果不为空,则有最后一个输入,用lastInput.GetComponent&lt;InputField&gt;();获取附加的InputField,然后使用InputField.interactableInputField.readOnly禁用最后一个InputField,使玩家无法修改。

您拥有的其他变量选项是InputField.enabled 变量。您必须测试并决定哪些变量最适合您。

GameObject lastInput = null;

void DeActivateLastInput()
{
    if (lastInput != null)
    {
        InputField inputField = lastInput.GetComponent<InputField>();
        inputField.interactable = false;
        inputField.readOnly = true;
    }
}

//show next input field to enter letter
private void ShowInputField()
{
    GameObject inputFieldGameObject = inputFieldObjectPool.GetObject();
    //Reset this pool since it may have been disabled before from the DeActivateLastInput function
    InputField inputField = inputFieldGameObject.GetComponent<InputField>();
    inputField.interactable = true;
    inputField.readOnly = false;

    //Make this Input Last Input
    lastInput = inputFieldGameObject;

    inputFieldGameObject.transform.SetParent(inputFieldParent);
    Canvas.ForceUpdateCanvases();
    GameObject.Find("ScrollView").GetComponent<ScrollRect>().horizontalNormalizedPosition = 1;
}

public void DoneButton()
{
    NextPlayerTurn();
    DeActivateLastInput();
    ShowInputField();
}

【讨论】:

  • 请我不要停用最后一个输入字段,而是停用之前已添加的输入字段
  • 我的回答中的示例代码是停用任何东西。它禁用InputField 上的输入。您希望最后一个输入可见但不能修改?然后在做进一步的 cmets 之前尝试这个。
  • 我尝试了你的示例代码,我得到了错误NullReferenceException: Object reference not set to an instance of an object GameController.ShowInputField () (at Assets/Scripts/GameController.cs:73) GameController.Start () (at Assets/Scripts/GameController.cs:55) 我也希望最后一个输入字段是可修改的,但不是以前的
  • 我通过公开 GameObject lastInput 解决了错误,并在编辑器中将 InputField 预制件分配给它,但代码似乎没有做任何事情。
  • 非常感谢。这完美地工作......但我想通过问这个问题来麻烦你。如何获取预制件的每个实例的文本并将其分配给一个字符串。假设我有一个字符串string word,输入的每个字母都分配给它。
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2015-02-07
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多