"Stick" gameObject 在碰撞后变成另一个 gameObject?

"Stick" gameObject to another gameObject after collision?

目前,我正在使用以下代码使对象粘附到其他游戏对象上:

void OnCollisionEnter(Collision col)
{
    rb = GetComponent<Rigidbody>();
    rb.isKinematic = true;
    gameObject.transform.SetParent (col.gameObject.transform);
}

它运行完美,但会导致许多其他问题。比如碰撞之后,它就不能再检测到碰撞了。

是否有人拥有此代码的替代方案(这使得游戏对象在碰撞后粘附在另一个游戏对象上)?

这是给你的一个开始,请注意,这没有考虑到轮换,我相信你会明白的,对吧? ;)

protected Transform stuckTo = null;
protected Vector3 offset = Vector3.zero;

public void LateUpdate()
{
    if (stuckTo != null)
        transform.position = stuckTo.position - offset;
}

void OnCollisionEnter(Collision col)
{
    rb = GetComponent<Rigidbody>();
    rb.isKinematic = true;

    if(stuckTo == null 
        || stuckTo != col.gameObject.transform)
        offset = col.gameObject.transform.position - transform.position;

    stuckTo = col.gameObject.transform;

}

编辑:正如所承诺的,这是一个考虑到旋转的更高级版本:

Transform stuckTo;
Quaternion offset;
Quaternion look;
float distance;

public void LateUpdate()
{
    if (stuckTo != null)
    {
        Vector3 dir = offset * stuckTo.forward;
        transform.position = stuckTo.position - (dir * distance);
        transform.rotation = stuckTo.rotation * look;
    }
}

void OnCollisionEnter(Collision col)
{
    rb = GetComponent<Rigidbody>();
    rb.isKinematic = true;

    if(stuckTo == null 
        || stuckTo != col.gameObject.transform)
    {
        Vector3 diff = col.gameObject.transform.position - transform.position;
        offset = Quaternion.FromToRotation (col.gameObject.transform.forward, diff.normalized);
        look = Quaternion.FromToRotation (col.gameObject.transform.forward, transform.forward);
        distance = diff.magnitude;
        stuckTo = col.gameObject.transform;
    }
}