c# - 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)
任何一个都只显示一次,这是第一次出现。
即使我想实例化它,我也不知道在画布中正确定位它的确切变换。(我想要它在底部中间部分,就像它如何锚定一样)
场景层次:
解决方案
问题出在您的 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;
}
}
推荐阅读
- haskell - Haskell堆栈,如何在全局范围内恢复在多个包中找到的模棱两可的模块名称
- python - 两个字典中的元素到列表中
- sql - Microsoft T-SQL - 有没有办法删除有重复的记录?
- ruby - 如果有多个结果,是否可以有一条线?
- c# - 使用来自密钥保管库的证书创建 Azure Web 应用 SSL 绑定
- c++ - std::unordered_map 如何释放使用 malloc 创建的结构。是否需要对地图进行 2 次查询?
- r - 如何在ggplot中将误差线放入图形中?
- xamarin.android - FragmentManager 在返回视图时已经在执行事务
- c# - 如何使用 DataContext 中的 IValueConverter 对象?
- php - 两个值只显示一个