我想使GameObject不与任何物体碰撞时调用一个函数,而不是停止与另一个GameObject碰撞。我真的很感谢您的回答,因为我的问题似乎从未得到解答。基本上,我想这样做:
void OnCollisionStay()
{
//blah blah blah
}
else
{
//blah blah blah
}
编辑:我会很好,甚至更喜欢它是一个函数,它称为GameObject不会与任何物体碰撞的每一帧,有点像一个名为OnCollisionStay所没有的名为每一帧的函数。
答案 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" );
}
}
}