【问题标题】:Unity - OnMouseDown double clickunity - OnMouseDown 双击
【发布时间】:2018-09-08 08:34:18
【问题描述】:

我正在制作的游戏中有四个游戏对象,当我点击每个游戏对象时,会打开一个对话框。

我的问题是我正在使用 OnMouseDown 并且第一个总是需要单击两次。它只发生在 OnMouseDown 上,我在游戏上的按钮可以正常工作。

public static GameObject selectedClient;
public bool isBuying;

private Manager manager;

private void Start()
{
    manager = GameObject.FindObjectOfType(typeof(Manager)) as Manager;
}

private void OnMouseDown()
{
    if (isBuying == true)
    {
        selectedClient = this.gameObject;
        manager.Talk();
    }
    else if (isBuying == false)
    {
        manager.NotTalk();
    }
}

Talk() 和 NotTalk() 如下:

    public void Talk()
{
    dialogueBox.SetActive(true);
    Time.timeScale = 0f;
    actualClient = Client.selectedClient;
}

public void NotTalk()
{
    dialogueBox.SetActive(false);
    Time.timeScale = 1f;
}

有人知道为什么会这样吗?

提前致谢。

【问题讨论】:

  • 不知道如何在没有代码的情况下提供帮助
  • 抱歉,添加了代码。第一次双击后它可以正常工作,但是如果我单击一个对象然后单击另一个对象会出错,​​这就是我要修复此问题的原因。
  • 我们没有在标题中加上“已解决”。接受答案就足够了。

标签: c# unity3d


【解决方案1】:

假设manager.Talk() 打开对话框,也许isBuying 最初是假的,并且在您单击一次时被切换?

编辑:用户使用TalkNotTalk 方法更新问题。

既然你说最初,只有时间停止,但 dialogBox 没有显示,无论如何,这是因为它没有被填充,或者没有正确初始化?你能展示你期望展示的代码吗?

可能只是 dialogBox 没有可显示的内容,因此不会,但是,通过第二次单击,它以某种方式正确填充并可以显示。

【讨论】:

  • 很抱歉没有具体说明。 manager.Talk( ) 打开对话框并停止游戏。 isBuying 最初为 false 并由动画切换(当 NPC 停止行走时,isBuying 变为 true)。如果我只是单击一次时间停止但对话框没有,好像只有一半的 Talk( ) 起作用了。
  • 我建议您在OnMouseDown() 的开头输入Debug.Assert(isBuying)。这将允许您查看布尔值是否设置正确。如果你说的正确,当你的 NPC 停止移动时,布尔值应该永远保持真实。这可能会让我们知道它是否会因未知因素而不断变化,这可能会导致Manager 出现问题。
  • isBuying bool 根据动画变化,NPC 行走时为假,停止时为真。我尝试了 Debug.Assert(isBuying) 但两次点击都没有返回任何内容,即使第二次有效,我做错了什么?这是我第一次使用它。
【解决方案2】:

如果我理解正确,似乎 OnMouseDown()Talk() 在第一次鼠标单击时被成功调用,但需要第二次鼠标单击才能显示 dialogueBox

如果dialogueBox.SetActive(true) 被成功调用,您可以查看 Unity Scene Hierarchy 窗口,看看它在第一次鼠标单击后是否像您预期的那样变为活动状态。如果确实如此,那么您可以检查该对象以查看它为什么没有出现在屏幕上。 (正如另一位发帖者所说,可能与dialogueBox 初始化有关。)

此外,这些问题可能有助于我们调试和找出问题:

  • 当您“点击一个对象然后再点击另一个”时会出现什么错误?
  • 如果您以不同的顺序单击按钮会发生什么?如果有 4 个按钮,是始终受影响的第一个按钮,还是您单击的第一个按钮?

一般来说,正如其他发帖人所建议的那样,使用Debug.LogDebug.Assert 应该可以帮助您缩小问题范围。同样,您可以在代码中设置断点并单步执行以查看代码是否按预期运行。正如我在这篇文章中提到的,Unity Scene Hierarchy 窗口对于调试也很有用。

【讨论】:

  • 您对对话框的看法是正确的;当我第一次在 NPC 上单击时,时间会停止,但对话不会在层次结构窗口中变为活动状态。关于问题:这不是真正的 Unity 错误,只是一个小错误;当我单击第一个 NPC 然后单击第二个时,第二个被选中。这并不是真正破坏游戏的东西,但看到它不应该那样工作,这很烦人。
  • MonoBehaviour::OnEnable调试怎么样?每当调用 SetActive(true) 时都应该调用它。同样,还有 OnDisable()。 (有关详细信息,请参阅 Unity's Manual on Execution Order。这将帮助我们确定 OnEnable() 是否按预期触发。也许有什么东西正在从其他地方调用 gameObject.SetActive(false)
  • 至于你提到的那个小bug,我不知道我是否理解这个bug。如果您单击第二个 NPC,是否应该在该 NPC 上假设 isBuying 为真时选择它? (除非您的帖子中未显示使用 selectedClient 的某种检查。)如果这不是预期的行为,则可能值得调试,因为它可能与此问题有关。
  • 感谢您的回答,我找到了问题所在。在 DialogueBox 脚本中,Start 方法上有一个 SetActive(false),以防 DialogueBox 启动游戏时激活。我是程序员/游戏开发领域的初学者,从不知道必须激活 GameObject 才能启动脚本。我真的很感谢你。
【解决方案3】:

添加一个 Debug.log(isBuying);以上(isBuying == true)。

然后您会知道是否首先调用了 OnMouseDown() 以及它是否按照您的预期进行。在那之后,你应该可以自己修复它,否则,请告诉我你发现了什么。

【讨论】:

  • 对不起,你不是说Debug.Assert(isBuying)吗?此外,用户声明调用了OnMouseDown,但需要双击一个特定的按钮,而不是预期的单键。
  • 在 OnMouseDown( ) 和 Update( ) 上试过,一切正常。 OnMouseDown() 确实需要两次单击鼠标才能工作,即使第一次单击被识别。我将在问题上添加 Talk( ) 和 NotTalk( ),也许会有所帮助。
  • 您可以尝试注释掉 timeScale 调整,并在您不暂停游戏时检查它是否正常工作?
猜你喜欢
  • 2021-04-07
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多