Jump to content
Unity Insider Forum

shortcut ? hotkey ? Wie nennt man das.....


Hermetes

Recommended Posts

Ich gehe davon aus, dass du Einheiten gruppieren möchtest.

Das machst du in 3 Schritten.
1.: Alle möglichen Hotkeys definieren. Also im Code muss schon definiert sein, dass bei einem HotKey in eine Funktion oder Methode rein gesprungen werden muss oder eben ein Event ausgelöst wird. Das muss einmal für ds Drücken mit STRG und einmal ohne STRG geschehen.
2.: Alle Objekte, die dem Hotkey zugewiesen werden sollen, sind ja ausgewählt. Wenn jetzt dieser Hotkey gesetzt wird, müssen sie sich z.B. in eine Liste rein schreiben (Für jeden HotKey brauchst du  eine eigene Liste). Damit sie wissen, dass sie es tun sollen, muss natürlich irgendwie die Info zu den GO's kommen, dass jetzt gerade der Hotkey fürs Gruppieren gedrückt wurde. Die könnten eine Variable eines gewissen Scriptes abfragen oder sie horchen eben auf ein Event.
3.: Wird jetzt ein Hotkey ohne STRG gedrückt, muss natürlich wieder ein Event erzeugt oder eine Variable gestzt werden, damit die GO's wissen, dass sie in der entsprechenden Liste nachschauen sollen, ob sie selber davon betroffen sind. Sind sie es, dann aktivieren sie sich oder selektieren sich. Je nachdem wie du das nennen willst.
 

Du kannst das Ganze natürlich auch ohne Liste machen und sich jedes GO selbst verwalten lasen. Aber mit Liste wäre es einfacher die Gruppe in einer GUI darzustellen und falls du ein SaveGame erzeugen willst, kannst du diese Gruppierungen auch gleich mit abspeichern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

(malzbie war schneller, aber ich war schon fast fertig, daher...)

 

Wenn du das dynamisch ändern willst, fällt die dezentrale Lösung weg (aka. Script auf jedem anwählbaren GameObject). Dann bietet sich ein zentrales Dictionary an.

private Dictionary<KeyCode, GameObject[]> selectableGroups = new Dictionary<KeyCode, GameObject[]>();

Hier mappen wir ein GameObject-Array auf einen KeyCode.

In den Update-Code dieser Klasse kommt dann etwa sowas:

KeyCode pressedGroupKey;
if(!GetPressedGroupKey(out pressedGroupKey)) return;

if(ModifierKeyIsPressed())
{
  selectableGroups[pressedGroupKey] = GetCurrentlySelectedObjects()
}
else
{
  Select(selectableGroups[pressedGroupKey]);
}

Zu implementieren sind jetzt noch die vier ominösen Methoden.

private static bool GetPressedGroupKey(out KeyCode pressedGroupKey)
{
  // Gibt zurück, ob eine der Tasten (z.B. 1-9) gerade gedrückt wurde
  // Wenn true, wird diese Taste in pressedGroupKey geschrieben
}
private static bool ModifierKeyIsPressed()
{
  // Z.B.
  return Input.GetKey(KeyCode.LeftCtrl);
}

Und diese beiden hängen komplett von der restlichen Implementierung deines Projekts ab:

private static GameObject[] GetCurrentlySelectedObjects()
{
  // Gibt die gerade selektierten Objekte in einem Array zurück
}
private static void Select(GameObject[] objects)
{
  // Selektiert die GameObjects im übergebenen Array
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank euch beiden für eure Hilfe! :)
Wollte nur kurz Bescheid geben das ich da gerade dran bin. Und weil ich unbedingt das Thema Listen und Schleifen vertiefen möchte, gehe ich nach dem ersten Konzept.
Auf dem Weg im Auto, ist mir auch eingefallen das ich für alle Tasten eine Liste brauche.  Bin schon gut voran gekommen, allerdings auch auf ein paar Probleme. Ich versuchs die erstmal eigenständig zu lösen und lass es euch dann wissen ob es geklappt hat! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Endlich mal wieder Zeit gefunden, doch was mache ich nur falsch??? :(
Ich konnte die angeklickten Figuren in eine Liste setzten.
Doch leider kann ich die Figuren Gruppierung nicht wieder aufrufen.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;



public class ShortcutUnits : Interaction
{
	public bool selected = false;
	
	public override void Select ()
	{
		
		selected = true;
		
		
	}
	public override void Deselect()
	{
		selected = false;
	
	}
	
	public List<GameObject> SwapList1;
	GameObject[] selectedgameobjects;
	
	// Use this for initialization
	void Start () {
		
		selectedgameobjects = GameObject.FindGameObjectsWithTag("Player");
	
	}
	
	
	void Update () {
		
		
		if (selected && Input.GetKeyDown(KeyCode.LeftControl))
		{
			Debug.Log("Strg is pressed");
			if (Input.GetKeyDown(KeyCode.I))
			{
				if (SwapList1.Count != 0)
				{
					SwapList1.Clear();
				}
				else{
					
					if(SwapList1.Count == 0)
				{
				foreach (GameObject obj in selectedgameobjects)
				{
					
					SwapList1.Add(obj);
					
					
                }
					
				}
				}
			}
		}
		
		if (Input.GetKey(KeyCode.I))
		{
			foreach(GameObject obj in SwapList1)
			{
				selected = true;
				
			}
		}
			
		
	}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...