web-dev-qa-db-fra.com

Faites glisser un objet dans Unity 2D

J'ai cherché un script de déplacement d'objet pour Unity 2D. J'ai trouvé une bonne méthode sur Internet, mais il semble que cela fonctionne uniquement dans Unity 3D. Ce n'est pas bon pour moi car je fais un jeu 2D et ça n'entre pas en collision avec les "murs" de cette façon.

J'ai essayé de le réécrire en 2D, mais je suis tombé en panne avec des vecteurs.

Je serais très heureux si vous pouviez m'aider à le réécrire en 2D.

Voici le code qui fonctionne en 3D:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(BoxCollider))]

public class Drag : MonoBehaviour {
    private Vector3 screenPoint;
    private Vector3 offset;

void OnMouseDown() {

    offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
}

void OnMouseDrag()
{
    Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
    Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
    transform.position = curPosition;
}
}
15
Zwiebel

Tu y es presque.

Remplacez la ligne RequireComponent de votre code par:

[RequireComponent(typeof(BoxCollider2D))]

Et ajoutez un composant BoxCollider2D à l'objet auquel vous ajoutez votre script. Je viens de le tester et cela fonctionne bien.

8
user2599140

Pour ceux qui ont du mal à utiliser ce code, j'ai supprimé screenPoint et l'ai remplacé par 10.0f(qui est la distance de l'objet de la caméra). Vous pouvez utiliser le flotteur dont vous avez besoin. Maintenant ça marche. De plus, l'objet a besoin d'un BoxCollider ou CircleCollider pour pouvoir être déplacé. Il est donc inutile d'utiliser [RequireComponent(typeof(BoxCollider2D))].

Le code final qui a bien fonctionné pour moi est:

using UnityEngine;
using System.Collections;


public class DragDrop : MonoBehaviour {

    private Vector3 offset;

    void OnMouseDown()
    {

        offset = gameObject.transform.position -
            Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f));
    }

    void OnMouseDrag()
    {
        Vector3 newPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f);
        transform.position = Camera.main.ScreenToWorldPoint(newPosition) + offset;
    }
}
7
Alex Jolig