【发布时间】:2016-07-16 13:18:37
【问题描述】:
我的游戏中发生的逻辑和行为出现了一些问题。
我想实现一个通电,而这个通电只是在一段时间内停止该角色。所以要做到这一点,我只是禁用他的脚本,所以他什么都不做。现在这是可行的,但问题是我找不到在 5 秒后将脚本启用回给他的方法。我想停止角色 2 秒钟。
【问题讨论】:
标签: c# unity3d logic collision
我的游戏中发生的逻辑和行为出现了一些问题。
我想实现一个通电,而这个通电只是在一段时间内停止该角色。所以要做到这一点,我只是禁用他的脚本,所以他什么都不做。现在这是可行的,但问题是我找不到在 5 秒后将脚本启用回给他的方法。我想停止角色 2 秒钟。
【问题讨论】:
标签: c# unity3d logic collision
您的代码错误。你应该使用Invoke。
非常简单。
类似...
void ApplyPenalty()
{
yourPauseSystem = true;
Debug.Log("starting penalty..");
Invoke("EndPenalty", 5f);
}
void EndPenalty()
{
yourPauseSystem = false;
Debug.Log(" ...ended penalty");
}
不要忘记Debug.Log 声明。
请注意,理想情况下,ApplyPenalty(和 EndPenalty)应该是
实际上将该代码放在那些游戏对象上,而不是在“碰撞对象代码”中。明白了吗?
所以在你的情况下,要应用惩罚,它会像..
void OnCollisionEnter(Collision c)
{
if ( (c.gameObject.tag == "Character") )
c.GetComponent<YourHerosCode?().ApplyPenalty()
}
你看到了吗?
您必须使用物理层系统。您实际上必须使用它在 Unity 中进行碰撞。你必须使用“物理网格”...
表示什么可以与什么发生冲突。在您的评论中,您说它们“不会碰撞”,但您绝对可以让任何东西与任何东西发生碰撞(或不碰撞)。
请注意,在 Unity 中,实际上一切都需要自己的物理层。
当然,你的英雄、敌人等都会有自己的层次。
提示:当然,“敌人射弹”和“玩家射弹”都需要各自独立的层。
【讨论】:
如果 NullReference 在这一行 gameObject.GetComponent<PlayerControls>().enabled = true; 可能是因为您尝试引用禁用组件。
尝试将 Start() 中的 var 分配给组件
var playerController = gameObject.GetComponent<PlayerControls>();
然后使用它来引用它并启用/禁用它:
playerController.enable = true; //or false
【讨论】: