Jump to content
Unity Insider Forum

Kurumi-chan

Members
  • Posts

    16
  • Joined

  • Last visited

  • Days Won

    1

Kurumi-chan last won the day on May 7

Kurumi-chan had the most liked content!

About Kurumi-chan

  • Birthday 02/05/1998

Profile Information

  • Gender
    Female
  • Location
    NRW

Kurumi-chan's Achievements

Member

Member (2/3)

2

Reputation

  1. Jeah, nach gut 20 Stunden Arbeit bin ich nun fertig und es funktioniert völlig fehlerfrei. Hätte ich nie gedacht und wollte schon aufgeben 😂 ☺️ Wer möchte kann das Script gerne nutzen, vielleicht hat ja auch noch jemand bedarf an sowas. Dazu einfach das Input Script dem EventSystem unter das "Input System UI Input Module"(Wichtig, da darf nichts anderes dazwischen sein) geben und die Tags "Horizontal Menu" und "Vertical Menu" hinzufügen und den entsprechenden Panels zuweisen. Das InputModule, welches man erstellt muss man entweder umbenennen in InputManager, oder in Script InputSO alle "InputManger" durch was anderes ersetzen. Das gleich gilt auf für die ActionMaps. Bei mehr als einer wird man allerdings noch mehr Anpassungen vornehmen müssen, sofern diese die Funktionalität auch benötigen. Wenn noch jemand Anmerkungen und Verbesserungen hat, gerne her damit 😁 Input.cs using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.UI; using UnityEngine.UI; internal struct NavigationModel { public Vector2 move; public int consecutiveMoveCount; public MoveDirection lastMoveDirection; public float lastMoveTime; public AxisEventData eventData; public void Reset() { move = Vector2.zero; } } public class Input : BaseInputModule { public InputSO inputSO; private NavigationModel m_NavigationState; private string parentTag; private bool isDynamicList; protected override void OnEnable() { base.OnEnable(); inputSO.moveVector += SetInputDirection; inputSO.navigate += CheckDynamicListObject; inputSO.submit += SetParentOnSubmit; } protected override void OnDisable() { base.OnDisable(); inputSO.moveVector -= SetInputDirection; inputSO.navigate -= CheckDynamicListObject; inputSO.submit -= SetParentOnSubmit; } public void OnClick() { eventSystem.SetSelectedGameObject(eventSystem.firstSelectedGameObject); } private void ProcessNavigation(ref NavigationModel navigationState) { var usedSelectionChange = false; if (eventSystem.currentSelectedGameObject != null) { var data = GetBaseEventData(); ExecuteEvents.Execute(EventSystem.current.currentSelectedGameObject, data, ExecuteEvents.updateSelectedHandler); usedSelectionChange = data.used; } if (!eventSystem.sendNavigationEvents) return; var movement = navigationState.move; if (!usedSelectionChange && (!Mathf.Approximately(movement.x, 0f) || !Mathf.Approximately(movement.y, 0f))) { var time = Time.unscaledTime; var moveVector = navigationState.move; var moveDirection = MoveDirection.None; if (moveVector.sqrMagnitude > 0) { if(parentTag == "Horizontal Menu") { if (Mathf.Abs(moveVector.x) > Mathf.Abs(moveVector.y)) moveDirection = moveVector.x > 0 ? MoveDirection.Right : MoveDirection.Left; } else if (parentTag == "Vertical Menu") { if (Mathf.Abs(moveVector.x) < Mathf.Abs(moveVector.y)) moveDirection = moveVector.y > 0 ? MoveDirection.Up : MoveDirection.Down; } else if (Mathf.Abs(moveVector.x) > Mathf.Abs(moveVector.y)) moveDirection = moveVector.x > 0 ? MoveDirection.Right : MoveDirection.Left; else moveDirection = moveVector.y > 0 ? MoveDirection.Up : MoveDirection.Down; } if (moveDirection != m_NavigationState.lastMoveDirection) m_NavigationState.consecutiveMoveCount = 0; if (moveDirection != MoveDirection.None) { var allow = true; if (m_NavigationState.consecutiveMoveCount != 0) { if (m_NavigationState.consecutiveMoveCount > 1) allow = time > m_NavigationState.lastMoveTime + GetComponent<InputSystemUIInputModule>().moveRepeatRate; else allow = time > m_NavigationState.lastMoveTime + GetComponent<InputSystemUIInputModule>().moveRepeatDelay; } if (allow) { Selectable newBtn = eventSystem.currentSelectedGameObject.GetComponent<Selectable>().FindSelectable(moveVector); if (newBtn.transform.parent.tag != parentTag) return; var eventData = m_NavigationState.eventData; if (eventData == null) { eventData = new AxisEventData(eventSystem); m_NavigationState.eventData = eventData; } eventData.Reset(); eventData.moveVector = moveVector; eventData.moveDir = moveDirection; ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, eventData, ExecuteEvents.moveHandler); usedSelectionChange = eventData.used; m_NavigationState.consecutiveMoveCount = m_NavigationState.consecutiveMoveCount + 1; m_NavigationState.lastMoveTime = time; m_NavigationState.lastMoveDirection = moveDirection; } } else m_NavigationState.consecutiveMoveCount = 0; } else m_NavigationState.consecutiveMoveCount = 0; if (!usedSelectionChange && EventSystem.current.currentSelectedGameObject != null) { var submitAction = GetComponent<InputSystemUIInputModule>().submit?.action; var cancelAction = GetComponent<InputSystemUIInputModule>().cancel?.action; var data = GetBaseEventData(); if (cancelAction != null && cancelAction.WasPressedThisFrame()) ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.cancelHandler); if (!data.used && submitAction != null && submitAction.WasPressedThisFrame()) ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, data, ExecuteEvents.submitHandler); } } public override void Process() { ProcessNavigation(ref m_NavigationState); if (parentTag != "Horizontal Menu" && parentTag != "Vertical Menu") { parentTag = eventSystem.currentSelectedGameObject.transform.parent.tag; UnityEditorInternal.ComponentUtility.MoveComponentDown(this); isDynamicList = false; } } public void SetInputDirection(Vector2 moveVector) { m_NavigationState.move = moveVector; } public void CheckDynamicListObject() { parentTag = eventSystem.currentSelectedGameObject.transform.parent.tag; if (!isDynamicList) { if (parentTag == "Horizontal Menu" || parentTag == "Vertical Menu") { isDynamicList = true; UnityEditorInternal.ComponentUtility.MoveComponentUp(this); } } } public void SetParentOnSubmit() { parentTag = eventSystem.currentSelectedGameObject.transform.parent.tag; } } InputSO.cs using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; [CreateAssetMenu(fileName = "AdvancedInput")] public class InputSO : ScriptableObject, InputManager.IMenuActions { public InputManager InputManager; public event UnityAction navigate; public event UnityAction<Vector2> moveVector; public event UnityAction submit; private void OnEnable() { if (InputManager == null) InputManager = new InputManager(); InputManager.Menu.SetCallbacks(this); InputManager.Menu.Enable(); } private void OnDisable() { InputManager.Menu.Disable(); } public void OnCancel(InputAction.CallbackContext context) { //throw new System.NotImplementedException(); } public void OnNavigate(InputAction.CallbackContext context) { navigate?.Invoke(); moveVector?.Invoke(context.ReadValue<Vector2>()); } public void OnSubmit(InputAction.CallbackContext context) { submit?.Invoke(); } }
  2. Also technisch gesehen habe ich das Problem gelöst, nur kann ich leider das Inputsystem nicht unterbrechen und in der Canceled Phase sieht man den Button wieder zurückspringen. Also er geht erst auf das neue Element und wird anschließend zurück zu seinem Ursprung gesetzt. Die "OK" Ausgabe erfolgt immer so, wie ich es mir vorgestellt habe. Gibt es irgendeine Möglichkeit an der Stelle das Inputsystem zu unterbrechen, das er nicht selbst dann noch das ausführt, wodurch mein move halt für die Tonne ist? Mit Enable, oder SetActive kann man zwar pausieren, aber sobald man wieder aktiviert, macht er einfach da weiter, wo er aufgehört hat 😓 public void test(InputActionPhase phase) { var moveVector = inputDirection; if (phase == InputActionPhase.Started) { currentBtn = EventSystem.current.currentSelectedGameObject; currentParent = EventSystem.current.currentSelectedGameObject.transform.parent; } else if (phase == InputActionPhase.Performed) { newSelectable = EventSystem.current.currentSelectedGameObject.GetComponent<Selectable>().FindSelectable(moveVector); if (newSelectable != currentBtn) { newParent = newSelectable.transform.parent; if (newParent != currentParent) { EventSystem.current.SetSelectedGameObject(currentBtn); Debug.Log("OK"); } } } else if (phase == InputActionPhase.Canceled) { EventSystem.current.SetSelectedGameObject(currentBtn); } }
  3. Lol, kontrollsüchtiges Panel also 😂 Also, wenns so geht, wie ichs mir gerade vorstelle, dann wird das sicher schon werden. Vorausgesetzt, das die Eingaben nicht ganz verschwinden. Muss ja immerhin noch wissen, welche Taste nun gedrückt wurde.
  4. Ok, ich glaube ich kann dir folgen. Wäre auch ein Versuch wert, dass mal zu probieren. Zumindest bei dynamischen Listen. Wäre dann ja quasi auch sowas, als würde ich das Inputsystem neuschreiben, nur dann halt nicht mehr für Inputs, wenn ich das so richtig verstanden habe. Der Button selbst wäre ja dann nur die gesamte Liste. Das Panel müsste man dann inaktiv setzen, damit man nicht mehr navigieren kann und sobald man zurück möchte, würde man einfach wieder aktiv setzen und könnte ganz normal weiter machen. Wenn ich das so richtig verstanden habe 😅 Ach und dann auch mal eine Frage zum Slider. Die Items haben aktuell noch keinen, brauchen sie aber logischerweise noch. In dem Fall müsste ich den Slider selektieren und nicht das Item? Weil dort hatte ich auch schon das Problem, dass es nicht funktionierte, habe es aber erstmal hinten angestellt.
  5. Ok, das verstehe ich gerade nicht wirklich^^ Naja, bisher eigentlich schon. Also es war jetzt nicht mega leicht oder so, aber bisher hat alles sehr gut funktioniert. Was mich sehr überrascht hat. Das einzige Problem ist gerade echt die Sache mit dem navigieren durchs Menu. Das hätte ich mir tatsächlich nicht so krampfig vorgestellt. Da kannst du es mal sehen, es sind 3 verschiedene Menus. Einmal das obere, dann die Items und noch das der Actors.
  6. Dumm ist halt auch, das in InputSystemUIInputModule ziemlich alles private ist. Selbst ProcessNavigation(ref m_NavigationState) geht schon nicht und das ist fast die einzige Funktion in Process 😂 Würde ja schon gerne so viel es geht übernehmen. Dann bin ich mal gespannt, ob ich das schaffe. Wirkt imo sehr schwer, aber ich freue mich drauf 😁 Und ich dachte mir so zum lernen fängst mal mit dem leichtesten an - dem Menu. Dann bin ich mal gespannt, was sonst noch so auf mich zukommt 🤔
  7. Oha, vielen dank Sascha, dass werde ich sofort mal ausprobieren ☺️ Dann bleibt nur noch die Frage, soll ich dazu quasi InputSystemUIInputModule überschreiben, bzw. brauche ich das dann nicht mehr, oder soll ich das einfach in public partial class @InputManager IInputActionCollection2, IDisposable realisieren? Das ist ja das Script, was mir von Unity erstellt wurde, als ich die Keybindings gemacht habe, also die Actionmap quasi. Und wo kann ich das neue Script dann einbinden, den im EventSystem im Inspector kann ich das Script ja leider nicht verändern und damit wäre ja dann auch jede meiner Änderungen wirkungslos?
  8. Hmm, sehr schade, aber ich habe es mir leider bereits gedacht. Habe ja schon Stunden mit googlen verbracht 🙂 Also ich habe jetzt mal versucht den aktuellen Button abzufangen, allerdings ohne Erfolg. Ich habe dazu versucht das Eventsystem über den Inspector zu setzen und das Eventsystem von InputSystemUIInputModule zu übernehmen, indem ich die Inputklasse davon erben lasse. Ich bekomme auf egal welchem wege immer diese Fehler: NullReferenceException: Object reference not set to an instance of an object InputController.test (UnityEngine.EventSystems.EventSystem e) (at Assets/InputController.cs:29) InputSO.OnNavigate (UnityEngine.InputSystem.InputAction+CallbackContext context) (at Assets/InputSO.cs:29) UnityEngine.InputSystem.Utilities.DelegateHelpers.InvokeCallbacksSafe[TValue] (UnityEngine.InputSystem.Utilities.CallbackArray`1[System.Action`1[TValue]]& callbacks, TValue argument, System.String callbackName, System.Object context) (at Library/PackageCache/com.unity.inputsystem@1.3.0/InputSystem/Utilities/DelegateHelpers.cs:46) UnityEngine.InputSystem.LowLevel.<>c__DisplayClass7_0:<set_onUpdate>b__0(NativeInputUpdateType, NativeInputEventBuffer*) UnityEngineInternal.Input.NativeInputSystem:NotifyUpdate(NativeInputUpdateType, IntPtr) NullReferenceException while executing 'started' callbacks of 'Menu/Navigate[/Keyboard/upArrow,/Keyboard/downArrow,/Keyboard/leftArrow,/Keyboard/rightArrow]' UnityEngine.InputSystem.LowLevel.NativeInputRuntime/<>c__DisplayClass7_0:<set_onUpdate>b__0 (UnityEngineInternal.Input.NativeInputUpdateType,UnityEngineInternal.Input.NativeInputEventBuffer*) UnityEngineInternal.Input.NativeInputSystem:NotifyUpdate (UnityEngineInternal.Input.NativeInputUpdateType,intptr) Das gleiche auch für performed und canceled. Das dass Eventsystem nicht existiert sehe ich, ich verstehe nur nicht warum? Vielleicht auch gleich mal die Scripts, ist evtl. dann einfacher zu sehen. using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.EventSystems; [CreateAssetMenu(menuName = "InputManager")] public class InputSO : ScriptableObject, InputManager.IMenuActions { private InputManager inputManager; public event UnityAction<Vector2> Movement; public event UnityAction<EventSystem> e; public event UnityAction t; private void OnEnable() { if (inputManager == null) inputManager = new InputManager(); inputManager.Menu.SetCallbacks(this); inputManager.Menu.Enable(); } private void OnDisable() { inputManager.Menu.Disable(); } public void OnNavigate(InputAction.CallbackContext context) { //inputManager = new InputManager(); Zum Testen, da hier null Debug.Log(inputManager.GetES()); e?.Invoke(inputManager.GetES()); Movement?.Invoke(context.ReadValue<Vector2>()); } public void OnSubmit(InputAction.CallbackContext context) { //throw new System.NotImplementedException(); } public void OnCancel(InputAction.CallbackContext context) { //throw new System.NotImplementedException(); } } using UnityEngine; using UnityEngine.EventSystems; public class InputController : MonoBehaviour { [SerializeField] private InputSO inputReader; [SerializeField] private EventSystem es; private void OnEnable() { inputReader.Movement += ReadMovementInput; inputReader.e += test; } private void OnDisable() { inputReader.Movement -= ReadMovementInput; } private void ReadMovementInput(Vector2 direction) { Debug.Log(direction); } private void test(EventSystem e) { Debug.Log(es.currentSelectedGameObject); Debug.Log(e.currentSelectedGameObject); } } Der erst hier ist der Standard, der von Unity erstellt wurde public partial class @InputManager : InputSystemUIInputModule, IInputActionCollection2, IDisposable { public EventSystem GetES() { return eventSystem; //Debug.Log(eventSystem.currentSelectedGameObject); } }
  9. @malzbie Ja, genau wie Sascha es schon gesagt hat meinte ich es auch. Hätte mich da etwas genauer ausdrücken sollen, sorry dafür. Nur weil ich weiß worum es geht, müssen andere das nicht auch 🙂 @Sascha Ja, das mache ich auch schon so, nur sind z.B. Items oder Actors dynamisch mit Instantiate() erstellt worden, weshalb ich da nicht mit explicit arbeiten kann? Deswegen hatte ich ja auf einen besseren Weg gehofft. Sowas wie Layout Sachen usw. habe ich ja alle schon getestet gehabt. Welchen Grund gäbe es, von einem Panel in ein anderes zu navigieren, dass es nicht von Haus aus schon nicht geht?
  10. Guten Morgen, ich nutze das neue Inputsystem von Unity und habe eine reine Tastatursteuerung. Meine Frage dazu ist jetzt, gibt es irgendeine einfache Möglichkeit Buttons zu gliedern, dass wenn man z.B. 2 Panels mit verschiedenen Buttons hat, nicht Panelübergreifend navigieren kann? Aktuell setze ich die entsprechenden Buttons immer als inaktiv, aber evtl. gibt es ja eine einfachere Lösung. Lg
  11. Hey, ich habe das Menü jetzt umgeschrieben und wollte kurz das Ergebnis zeigen. Habe es jetzt in 2 Scripts aufgeteilt und zwar ein ItemMenu, welches auf der obersten Ebene des Itemmenüs liegt und in Item, welches auf dem jeweiligen Item Button liegt. Ebenso habe ich jetzt alle Itemkategorien in einem Panel. Vorher waren das jedes mal eigenständige Panels. Ich hoffe, dass es so jetzt schon um einiges besser ist. Persönlich muss ich sagen, dass ich es so auf jeden fall wesentlich übersichtlicher finde. Hier mal die Scripts using TMPro; using System; using UnityEngine.UI; using UnityEngine; public class Item : MenuBase { private ItemMenu itemMenu; private int amount; private ItemSO item; private GameObject[] p1; private GameObject[] p2; void Awake() { itemMenu = ItemMenu.instance; } void Start() { p1 = new GameObject[4]; p2 = new GameObject[4]; RefreshCurrentItem(); } public void LoadItemContent() { Clear(); itemMenu.itemText.transform.GetComponent<TMP_Text>().text = item.itemName; itemMenu.itemAmountText.transform.GetComponent<TMP_Text>().text = amount.ToString(); itemMenu.itemDescriptionText.transform.GetComponent<TMP_Text>().text = item.itemDescription; itemMenu.itemIcon.transform.GetComponent<Image>().sprite = item.icon; itemMenu.targetPanel.transform.GetChild(1).GetComponent<TMP_Text>().text = item.targetAll ? "Alle" : "Einzeln"; LoadStatsPanel(); } public void OnCancel() { GameMenu.instance.OnSubCancel(); itemMenu.infoPanel.SetActive(false); } private void LoadStatsPanel() { if (item.stats.Count > 0) { for (int i = 0; i < item.stats.Count; i++) { p1[i] = Instantiate(itemMenu.statsPrefab, itemMenu.paramPanel.transform); p1[i].name = "Stat" + i.ToString(); p1[i].transform.GetChild(0).GetComponent<TMP_Text>().text = item.stats[i].paramName; p1[i].transform.GetChild(1).GetComponent<TMP_Text>().text = item.stats[i].paramValue.ToString(); } } if (item.specialStats.Count > 0) { for (int i = 0; i < item.specialStats.Count; i++) { p2[i] = Instantiate(itemMenu.statsPrefab, itemMenu.sParamPanel.transform); p2[i].name = "Stat" + i.ToString(); p2[i].transform.GetChild(0).GetComponent<TMP_Text>().text = item.stats[i].paramName; p2[i].transform.GetChild(1).GetComponent<TMP_Text>().text = item.stats[i].paramValue.ToString(); } } } private void RefreshCurrentItem() { int i = Convert.ToInt32(this.gameObject.name.Substring(4)); item = GameManager.instance.GetInventory()[i].Item1; amount = GameManager.instance.GetInventory()[i].Item2; } private void Clear() { if (p1.Length != 0) { for (int i = 0; i < p1.Length; i++) { Destroy(p1[i]); } } if (p2.Length != 0) { for (int i = 0; i < p2.Length; i++) { Destroy(p2[i]); } } } using System.Collections.Generic; using UnityEngine; using TMPro; using System; using UnityEngine.UI; public class ItemMenu : MonoBehaviour { public GameObject header; public GameObject itemList; public GameObject itemBtn; public GameObject infoPanel; [Header("Info Texts")] public GameObject itemText; public GameObject itemAmountText; public GameObject itemDescriptionText; public GameObject itemIcon; [Header("Stats Panels")] public GameObject statsPanel; public GameObject paramPanel; public GameObject sParamPanel; [Space(5)] public GameObject targetPanel; [Space(5)] public GameObject statsPrefab; private List<(ItemSO, int)> inventory; private int itemType; private int lastItemType; public static ItemMenu instance; void Start() { instance = this; itemType = 0; lastItemType = 0; inventory = GameManager.instance.GetInventory(); CreateItemButtons(); } void Update() { if(itemType != lastItemType) { lastItemType = itemType; Refresh(); } } public void SetCurrentItem(GameObject item) { itemBtn = item; } public void OnButtonSelected(int i) { itemType = i; GameMenu.instance.SetSubBtnIndex(i); } private void Refresh() { Clear(); CreateItemButtons(); } public void CreateItemButtons() { int items = inventory.Count; switch (itemType) { case (int)ItemType.Items: for (int i = 0; i < items; i++) { if ((int)inventory[i].Item1.itemType == (int)ItemType.Items) { LoadItemData(i); targetPanel.SetActive(true); statsPanel.SetActive(false); } } break; case (int)ItemType.Weapons: for (int i = 0; i < items; i++) { if ((int)inventory[i].Item1.itemType == (int)ItemType.Weapons) { LoadItemData(i); targetPanel.SetActive(false); statsPanel.SetActive(true); } } break; case (int)ItemType.Armors: for (int i = 0; i < items; i++) { if ((int)inventory[i].Item1.itemType == (int)ItemType.Armors) { LoadItemData(i); targetPanel.SetActive(false); statsPanel.SetActive(true); } } break; case (int)ItemType.Accessory: for (int i = 0; i < items; i++) { if ((int)inventory[i].Item1.itemType == (int)ItemType.Accessory) { LoadItemData(i); targetPanel.SetActive(false); statsPanel.SetActive(true); } } break; case (int)ItemType.KeyItems: for (int i = 0; i < items; i++) { if ((int)inventory[i].Item1.itemType == (int)ItemType.KeyItems) { LoadItemData(i); targetPanel.SetActive(false); statsPanel.SetActive(false); } } break; } } private void LoadItemData(int index) { var btn = Instantiate(itemBtn, itemList.transform); btn.name = "Item" + index.ToString(); btn.transform.GetChild(1).GetComponent<Image>().sprite = inventory[index].Item1.icon; btn.transform.GetChild(2).GetComponent<TMP_Text>().text = inventory[index].Item1.itemName; btn.transform.GetChild(3).GetComponent<TMP_Text>().text = inventory[index].Item2.ToString(); } private void Clear() { if (itemList.transform.childCount > 0) { for (int i = 0; i < itemList.transform.childCount; i++) { Destroy(itemList.transform.GetChild(i).gameObject); } } } }
  12. Sorry, irgendwie komme ich da nicht so ganz mit 😅 Also im Bild ist ja zu sehen, dass das Untermenü Waffen ausgewählt ist und der Button dazu eben auch. Wenn ich nun von den einzelnen Waffen zurück ins Submenü wechsle, dann wird auch wieder Waffen ausgewählt, das gleich bei allen anderen Items. Wenn ich dort jetzt hoch zu den Konsumgütern move (ist reine Tastatursteuerung), dann werden schon dir Konsumgüter geladen und angezeigt, ohne das ich diesen Button drücke. Wenn ich nun zurück ins Hauptmenü wechseln würde, dann ist erstmal Items ausgewählt. Würde ich dort jetzt das moven, dann würde auch dort der neue Inhalt geladen werden, z.B. die Gruppe, oder der Status, ohne das ich den Button drücken muss. Das Drücken des Buttons läd in dem Fall lediglich das entsprechende Menü des Untermenüs. Joa... da rate ich halt auch grundsätzlich von ab Boah, da hab ich gar keine Ahnung, wie ich das anders machen sollte 😕 Nee, zufällig ist das nicht. Aber undefiniert. Unity wird dir vermutlich immer dasselbe in derselben Situation geben, aber du hast halt keine Garantie dafür, dass das immer so bleibt. Vielleicht kriegst du im Build etwas anderes als im Editor, oder das Ergebnis ändert nach einem Update der Unity-Version. Da du dich darauf also nicht verlassen kannst, solltest du es meiden. Hmm, ok. tatsächlich nicht ganz, Main- und Submenü werden leicht anders behandelt und im Main die Gruppe, aber ich denke ich könnte da trotzdem noch ein wenig optimieren
  13. Wow, danke dir Sascha, für deinen ausführlichen Beitrag. Und danke, das du das Tool zur Verfügung stellst. Werde mir das auch mal ansehen um von deinem Code zu lernen, wenn das ok ist 🙂 Prefabs benutze ich derzeit 2 Stück, einmal das, welches für die stats verantwortlich ist und einmal der Itembutton, da diese über Schleifen erstellt werden. Gäbe es in diesem Beispiel noch mehr, was du mit Prefabs lösen würdest? Ich möchte halt immer genau wissen, welche Button ausgewählt wurden, um mein zurückgegebn, diesen selektieren zu können, bzw. um beim moven schon den neuen Inhalt zu laden und erst beim drücken dann auch das entsprechende Menü anzuzeigen. Denke, dass dies dann nicht mehr so leicht möglich ist? Vor allem, weil ich das alles in einem Skript habe, quasi der MenuManger. Also ich kenne Sie dem Namen nach, da VS sie ja regelmäßig anzeigt, aber deren genauen nutzen kenne ich nicht, bzw. ich habe mich generell nicht damit auseinandergesetzt. Bei Component habe ich halt das Problem gesehen, dass es zu viele davon gibt und ich nicht sicher weiß, welche er jetzt gefunden hat. Ich arbeite im Moment wie oben erwähnt nur mit 2 Skripten. Einmal halt Items und einmal Manager. Und wenn ich von Manager, der ganz oben liegt, jetzt nach einer Komponente suchen würde, bekomme ich ja ohne ende angeboten 😄 Und ich habe irgendwo mal gelesen/gehört, dass sowas auch gerne mal zufällig ausgesucht wird. Aber ich werde jetzt auf jeden fall mal versuchen, deine Tipps umzusetzen und meinen Code umzustrukturieren. Du hast sehr geholfen, herzlichen dank dafür ☺️ Wird wieder viel Arbeit, da ja auch schon einiges gemacht wurde, aber was muss, dass muss 🙂
  14. Ich habe es jetzt eher andersherum, das man eher vieles im Editor referenzieren sollte, damit man im Code keine Probleme bekommt. Aber allgemein ist es eine gute Frage, vor allem, wann und warum lässt es sich nicht immer so machen? Ich hatte mich tatsächlich extra entschieden den Editor nicht zu verwenden, weil ich dachte 100e Referenzen im Editor seinen ein wenig viel, vor allem, weil es sich ja hier nur um das Itemmenü handelt. Da kommen ja dann noch zig andere Menüs dazu.
  15. Hey Sascha, vielen dank für deine Antwort 😄 Die Objektvariablen waren vorher noch notwendig, aber da alles nicht funktioniert hat, ist dann der neue Code daraus geworden und ich habe nicht mehr daran gedacht, dass man dies jetzt beim StatsPanel ändern könnte. Prefabs benutze ich aber in dem Fall schon. Das wird jeweils für p1 und p2 so oft instanziiert, wie es Werte gibt. Ja, die GetChild Sachen würde ich sehr gerne los werden, da dachte ich mir schon, dass es sicher einen besseren Weg gibt, aber ich selbst könnte keinen finden, bzw der Weg über z.B. Find() funktioniert aus welchem Grund auch immer nicht immer. Manche Panels könnte er nicht finden, obwohl es nur einmal existiert und auch richtig geschrieben wird. Aber ich denke, auch Find() ist nicht der beste Weg :-D
×
×
  • Create New...