Привязка игрового объекта к другому игровому объекту в Unity 3D во время выполнения - PullRequest
1 голос
/ 17 октября 2019

В этот момент я перетаскиваю свой игровой объект по экрану;однако мне трудно понять, как привязать мой игровой объект к уже существующему игровому объекту на моей сцене. Как привязать игровой объект к другому объекту во время выполнения после его создания?

public class DragObject : MonoBehaviour

{ 
    private Vector3 mOffset;
    private float mZCoord;

    void OnMouseDown()

    {
        mZCoord = Camera.main.WorldToScreenPoint(
        gameObject.transform.position).z;
        mOffset = gameObject.transform.position - GetMouseAsWorldPoint();
    }

    private Vector3 GetMouseAsWorldPoint()

    {
        Vector3 mousePoint = Input.mousePosition;
        mousePoint.z = mZCoord;
        return Camera.main.ScreenToWorldPoint(mousePoint);
    }

    void OnMouseDrag()

    {
        transform.position = GetMouseAsWorldPoint() + mOffset;
    }

}

LoadAssets class:

public class LoadAssets : MonoBehaviour
{

    bool isCreated = false;
    bool isCreatedDrillbit = false;

    public void LoadBOP()

    {
        if (!isCreated)

        {
            GameObject instance = Instantiate(Resources.Load("BOP", typeof(GameObject))) as GameObject;
            isCreated = true;
        }

    }

    public void LoadDrillBit()

    {
        if (!isCreatedDrillbit)

        {
            GameObject instance = Instantiate(Resources.Load("Drillbit", typeof(GameObject))) as GameObject;
            isCreatedDrillbit = true;
        }

    }

}

1 Ответ

2 голосов
/ 17 октября 2019

Напишите скрипт, который проверяет положение какого-либо другого объекта, и, если он достаточно близко, сделайте его дочерним и установите его локальное положение и поворот по умолчанию. Кроме того, отключите сценарий перетаскивания:

public class SnapToMe : MonoBehaviour
{

    public GameObject target = null;
    public float snapDistance = 1f; 

    void FixedUpdate() 
    {
        if (target==null) return;

        if ( Vector3.Distance(transform.position, target.transform.position) <= snapDistance) )  
        {
            target.transform.parent = transform;
            target.transform.localRotation = Quaternion.identity;
            target.transform.localPosition = Vector3.zero;

            target.GetComponent<DragObject>().enabled = false;
        }
    }
}

На объекте, который вы хотите выполнить привязку, добавьте дочерний объект, где должен выполняться привязка, и присоедините к нему сценарий привязки:

Bottle
└── Bottle snap point
    └── SnapToMe

Затем, когда вы создадите колпачок, сообщите об этом моменту привязки:

Gameobject newCap = Instantiate(...);
Gameobject bottleSnapPoint = GameObject.Find(
        "Bottle snap point"); // or some other way to get a reference to the snap point

SnapToMe snapper = bottleSnapPoint.GetComponent<SnapToMe>();
snapper.target = newCap;
snapper.snapDistance = 2f; //whatever is appropriate
...