Unity3D de l'INTERFACE utilisateur, le calcul de la position en faisant glisser un élément?
Ces jours, il est incroyablement facile à faire glisser des éléments de l'INTERFACE utilisateur dans l'Unité: Apporter quelques éléments de l'UI. Ajouter un Composant -> Event -> Événement Déclencheur. Les déposer dans le script ci-dessous. Cliquez sur pour ajouter les quatre évident déclencheurs. Vous avez terminé.
Cependant.
Je suis totalement perdu dans la relation entre pointeur coordonnées et de l'INTERFACE utilisateur coordonnées (comme on le voit dans RectTransform et ainsi de suite).
Dans DragIt
ci-dessous: comment diable voulez-vous déplacer d'une INTERFACE utilisateur panneau correctement sous le doigt?
Dire que vous avez un grand panneau, avec dix UIButton assis dans le panneau avec Dragster
sur les boutons. Quelle est la relation entre la RectTransform coords et le pointeur de la souris ...
en bref, comment ne vous déplacez le bouton autour de à DragIt() ci-dessous?
/* modern Unity drag of UI element */
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class Dragster:MonoBehaviour
{
public int index; //number each of your UI items
static bool beingDragged = false;
static int dragFrom;
public void DragStart()
{
beingDragged = true; dragFrom = index;
}
public void DragIt()
{
? ? W T F ? ?
}
public void DragEnd()
{
beingDragged = false;
}
public void DroppedBra()
{
Debig.Log("Drag: from/to " +dragFrom +" --> " +index);
}
}
Donc, après la saisie de toutes ces personnes, j'ai lu encore et réalisé que vous avez attaché
Dragster
à chaque INTERFACE utilisateur qui fait qu'il est plus facile de code. Ma solution a été totalement différente de choses. Il utilise un script pour détecter n'importe quel panneau/image et bouton, puis faites-les glisser. Vous n'avez pas l'attacher à chaque INTERFACE utilisateur de chaque INTERFACE. Il doit être joint à la mère de la Toile. C'est tous les déchets. Pardonnez-moi pour perdre votre temps. Je vais lire le droit de la question la prochaine fois....Sa n'est utile que si vous souhaitez uniquement utiliser un script. Sinon c'est un gaspillage de votre temps.
Merci. Je ne sais pas ce que tu veux dire par ET VOUS avez COMPRIS COMMENT faire POUR CONVERTIR.
N'est-ce pas le ScrollRect composant de faire ce que vous voulez?
OriginalL'auteur Fattie | 2016-05-27
Vous devez vous connecter pour publier un commentaire.
Pour en la faisant glisser des trucs je viens de le faire :
J'ai créée une scène vide. PAS de caméra. Juste une toile, d'un panneau dans la toile d'un bouton dans le panneau et Un EventSystem objet. Mon code fait glisser le bouton autour de l'amende juste. Un peu bizarre des problèmes graphiques, de l'absence d'un appareil photo, mais le faisant glisser est très bien.
à droite, j'ai renoncé à le chercher et juste aller avec ce qui fonctionne.
Je veux juste confirmer à tous les lecteurs que ce fonctionne parfaitement - trois hourras.
Dire, il y a même un
IDropHandler
, qui le savait?OriginalL'auteur Uri Popov
Je voudrais rendre votre script de mettre en œuvre le glisser interfaces
public class Dragster:MonoBehaviour,IBeginDragHandler, IEndDragHandler, IDragHandler
Qui feront de votre
DragIt
fonction devenirvous donnant accès au delta de l'événement (combien, la souris est déplacé) pour être en mesure de déplacer votre objet.
Si vous continuez d'utiliser plutôt la EventTrigger composant (moins de prédilection), il vous suffit de changer votre
DragIt
fonction deDragIt(PointerEventData eventData)
et utiliser la Dynamique EvenData option dans la liste déroulante de la gâchette pour recevoir le PointerEventData pour accéder au delta de l'informationIci est en fait un total, complet, solution pour glisser et déposer UnityEngine.De l'INTERFACE utilisateur, en fonction de l'Uri & Colton code. Il suffit de copier et coller.
Étonnantes copiez et collez pas sorcier parfait glisser-déposer pour l'Unité de l'INTERFACE utilisateur, wtt Colton & Uri:
Essayé d'Uri réponse et il fonctionne. Il a fait un travail. Avez-vous encore besoin de ma réponse? J'ai résolu quelques problèmes trop lol
Votre code ne compile pas. transformer.la position += eventData.delta; n'a pas de travail. Je l'ai changé et enlevé le signe et l'INTERFACE utilisateur n'a même pas été en mouvement à la position correcte. Il a sauté vers le bas vers le bas de l'écran. Uri de la réponse fonctionné bien. Peut-être que je le faisais mal...
oui désolé je n'ai pas réaliser qu'il ne serait pas possible d'ajouter directement sans le cast, j'ai écrit ma réponse sans avoir l'éditeur est ouvert en face de moi. JoeBlow n'a corriger mes erreur du compilateur, mais qui devrait corriger le problème et il devrait fonctionner correctement.
cela ne semble pas fonctionner pour moi: il n'a besoin de la fonte ou si vous obtenez un avertissement sur Vector3/Vector2 ...
ghost.transform.position += (Vector3)eventData.delta;
OriginalL'auteur Colton White
Tout d'abord, Tous les autres anwers dans ce post, fonctionnent très bien. J'ai travaillé sur cette question depuis si longtemps et je voulais juste poster ici. Il ajoute un mode de prévenir d'autres non désirés objets de l'INTERFACE utilisateur de glisser autour.
Mon objectif officiel était de fournir un moyen de le faire sans l'aide de
bool beingDragged = false;
. Vous ne savez pas quiButton
ouImage
est glissé si vous le faites comme ça.Glisser de l'INTERFACE utilisateur:
Convertir Screenpoint Locale point dans le RectTransform avec l'aide de
RectTransformUtility
ensuite utiliserCanvas.transform.TransformPoint
pour savoir exactement où l'enfant de l'INTERFACE utilisateur.Faites glisser le code a l'air plus compliqué que les autres de glisser du code dans d'autres réponses, mais il semble fonctionner dans chaque Toile de mode de l'appareil.
La détection de l'Objet qui est sur le point d'être traîné:
La façon la plus simple de le faire est de créer une variable globale que vous pouvez utiliser pour économiser de l'objet sur lequel l'utilisateur veut se glisser dans la
OnBeginDrag
fonction, alors vous pouvez faire glisser l'objet dans laOnDrag
. Définir l'objet à null quandOnEndDrag
est appelé.Cela doit être fait une fois dans la
OnBeginDrag
fonction sauvegardé dans une variable globale.Vous ne pouvez pas effectuer les opérations suivantes dans la
OnDrag
fonctionMême si il est suppose de travailler, il n'est pas parfois. Même retourner la valeur null parfois pendant
OnDrag
. C'est pourquoi il doit être fait dans leOnBeginDrag
fonction.Détectant et en faisant Glisser le Bouton Vs Image:
Détecter si l'INTERFACE est juste un
Image
et en faisant Glisser unImage
est très facile.Si
tempImage
est pasnull
ettempButton
estnull
alors que c'est une Image.Détecter si l'INTERFACE est juste un
Button
et en faisant Glisser unButton
est PAS facile.Quand un Bouton est cliqué sur le côté/edge, le nom de la
Button
est retourné, ce qui est bien. Mais la plupart du temps, un clic sur unButton
qui se passe dans le milieu de laButton
qui ne pas retour de l'instance ou le nom de la Touche, mais au lieu de cela renvoie laText
(Enfant de l'Objet). Vous NE peut pas déplacer d'un texte comme un Bouton. Il l'habitude de travailler.si
tempText
est pas null, obtenirGetComponentInParent
de l'Image et du Bouton élément du Texte. Si leImage
n'est pas null etButton
n'est pas null, alors c'est unButton
.Ci-dessous le script complet de glisser de l'INTERFACE utilisateur Image/Panneau et Bouton. Un Bouton qui devrait être traîné devrait être mis dans la
UIButtons
tableau et d'un Panneau/Image qui devrait être traîné devrait être mis dans laUIPanels
tableau. Il ignore les autres de l'INTERFACE utilisateur qui ne sont pas dans le Tableau.cela ne semble pas fonctionner - cette valeur semble toujours être à 0 malgré non négligeable de glisser parentCanvasOfImageToMove.transformer.TransformPoint(pos)
la valeur semble toujours être à 0" Quelle valeur? Il serait bon d'expliquer ce que vous faites et comment il ne fonctionne pas
les deux
parentCanvasOfImageToMove.transform.TransformPoint(pos)
etpos
semblent toujours être 0 vec?tant pis, j'ai juste réalisé que tout dépendait de worldCamera être affecté. ajout d'un si(worldCamera==null) worldCamera=Camera.principal
OriginalL'auteur Programmer