当GameObject不与任何物体碰撞时调用的函数

时间:2019-07-13 06:48:16

标签: c# unity3d

我想使GameObject不与任何物体碰撞时调用一个函数,而不是停止与另一个GameObject碰撞。我真的很感谢您的回答,因为我的问题似乎从未得到解答。基本上,我想这样做:

 void OnCollisionStay()
 {
     //blah blah blah
 }
 else
 {
     //blah blah blah
 }

编辑:我会很好,甚至更喜欢它是一个函数,它称为GameObject不会与任何物体碰撞的每一帧,有点像一个名为OnCollisionStay所没有的名为每一帧的函数。

2 个答案:

答案 0 :(得分:0)

使用布尔值

bool isCollision;

void FixedUpdate()
{
    if(!isCollision)
    {
        //blah blah blah
    }
}

void OnCollisionEnter()
{
    isCollision = true;
}

void OnCollisionExit()
{
    isCollision = false;
}

如果要在OnCollisionXXX之后运行逻辑,则根据script lifecycle flowchart,可以从WaitForFixedUpdate开始协程返回FixedUpdate

void FixedUpdate()
{
    StartCoroutine(WaitForFixedUpdateCoroutine());
}

IEnumerator WaitForFixedUpdateCoroutine()
{
    yield return WaitForFixedUpdate();

    if(!isCollision)
    {
        //blah blah blah
    }
}

答案 1 :(得分:0)

我将在Unity Answers上发布与在Stackoverflow上寻找答案的其他人相同的答案:

使用数据集来跟踪当前与您的对象碰撞的对象。

using System.Collections.Generic;
using UnityEngine;

public class CollisionDetection : MonoBehaviour
{
    private HashSet<int> collidingGameObjects = new HashSet<int>();

    private void OnCollisionEnter( Collision collision )
    {
        collidingGameObjects.Add( collision.gameObject.GetInstanceID() );
    }

    private void OnCollisionExit( Collision collision )
    {
        collidingGameObjects.Remove( collision.gameObject.GetInstanceID() );
    }

    // Clear the list in OnDisable because `OnCollisionExit` is not called
    // when object is disabled
    private void OnDisable()
    {
        collidingGameObjects.Clear();
    }

    private void Update()
    {
        if( collidingGameObjects.Count == 0 )
        {
            Debug.Log( "I am not colliding with anything" );
        }
    }
}