Плавное перемещение 3D-объекта на поверхность другого 3D-объекта onCollisionEnter - PullRequest
0 голосов
/ 28 февраля 2019

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");
}

Этот скрипт работает как есть, и я могу обнаружить столкновение, когда оно произошло.Однако у меня есть несколько сложностей, чтобы переместить объект, чтобы «прикрепить» себя к столкнувшемуся трехмерному объекту.


Вот изображение сценария.enter image description here


enter image description here


enter image description here

1 Ответ

0 голосов
/ 28 февраля 2019

Этого можно добиться, изменив родителя зеленой сферы на целевой объект при столкновении.Тогда зеленая сфера будет прикреплена к цели, и она может двигаться вместе со своим родителем (он же целевой объект).Вот сценарий для этого:

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;
    }
}

Поскольку операционная система не хочет изменять родительский объект, другой подход может вычислять расстояние между сферами, и как только расстояние равно 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 и будет работать, только если объекты являются сферами!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...