Jump to content
Unity Insider Forum
Jar

Collectables & Useables

Recommended Posts

Hey Leute,

ich würde gerne folgendes Problem lösen.
In meinem Game gibt es Objekte, mit denen der Spieler interagieren kann. Und zwar kann er entweder ein Objekt benutzten (useable) oder es aufammeln (collectable).
Es gibt aber Spezialfälle in dem ein Objekt sowohl useable als auch collectable ist.

Dazu folgende Beispiele.
Eimer | Collectable & Useable
Apfel | Collectable
Truhe | Useable

Der Spieler kann immer nur ein Gegenstand gleichzeitig tragen. Also entweder Eimer oder Truhe.
Wenn ein Spieler einen Apfel in der Hand hat, soll er diesen in den Eimer legen können.

Benutzt der Spieler die Truhe, wenn er einen Eimer trägt, soll dieser in die Truhe entleert werden.

Ich habe mir überlegt ein Interface für Useable und Collectable anzulegen um zu unterscheiden ob ein Objekt nun useable oder collectable ist.
Das Problem das ich sehe sind die Spezialfälle in dem ein Script wissen muss ob ein Spieler bereits etwas aufgesammelt hat.

In einem PlayerInteraction Pseudo Script würde dann irgendwo so eine Abfrage kommen, welche für ein Collectable vollkommen okay ist.

if(input.InteractKeyDown()) {
  if(inventory.collectable == null) {
    Collect(item);
  } else {
    Drop(item);
  }
}

Wenn nun ein Item auch ein Useable ist wirds schon wieder etwas kniffliger

if(input.InteractKeyDown()) {
  if(inventory.collectable == null) {
    Collect(item);
  } else if(item.IsUseable()) {
    Use(item);
  } else {
    Drop(item);
  }
}

Hat jemand vielleicht schon einmal ein ähnliches Problem gehabt? Oder hab ich vielleicht gar kein Problem und es geht einfach nicht schöner?

Beste Grüße,
Jar

 

Share this post


Link to post
Share on other sites

Okay, spielen wir das mal durch. 

Soweit ich das verstehe, kannst du den Apfel niemals "nutzen", richtig? Nur droppen oder collecten. Dann würde ich auch diese 3 Fälle abfragen. Setze bools für die Zustände und frage sie ab. Im droppable würde ich dann abfragen, wer das 2. Element ist und was damit passiert.

if(input.InteractKeyDown()) {
  	if(inventory.collectable == null)
	{
		if(item.IsCollectable())
			Collect(item);
		else if (item.IsUseable()
			Use(item);
	}
	else
	{
		if (item.IsDroppable())
			Drop(item);
	}
}

 

Share this post


Link to post
Share on other sites

So nach Crunchphase und Urlaub wollte ich kurz Berichten wie das System nun aussieht.

Also, es gibt jetzt zwei wichtige Komponenten. Das ist das Interactable und das Collectable.

Collectable erben von Interactable und beide haben eine Priority.
Durch eine CanInteract() Methode wird geprüft ob ein Item aufgehoben oder ob mit diesem Interagiert werden kann.
Auf einem Item könnten mehrer Interactables sein.

Z.B. so:

Eimer
-> Interactable "Apfel hineinlegen" ( CanInteract => Spieler hat einen Apfel in der Hand)
-> Interactable "Apfel matschen" ( CanInteract => Eimer ist voll)
-> Collectable "Eimer aufheben" ( CanInteract => Spieler hat nichts in der Hand) 
 

Der Spieler prüft jetzt welches Interactable in der nähe mit der höchsten Prio ist und ruft auf diesem Interact auf. Wenn es ein Collectable ist, wird auf dem Collectable Collect aufgerufen. Wenn nichts in der Nähe ist, mit dem der Spieler interagieren kann, aber er etwas in der Hand hat, wird dieses abgelegt.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×