如何在碰撞后每秒做一些事情

时间:2015-12-22 04:21:00

标签: c# unity3d time collision-detection unity5

我目前正在制作一个足球比赛(美国),我正在研究一名铲球技师。现在只有两件事碰到彼此不起作用,因为角色在被迫在地面上后会继续移动。为了让角色在与其他刚体接触后停止,我认为最好的方法是使用Time.Timescale = 0;。然而,这个问题是2刚体然后只是通过另一个来解决这个问题我认为最好的方法是在1秒碰撞后将时间刻度设置为0。我怎么能这样做?

反馈总是受到赞赏;)

2 个答案:

答案 0 :(得分:1)

调用一个在团结内推迟的方法,假设它是一个单一的行为。

Invoke方法是你所追求的 http://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html

但是请注意Time.Timescale会影响一切,而不是本地的,并且很可能无法获得您所追求的效果。将gameObject的Velocity设置为零应得到所需的结果。

var rb = GetComponent<Rigidbody>();
rb.velocity = Vector3.zero;

答案 1 :(得分:1)

Time.Timescale会影响你的整个游戏。

实际上Time.Timsescale是

  • 时间过去的比例。这可用于慢动作效果。

  • 当timeScale为1.0时,时间和实时一样快。当timeScale为0.5时,时间比实时慢2倍。

  • 当timeScale设置为零时,如果您的所有功能都与帧速率无关,游戏基本上会暂停。

来自Unity Documentation

嗯,你能做的是,

在附加到Rigidbody's GameObject的脚本中,您可以实现OnCollisionEnter

Rigidbody _rb;

void Start()
{
    _rb = GetComponent<Rigidbody>();
}

void OnCollisionEnter(Collision col){
    _rb.velocity = Vector3.zero;
}

即使与地面发生碰撞,它也会阻止你的玩家。 :)

所以你可以进一步修改碰撞条件,就像身体撞击某个特定物体一样,你可以通过tag或其他一些属性来检测它。

void OnCollisionEnter(Collision col){
    if (col.gameObject.tag == "TAG_OF_SPECIFIC_OBJECT")
        _rb.velocity = Vector3.zero;
}