在CollisionEnter上平稳地将3D对象移动到另一个3D对象的表面

时间:2019-02-28 12:54:10

标签: c# unity3d

Hi2 ..

我有一种情况:我需要移动3D对象,以便在发生碰撞时将自己(例如使用lerp)平稳地移动到另一个3D对象的表面。

这是我用来检测碰撞的脚本。

public GameObject targetingObject;
private void OnCollisionEnter(Collision collision)
{

    Debug.Log("name: " + collision.gameObject.name);
    Debug.Log("tag: " + collision.gameObject.tag);

}

private void OnCollisionExit(Collision collision)
{
    targetingObject.transform.localPosition = new Vector3(0, 0, 0);
}

private void OnCollisionStay(Collision collision)
{
    Debug.Log("collision is staying");
}

此脚本按原样工作,发生碰撞时,我能够检测到碰撞。 但是,我有点难以移动对象以将自己“附加”到碰撞的3D对象上。


这是方案的图片。 enter image description here


enter image description here


enter image description here

1 个答案:

答案 0 :(得分:1)

您可以通过在发生碰撞时将绿色球体的父对象更改为目标对象来实现。然后,绿色球体将附着到目标,并且可以与其父对象(也称为目标对象)一起移动。这是它的脚本:

public GameObject Target;
public GameObject GreenSphere;

void Start () {

}

void Update () {

}
void OnCollisionEnter(Collision collision)
{       
    //Since you used Target as a public variable
    if(collision.gameObject == Target)
    {
        GreenSphere.transform.parent = Target.transform;
    }
}

由于op不想更改对象的父对象,因此另一种方法是计算球体之间的距离,并且一旦距离等于target radius/ 2 + GreenSphere radius/2,这意味着对象彼此接触,则可以将它们视为已附加!。这是它的脚本:

public GameObject target;
float targetSize;
float GreenObjSize;
void Start () {
    targetSize = target.transform.localScale.y / 2;
    GreenObjSize = gameObject.transform.localScale.y / 2;
    Debug.Log(targetSize);
}

void Update () {
    if((target.transform.position - gameObject.transform.position).magnitude > (targetSize + GreenObjSize))
    {
        gameObject.transform.position += Vector3.down * Time.deltaTime;
    }
}

此脚本必须附加到GreenSphere上,并且仅在对象是球形的情况下才有效!