दिलचस्प पोस्ट
Window.location.href, window.location.replace और window.location.assign में अंतर IGrouping से मूल्य कैसे प्राप्त करें I प्रदर्शन बटन पर क्लिक करें इवेंट जब उपयोगकर्ता प्रेस पाठ बॉक्स में कुंजी दर्ज करें मैटप्ललिब: समूह बॉक्सप्लेट क्या मैं एक ही दृश्य पर setframe और autolayout का उपयोग कर सकता हूं? सत्र ऑब्जेक्ट नष्ट होने से पहले एक विधि को कैसे कॉल करें? NHibernate: ओवरराइड करना बराबर और GetHashCode के कारण मैं स्ट्रिंग से फ़ाइल नाम कैसे प्राप्त कर सकता हूं जिसमें संपूर्ण फ़ाइल पथ है? नक्शे के सी + + नक्शे के माध्यम से कैसे लूप करें? दृश्य स्टूडियो 2010 और 2008 विभिन्न फ़ोल्डरों में समान नामों के साथ स्रोत फाइलों को संभाल नहीं सकते हैं? SQL सर्वर पाठ प्रकार बनाम varchar डेटा प्रकार अगर मैं अपने iPhone ऐप में पेपैल गेटवे का उपयोग करता हूँ, क्या एप्पल इसे स्वीकृत करेगा? .Net Framework 4.0 इंस्टालर में .Net Framework 3.5 शामिल है? .gitconfig उपयोगकर्ता फ़ाइल में git config –system ओवरराइड (git config –global) जावा में विशिष्ट प्रिंटर (आईपीपी यूआरआई) को प्रिंट करें

एकता 3 डी यूआई, एक आइटम खींचने की स्थिति के लिए गणना?

इन दिनों यूटीआई तत्वों को एकता में खींचने में अविश्वसनीय रूप से आसान है: कुछ यूआई आइटम बनाएं घटक जोड़ें -> इवेंट -> इवेंट ट्रिगर नीचे स्क्रिप्ट पर ड्रॉप करें चार स्पष्ट ट्रिगर जोड़ने के लिए क्लिक करें हो गया।

तथापि।

मैं सूचक निर्देशांक और UI निर्देशांक के बीच संबंधों में पूरी तरह से खो रहा हूं (जैसा कि रीक्टाट्रांसफॉर्म में देखा गया है और इसी तरह)

नीचे DragIt : नरक आप उंगली के नीचे यूआई पैनल को ठीक से कैसे स्थानांतरित करते हैं?

कहो कि आपके पास एक बड़ा पैनल है, जिसमें दस यूआईबुटन बटन पर Dragster साथ पैनल में बैठे हैं। RectTransform coords और माउस सूचक के बीच संबंध क्या है …

संक्षेप में आप नीचे ड्रैगइटी () के आसपास के एक बटन को कैसे ले जाते हैं?

 /* 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() { ? ? WTF ? ? } public void DragEnd() { beingDragged = false; } public void DroppedBra() { Debig.Log("Drag: from/to " +dragFrom +" --> " +index); } } 

Solutions Collecting From Web of "एकता 3 डी यूआई, एक आइटम खींचने की स्थिति के लिए गणना?"

ड्रैगिंग सामान के लिए मैं यह बस करता हूं:

 using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { public void OnBeginDrag(PointerEventData eventData) { } public void OnDrag(PointerEventData eventData) { //Debug.Log ("OnDrag"); this.transform.position = eventData.position; } public void OnEndDrag(PointerEventData eventData) { Debug.Log ("OnEndDrag"); } } 

मैं आपकी स्क्रिप्ट को ड्रैग इंटरफेस को लागू करना होगा

public class Dragster:MonoBehaviour,IBeginDragHandler, IEndDragHandler, IDragHandler

जो आपके DragIt फ़ंक्शन को बना देगा

 public void OnDrag(PointerEventData eventData) { transform.position += (Vector3)eventData.delta; } 

आपको अपने ऑब्जेक्ट को स्थानांतरित करने में सक्षम होने के लिए उस घटना के डेल्टा (कितने माउस को स्थानांतरित कर दिया गया है) तक पहुंच प्रदान कर रहा है।

यदि आप अभी भी EventTrigger घटक (कम पसंद की तरह) का उपयोग करना चाहते हैं, तो आपको सिर्फ DragIt(PointerEventData eventData) अपने DragIt फ़ंक्शन को बदलने और DragIt लिए ड्रॉप-डाउन में डायनेमिक एवेनटाटा विकल्प का उपयोग करने के लिए डेवेट्रा एक्सेस करने के लिए PointerEventData प्राप्त करने की आवश्यकता है जानकारी


यहां वास्तव में कुल, पूर्ण, खींचें और उरी एंड कोल्टन के कोड पर आधारित 'यूनिटीइंजिन। यूआई' आइटम ड्रॉप करने के लिए समाधान है। बस कॉपी और पेस्ट करें

यूटीआई यूआई के लिए कॉपी और पेस्ट नॉट-बेंजर परिपूर्ण ड्रैग एंड ड्रॉप अचरज, डब्ल्यूटी। कोलटन और उरी:

 using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class UNCDraggable:MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IDropHandler { public Image ghost; // note DON'T try to drag the actual item: it's not worth the hassle. // a problem arises where you can't have it on top (as you would want // visually), and still easily get the drops. always use a ghost. // even if you want the "original invisible" while dragging, // simply hide it and use a ghost. everything is tremendously // easier if you do not move the originals. void Awake() { ghost.raycastTarget = false; // (just in case you forgot to do that in the Editor) ghost.enabled = false; } public void OnBeginDrag(PointerEventData eventData) { ghost.transform.position = transform.position; ghost.enabled = true; } public void OnDrag(PointerEventData eventData) { ghost.transform.position += (Vector3)eventData.delta; } public void OnEndDrag(PointerEventData eventData) { ghost.enabled = false; } public void OnDrop(PointerEventData data) { GameObject fromItem = data.pointerDrag; if (data.pointerDrag == null) return; // (will never happen) UNCDraggable d = fromItem.GetComponent<UNCDraggable>(); if (d == null) { // means something unrelated to our system was dragged from. // for example, just an unrelated scrolling area, etc. // simply completely ignore these. return; // note, if very unusually you have more than one "system" // of UNCDraggable items on the same screen, be careful to // distinguish them! Example solution, check parents are same. } Debug.Log ("dropped " + fromItem.name +" onto " +gameObject.name); // your code would look probably like this: YourThings fromThing = fromItem.GetComponent<YourButtons>().info; YourThings untoThing = gameObject.GetComponent<YourButtons>().info; yourBossyObject.dragHappenedFromTo(fromThing, untoThing); } } 

सबसे पहले, इस पोस्ट में सभी अन्य टावर बहुत अच्छी तरह से काम कर रहे हैं। मैंने इतने लंबे समय तक इस पर काम किया और सिर्फ इसे यहां पोस्ट करना चाहता था यह एक तरह से अन्य अवांछित UI ऑब्जेक्ट्स को चारों ओर खींचने से रोकता है।

मेरा आधिकारिक लक्ष्य bool beingDragged = false; का उपयोग किए बिना ऐसा करने का एक तरीका प्रदान करना था bool beingDragged = false; । आप यह नहीं जानते कि कौन से Button या Image को खींच लिया जा रहा है यदि आप ऐसा करते हैं

खींचें UI :

RectTransformUtility की मदद से RectTransformUtility में स्थानीय बिंदु को स्क्रीनपॉइंट कन्वर्ट करें, तो RectTransformUtility उपयोग करें। RectTransformUtility यह पता लगाने के लिए कि वास्तव में बाल यूआई कहाँ है

 public Canvas parentCanvasOfImageToMove; Vector2 pos; RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvasOfImageToMove.transform as RectTransform, eventData.position, parentCanvasOfImageToMove.worldCamera, out pos); UIToMove.transform.position = parentCanvasOfImageToMove.transform.TransformPoint(pos); 

ड्रग कोड अन्य उत्तरों में अन्य खींचें कोड की तुलना में अधिक जटिल दिखता है, लेकिन ऐसा लगता है कि हर कैनवस कैमरा मोड में काम किया जा रहा है

यह पता लगाया जा रहा है कि ऑब्जेक्ट को खींचने के बारे में क्या है :

ऐसा करने का सबसे आसान तरीका एक वैश्विक वैरिएबल बनाना है जो आप को बचाने के लिए उपयोग कर सकते हैं जो ऑब्जेक्ट उपयोगकर्ता OnBeginDrag ड्रैग फ़ंक्शन में खींचना चाहता है, तब आप उस ऑब्जेक्ट को OnDrag में खींच सकते हैं। उस ऑब्जेक्ट को रिक्त करने के लिए सेट करें जब OnEndDrag को कॉल किया जाता है

 objectToBeDragged = eventData.pointerCurrentRaycast.gameObject; 

यह एक बार OnBeginDrag फ़ंक्शन में किया जाना चाहिए, फिर एक वैश्विक चर में सहेजा जाएगा।

आप OnDrag फ़ंक्शन में निम्नलिखित नहीं कर सकते

 if (eventData.pointerCurrentRaycast.gameObject == someOtherUI) { someOtherUI....drag } 

हालांकि यह लगता है कि काम करने के लिए, यह कभी कभी नहीं करता है कभी-कभी OnDrag दौरान कभी भी रिक्त नहीं OnDrag । यही कारण है कि यह OnBeginDrag फ़ंक्शन में किया जाना चाहिए।

का पता लगाने और खींचें बटन बनाम छवि :

यूआई केवल एक Image और एक Image खींचने का पता लगाने के लिए बहुत आसान है।

 objectToBeDragged = eventData.pointerCurrentRaycast.gameObject; Button tempButton = objectToBeDragged.GetComponent<Button>(); Image tempImage = objectToBeDragged.GetComponent<Image>(); 

यदि tempImage null नहीं है और tempButton null तो यह एक छवि है।

पता लगा रहा है कि UI केवल एक Button और एक Button को खींचना आसान नहीं है। जब बटन / किनारे पर एक बटन क्लिक किया जाता है, तो Button का नाम वापस आता है जो ठीक है। लेकिन ज्यादातर समय, एक Button पर एक Button के बीच में होता है जो कि Button का उदाहरण या नाम वापस नहीं करता बल्कि Text (बाल ऑब्जेक्ट) को वापस करता है आप बटन के रूप में किसी पाठ को नहीं ले सकते यह काम करने के लिए अभ्यस्त

 objectToBeDragged = eventData.pointerCurrentRaycast.gameObject; Button tempButton = objectToBeDragged.GetComponent<Button>(); Image tempImage = objectToBeDragged.GetComponent<Image>(); Text tempText = objectToBeDragged.GetComponent<Text>(); 

अगर tempText रिक्त नहीं है , तो GetComponentInParent का छवि और बटन घटक को पाठ का प्राप्त करें। यदि Image रिक्त नहीं है और Button ठीक नहीं है तो यह एक Button

 if (tempText != null) { tempButton = tempText.GetComponentInParent<Button>(); tempImage = tempText.GetComponentInParent<Image>(); if (tempButton != null && tempImage != null) { //This is a Button } } 

नीचे यूआई इमेज / पैनल और बटन खींचने की पूरी स्क्रिप्ट है। किसी भी बटन को खींचा जाना चाहिए UIButtons सरणी में डाल दिया जाना चाहिए और किसी भी पैनल / छवि को खींचा जाना चाहिए UIPanels सरणी में रखा जाना चाहिए। यह अन्य यूआई को अनदेखा करेगा जो ऐरे में नहीं हैं।

 public class UIDRAGGER : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { public Canvas parentCanvasOfImageToMove; //10 UI Buttons (Assign in Editor) public Button[] UIButtons; //2 UI Panels/Images (Assign in Editor) public Image[] UIPanels; //Hold which Button or Image is selected private Button selectedButton; private Image selectedUIPanels; //Used to make sure that the UI is position exactly where mouse was clicked intead of the default center of the UI Vector3 moveOffset; //Used to decide which mode we are in. Button Drag or Image/Panel Mode private DragType dragType = DragType.NONE; void Start() { parentCanvasOfImageToMove = gameObject.GetComponent<Canvas>(); } //Checks if the Button passed in is in the array bool buttonIsAvailableInArray(Button button) { bool _isAValidButton = false; for (int i = 0; i < UIButtons.Length; i++) { if (UIButtons[i] == button) { _isAValidButton = true; break; } } return _isAValidButton; } //Checks if the Panel/Image passed in is in the array bool imageIsAvailableInArray(Image image) { bool _isAValidImage = false; for (int i = 0; i < UIPanels.Length; i++) { if (UIPanels[i] == image) { _isAValidImage = true; break; } } return _isAValidImage; } void selectButton(Button button, Vector3 currentPos) { //check if it is in the image array that is allowed to be moved if (buttonIsAvailableInArray(button)) { //Make the image the current selected image selectedButton = button; dragType = DragType.BUTTONS; moveOffset = selectedButton.transform.position - currentPos; } else { //Clear the selected Button selectedButton = null; dragType = DragType.NONE; } } void selectImage(Image image, Vector3 currentPos) { //check if it is in the image array that is allowed to be moved if (imageIsAvailableInArray(image)) { //Make the image the current selected image selectedUIPanels = image; dragType = DragType.IMAGES; moveOffset = selectedUIPanels.transform.position - currentPos; } else { //Clear the selected Button selectedUIPanels = null; dragType = DragType.NONE; } } public void OnBeginDrag(PointerEventData eventData) { GameObject tempObj = eventData.pointerCurrentRaycast.gameObject; if (tempObj == null) { return; } Button tempButton = tempObj.GetComponent<Button>(); Image tempImage = tempObj.GetComponent<Image>(); Text tempText = tempObj.GetComponent<Text>(); //For Offeset Position Vector2 pos; RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvasOfImageToMove.transform as RectTransform, eventData.position, parentCanvasOfImageToMove.worldCamera, out pos); //Button must contain Text then Image and Button as parant //Check if this is an image if (tempButton == null || tempImage == null) { //Button not detected. Check if Button's text was detected if (tempText != null) { //Text detected. Now Look for Button and Image in the text's parent Object tempButton = tempText.GetComponentInParent<Button>(); tempImage = tempText.GetComponentInParent<Image>(); //Since child is text, check if parents are Button and Image if (tempButton != null && tempImage != null) { //This is a Button selectButton(tempButton, parentCanvasOfImageToMove.transform.TransformPoint(pos)); } //Check if there is just an image else if (tempImage != null) { //This is an Image selectImage(tempImage, parentCanvasOfImageToMove.transform.TransformPoint(pos)); } } else { //This is an Image selectImage(tempImage, parentCanvasOfImageToMove.transform.TransformPoint(pos)); } } //Check if there is just an image else if (tempImage != null) { selectImage(tempImage, parentCanvasOfImageToMove.transform.TransformPoint(pos)); } } public void OnDrag(PointerEventData eventData) { Vector2 pos; if (dragType == DragType.BUTTONS) { RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvasOfImageToMove.transform as RectTransform, eventData.position, parentCanvasOfImageToMove.worldCamera, out pos); selectedButton.transform.position = parentCanvasOfImageToMove.transform.TransformPoint(pos) + moveOffset; } else if (dragType == DragType.IMAGES) { RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvasOfImageToMove.transform as RectTransform, eventData.position, parentCanvasOfImageToMove.worldCamera, out pos); selectedUIPanels.transform.position = parentCanvasOfImageToMove.transform.TransformPoint(pos) + moveOffset; } } public void OnEndDrag(PointerEventData eventData) { //Buttons if (dragType == DragType.BUTTONS || dragType == DragType.IMAGES) { selectedButton = null; selectedUIPanels = null; dragType = DragType.NONE; } } DragType getCurrentDragType() { return dragType; } private enum DragType { NONE, BUTTONS, IMAGES }; }