首页 > 解决方案 > Unity Game Object Visibility - 无法多次显示游戏对象

问题描述

我有一个带有 Image 和 TextMeshPro (TMP) 的 Canvas 作为子级,并且对话框的画布组件在 Start() 方法中设置为 false,以便将其隐藏在主 Canvas 中。TMP 出现在图像上(如对话框中的文本)。我在 2D 环境中有一个玩家和一个硬币精灵。当玩家拿起硬币时,我尝试显示如下所示的对话框和 TMP。

public class PlayerMovement : MonoBehaviour {

    public GameObject suggestion;
    public GameObject dialogBox;

    private bool wasSuggestionShown; //to check if dialog was shown

    private void Start()
    {
        wasSuggestionShown = false;
        suggestionTimer = 0;
        dialogBox.GetComponent<Canvas>().enabled = false; //To hide the dialog box
    }

    void Update () {

        //horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed; // for pc keys
        horizontalMove = CrossPlatformInputManager.GetAxis("Horizontal") * runSpeed; //for smartphone input

        if (wasSuggestionShown)
        {
            suggestionTimer += Time.deltaTime;
            if (suggestionTimer > 5)
            {
                wasSuggestionShown = false;
                dialogBox.GetComponent<Canvas>().enabled = false; //TO hide dialog box after displaying it
            }
        }
    }

    void FixedUpdate ()
    {
        // Move the character
        controller.Move(horizontalMove * Time.fixedDeltaTime, crouch, jump);
        jump = false;
    }


    //For destroying coin object on collision with player
    private void OnTriggerEnter2D(Collider2D col)
    {
        
        if (col.gameObject.CompareTag("coin"))
        {

            //For destroying coin and to recude player movement speed.

            Destroy(col.gameObject); //Coin Disappears

            isRunSpeedReduced = true;
            runSpeed = 10f;

            //For Showing dialog box

            dialogBox.GetComponent<Canvas>().enabled = true;
            wasSuggestionShown = true;
        }
    }
}

在该OnTriggerEnter2D()方法中,我检查玩家角色是否接触到硬币,如果是,我销毁对象并显示对话框和 TMP 并在 5 秒后隐藏它们。问题是

“当我包含另一个硬币时,相同的对话框和 TMP,当玩家选择第二个硬币时不显示。两个硬币都有相同的标签‘硬币’”

有人可能会争辩说,如果脚本在同一个被破坏或处于非活动状态的对象中,那么这是不可能的。但是我在附加到播放器对象的播放器移动脚本中执行所有这些操作。

此外,我切换对话框的方式也没有什么不同。无论是它dialogBox.GetComponent<Canvas>().enabled = true;还是其中dialogBox.SetActive(true) 任何一个都只显示一次,这是第一次出现。

即使我想实例化它,我也不知道在画布中正确定位它的确切变换。(我想要它在底部中间部分,就像它如何锚定一样)

场景层次:

在此处输入图像描述

标签: c#unity3dgameobject

解决方案


问题出在您的 Update(),您在勾选后关闭画布 suggestionTimer

void Update () {

    //horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed; // for pc keys
    horizontalMove = CrossPlatformInputManager.GetAxis("Horizontal") * runSpeed; //for smartphone input

    if (wasSuggestionShown)
    {
        suggestionTimer += Time.deltaTime;
        if (suggestionTimer > 5)
        {
            wasSuggestionShown = false;
            dialogBox.GetComponent<Canvas>().enabled = false; //TO hide dialog box after displaying it
        }
    }
}

原因是suggestionTimer当你击中一个新硬币时你永远不会重置。做这个:

private void OnTriggerEnter2D(Collider2D col)
{
    
    if (col.gameObject.CompareTag("coin"))
    {

        //For destroying coin and to recude player movement speed.

        Destroy(col.gameObject); //Coin Disappears

        isRunSpeedReduced = true;
        runSpeed = 10f;

        //For Showing dialog box

        dialogBox.GetComponent<Canvas>().enabled = true;
        wasSuggestionShown = true;

        //  !!! ADD THIS
        suggestionTimer = 0;
    }
}

推荐阅读