我在逻辑和游戏中发生的行为方面遇到了一些问题。
我想要实现一个通电,这个通电只会在一段时间内停止这个角色。所以要做到这一点,我只是禁用他的脚本,所以他什么都不做。现在这是有效的,但问题是我找不到一种方法让脚本在5秒后回复给他。我想停止角色2秒钟。
答案 0 :(得分:3)
你的代码错了。您应该使用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中拥有自己的物理层。
当然,你的英雄,敌人等都有自己的层。
提示:当然“敌人的射弹”和“球员射弹”都需要各自独立的层。
答案 1 :(得分:1)
如果NullReference在此行gameObject.GetComponent<PlayerControls>().enabled = true;
,可能是因为您尝试引用禁用组件。
尝试将Start()中的var赋给组件
var playerController = gameObject.GetComponent<PlayerControls>();
然后使用它来引用它并启用/禁用它:
playerController.enable = true; //or false