public void OnEndDrag(PointerEventData EventData) { //transform.position = StartingPosition; Button[] AndroidElements = Parent.gameObject.GetComponentsInChildren <Button>(); RectTransform DraggedRect = GetComponent <RectTransform>(); RectTransform TestRect; foreach (Button Element in AndroidElements) { //Skip self. if (Element.name == name) { continue; } TestRect = Element.GetComponent <RectTransform>(); //Make sure we don't overlaps other buttons. if (UIRectOverlaps(DraggedRect, TestRect)) { transform.position = StartingPosition; return; } //Make sure we drag within the boundaries if (!RectTransformUtility.RectangleContainsScreenPoint(Parent.GetComponent <RectTransform>(), EventData.position, EventData.pressEventCamera)) { transform.position = StartingPosition; return; } } AndroidButtonPosition ButtonPosition = InputManager.Instance.DumpCurrentAndroidButtonPosition(Parent.gameObject); ButtonPosition.Save(); }
/* * Given a valid Android Panel It returns an AndroidButtonPosition * containing all the current position info. */ public AndroidButtonPosition DumpCurrentAndroidButtonPosition(GameObject AndroidPanel) { AndroidButtonPosition ButtonPosition = new AndroidButtonPosition(); Button[] Entities = AndroidPanel.GetComponentsInChildren <Button>(); foreach (Button Entity in Entities) { Debug.Log("Saving " + Entity.name + " At position: " + Entity.transform.position.ToString()); Vector3 LocalPos = Entity.GetComponent <RectTransform>().localPosition; Vector2 AnchoredPosition = Entity.GetComponent <RectTransform>().anchoredPosition; switch (Entity.name) { case "LeftButton": ButtonPosition.LeftButton = new SerializableRectTransform(LocalPos, AnchoredPosition); break; case "RightButton": ButtonPosition.RightButton = new SerializableRectTransform(LocalPos, AnchoredPosition); break; case "UpButton": ButtonPosition.UpButton = new SerializableRectTransform(LocalPos, AnchoredPosition); break; case "ActionButton": ButtonPosition.ActionButton = new SerializableRectTransform(LocalPos, AnchoredPosition); break; default: Debug.Log("Unknown button in android panel( " + Entity.name + ")!"); break; } } return(ButtonPosition); }
/* * Set the android button position by loading the configuration either from the file * or defaulting to the one of the prefab. * At the ends it calls SetAndroidButtonPosition that does the actual job of moving things * in the panel! */ public void SetAndroidButtonPosition(GameObject AndroidPanel) { AndroidButtonPosition ButtonPosition = AndroidButtonPosition.Load(); if (ButtonPosition == null) { Debug.Log("Load Failed dumping now"); //Init ButtonPosition = DumpCurrentAndroidButtonPosition(AndroidPanel); ButtonPosition.Save(); } else { Debug.Log("Setting button position"); SetAndroidButtonPosition(AndroidPanel, ButtonPosition); } }
/* * Load the button position from the file and returns the new class if found * null if not. */ public static AndroidButtonPosition Load() { BinaryFormatter BFormatter = new BinaryFormatter(); FileStream LoadFile; try { LoadFile = File.Open(Application.persistentDataPath + "/" + PlayerPrefs.GetString("AndroidControlPanelFile", "AndroidControlPanelSettings.bin"), FileMode.Open); AndroidButtonPosition Instance = (AndroidButtonPosition)BFormatter.Deserialize(LoadFile); Debug.Log("Loaded " + Instance.ToString()); LoadFile.Close(); return(Instance); } catch (FileNotFoundException Exception) { Debug.Log("File was not found " + Exception.Message); } return(null); }
/* * Given a valid Android Panel and an AndroidButtonPositon * It sets the buttons inside the panel. */ public void SetAndroidButtonPosition(GameObject AndroidPanel, AndroidButtonPosition ButtonPosition) { Button[] Entities = AndroidPanel.GetComponentsInChildren <Button>(); foreach (Button Entity in Entities) { RectTransform EntityRect = Entity.GetComponent <RectTransform>(); switch (Entity.name) { case "LeftButton": EntityRect.anchoredPosition = ButtonPosition.LeftButton.AnchoredPosition.ToVector3(); EntityRect.localPosition = ButtonPosition.LeftButton.LocalPosition.ToVector3(); break; case "RightButton": EntityRect.anchoredPosition = ButtonPosition.RightButton.AnchoredPosition.ToVector3(); EntityRect.localPosition = ButtonPosition.RightButton.LocalPosition.ToVector3(); break; case "UpButton": EntityRect.anchoredPosition = ButtonPosition.UpButton.AnchoredPosition.ToVector3(); EntityRect.localPosition = ButtonPosition.UpButton.LocalPosition.ToVector3(); break; case "ActionButton": EntityRect.anchoredPosition = ButtonPosition.ActionButton.AnchoredPosition.ToVector3(); EntityRect.localPosition = ButtonPosition.ActionButton.LocalPosition.ToVector3(); break; default: Debug.Log("Unknown button in android panel( " + Entity.name + ")!"); break; } } if (GameHandler.Instance && GameHandler.Instance.IsPaused) { Debug.Log("Updating android panel"); GameHandler.Instance.MarkAndroidPanelDirty(); } return; }
public void WriteDefaults() { if (Application.platform == RuntimePlatform.Android) { GameObject DefaultAndroidPanel = Instantiate(Resources.Load("Prefabs/AndroidControlPanel")) as GameObject; AndroidButtonPosition DefaultButtonPosition = DumpCurrentAndroidButtonPosition(DefaultAndroidPanel); DefaultButtonPosition.Save(); Destroy(DefaultAndroidPanel); } else { PlayerPrefs.SetString("LeftButton", "A"); PlayerPrefs.SetString("AltLeftButton", "LeftArrow"); PlayerPrefs.SetString("RightButton", "D"); PlayerPrefs.SetString("AltRightButton", "RightArrow"); PlayerPrefs.SetString("UpButton", "Space"); PlayerPrefs.SetString("AltUpButton", "UpArrow"); PlayerPrefs.SetString("ActionButton", "LeftControl"); PlayerPrefs.SetString("AltActionButton", "RightControl"); Init(); } }