Как вы можете бросать 2d объекты после перетаскивания их мышью, без AddForce? - PullRequest
1 голос
/ 03 апреля 2019

Я делаю маленькую игру-песочницу для детей, в которой они могут порождать 2d объекты, перетаскивать их по экрану и бросать их друг против друга.

Я пытался избежать использования AddForce (), потому что алгоритмы, похоже, не соответствуют моей проблеме (если ребенок перетаскивает один объект в нескольких направлениях, траектория объекта будет довольно грязной и нереальной, когда он ее отпустит).

Вместо этого я выбрал пустой объект, когда вы щелкаете по объекту и присоединяете их с помощью HingeJoint2D. Это работает хорошо, когда дело доходит до перетаскивания объекта по экрану, но объект просто падает на землю, когда вы отпускаете его (пустой объект с HingeJoint удаляется, когда вы отпускаете его).

    // Update is called once per frame
    void Update()
    {
        // MousePosition
        Vector3 mousePos = Input.mousePosition;
        mousePos.z = 10;
        Vector3 screenPos = Camera.main.ScreenToWorldPoint(mousePos);

        if (Input.GetMouseButtonDown(0) && !objectInHand)
        {
            RaycastHit2D hit = Physics2D.Raycast(screenPos, Vector2.zero);

            if (hit && hit.collider.tag == "DraggableObject")
            {
                emptyObject = new GameObject("HingeHolder");
                emptyObject.transform.position = screenPos;
                emptyObject.AddComponent<HingeJoint2D>();

                objectInHand = hit.collider.gameObject;

                emptyObject.GetComponent<Rigidbody2D>().isKinematic = true;
                emptyObject.GetComponent<HingeJoint2D>().connectedBody = objectInHand.GetComponent<Rigidbody2D>();
                emptyObject.GetComponent<HingeJoint2D>().autoConfigureConnectedAnchor = false;
            }
        }
        else if(Input.GetMouseButton(0) && objetInHand)
        {
            emptyObject.transform.position = screenPos;
        }
        else if (Input.GetMouseButtonUp(0) && objetInHand)
        {
            emptyObject.GetComponent<Rigidbody2D>().isKinematic = false;
            emptyObject.GetComponent<HingeJoint2D>().connectedBody = null;
            Destroy(emptyObject);
            objectInHand = null;

        }
    }

Я бы хотел, чтобы мой объект сохранял свою силу при выпуске и работал как AddForce (), но я просто не могу заставить его работать должным образом таким образом. Я делаю это неправильно? Возможно ли это без использования AddForce ()?

Заранее спасибо

1 Ответ

0 голосов
/ 04 апреля 2019

Другой способ сделать то, что вы хотите, это добавить скрипт в каждое поле:

с использованием System.Collections.Generic;

открытый класс Draggable: MonoBehaviour, IDragHandler {

публичное плавание z = 1f;

public void OnDrag (данные PointerEventData) {

    Vector3 mousePosition = Input.mousePosition;
    mousePosition.z = z;
    transform.position = Camera.main.ScreenToWorldPoint(mousePosition);

}

}

это решение избавляет нас от необходимости использовать обновление (улучшая производительность), и вы можете настроить массу, гравитацию, z и другие факторы, чтобы ваша игра. также было бы хорошо, если бы у него были физические ограничения, когда его этап закончился

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