Podniesienie jedynego przedmiotu z wielu

0

Mam skrypt na podnoszenie przedmiotów ale problem w tym że w danym miejscu znajduje się ich wiele i po kliknięciu klawisza (nawet jak dałam getkeydown) podnosi się kilka na raz.

Pytanie moje jest, w jaki sposób zrobić to żeby podnosił się jeden przedmiot na który się patrzę za jednym kliknięciem? Myślałam nad dodaniem opóźnienia jakiegoś żeby nie zdążyły się podnieść 2 rzeczy tylko jedna. Ma prawo to działać? Czekam na inne pomysły.

(Unity, C#)

1

Jeśli jedno kliknięcie podnosi wiele przedmiotów na raz, to:
a) przedmioty obsługują podnoszenie w swoich skryptach,
b) nie dajesz break w pętli iterującej po przedmiotach po podniesieniu pierwszego.

To gracz ma podnosić przedmiot, a nie "przedmiot się podnosić graczem". Więc i tak jak np. nakierujesz kursor na jakiś przedmiot, to focus/aktywacja ma dotyczyć tylko jednego przedmiotu i pojedyncze kliknięcie powinno tylko ten jeden aktywny przedmiot podnieść.

Powinieneś opisać swój problem lepiej, bo nie wiemy w jaki sposób zaimplementowałeś podnoszenie przedmiotów.

0

Domyślam się, że robisz grę tego typu, jak "Jack Orlando" lub "Kajko i Kokosz" (nie jestem namiętnym graczem, ale te dwie gry akurat znam, a i jest dużo filmów YT z przebiegu gry). Proszę napisać, czy rzeczywiście taką grę chcesz zrobić.

Po pierwsze, przedmioty powinny być w różnych miejscach ekranu, trochę nie rozsądne byłoby umieszczanie kilku przedmiotów jeden na drugim. Jeżeli przewidujesz możliwość odłożenia przedmiotu w dowolnym miejscu dowolnej planszy (jak w Kajko i Kokosz), to też nie powinno być możliwości odłożenia jeden na drugim.

Jeżeli już się uprzeć, to powinien być podniesiony najbardziej widoczny przedmiot, czyli jak jest kilka nakładających się przedmiotów w jednym miejscu, to po kliknięciu w tym miejscu powinien podnieść się ten najbardziej widoczny.

1
andrzejlisek napisał(a):

czyli jak jest kilka nakładających się przedmiotów w jednym miejscu, to po kliknięciu w tym miejscu powinien podnieść się ten najbardziej widoczny.

Można też wyświetlić menu kontekstowe z listą przedmiotów ;)

0

@Spine: podnoszenie przebiega tak że jeśli gracz podejdzie na określoną odległość od przedmiotu i patrzy się to przedmiot zostanie przeniesiony do jego ręki, tak jakby przyczepiony. Nie wiem z jakiego powodu mimo tego że gracz patrzy na określony przedmiot i klika tylko raz klawisz na klawiaturze potrafią się podnieść 2 lub 3 przedmioty które są bardzo blisko ale jednak gracz na nie dokładnie nie patrzy.

@andrzejlisek: właśnie przedmioty mają być jeden na drugim a gracz powinien być w stanie podnieść tylko jeden przedmiot za jednym kliknięciem i to tylko ten na który patrzy. Jednakże gracz potrafi podnieść przedmioty które są dosłownie obok tego. Chciałabym wiedzieć jak faktycznie zrobić żeby te naciśnięcie klawisza mogło podnieść tylko jeden przedmiot za jednym kliknięciem.

1
Adewo napisał(a):

@Spine: podnoszenie przebiega tak że jeśli gracz podejdzie na określoną odległość od przedmiotu i patrzy się to przedmiot zostanie przeniesiony do jego ręki, tak jakby przyczepiony. Nie wiem z jakiego powodu mimo tego że gracz patrzy na określony przedmiot i klika tylko raz klawisz na klawiaturze potrafią się podnieść 2 lub 3 przedmioty które są bardzo blisko ale jednak gracz na nie dokładnie nie patrzy.

Szczegóły implementacyjne mają tutaj kluczowe znaczenie.
Co, gdzie, jak, w jakim skrypcie?
Triggery, raycasty?
To co napisałeś jest zbyt ogólne.

0

jeśli robisz to za pomocą colliderów, to możesz pobierać tablicę ze wszystkimi, które skrypt znalazł i pobierać tylko pierwszy. Możesz też zaimplementować by sprawdziło który jest najblizej gracza z nich wszystkich.

0

@Spine: napisałam to w osobnym skrypcie dla przedmiotu który ma być podniesiony, jest to w funkcji update. Ciężko mi nazwać wprost to co zrobiłam ale wiem że żeby zaznaczyć na jaki obiekt się patrzę użyłam raycastow czy cos takiego. Plus dodatkowo pamiętam że użyłam funkcji ontriggerstay. Niestety nie mam na ten moment dostępu do niego kodu.

@Inari: nie do końca rozumiem. Przedmiot jest podnoszony jesli gracz wszedł w dane pole (ontriggerstay) plus jeśli się patrzy na dany przedmiot i naciska przycisk "e". Problem jest taki że gracz podnosi przy jednym kliknięciu przedmioty które np są pod tym podniesionym przedmiotem zamiast poczekać na drugie kliknięcie plus często wykrywa rzeczy które są bardzo blisko przedmiotu na który patrzę.

1

Najlepiej wklej kody klas...

Na moje oko podnosisz wszystkie przedmioty, które wykrywają gracza w OnTriggerStay. Logikę podnoszenia przedmiotu pewnie wrzuciłaś do skryptu dla przedmiotu który ma być podniesiony. I przy podnoszeniu wszystkie instancje skryptu podnoszą przedmiot, do którego są przypisane.

Ale to jest takie gdybanie, na podstawie opisowego przedstawienia sytuacji. Gdybyś od początku dobrze przedstawiła problem, to znacznie szybciej by został rozwiązany. Trzeba dać kod, może nawet dołączyć zrzuty ekranu z gry/edytora i dobrze opisać działanie Twojej implementacji.

1
Adewo napisał(a):

@Inari: nie do końca rozumiem. Przedmiot jest podnoszony jesli gracz wszedł w dane pole (ontriggerstay) plus jeśli się patrzy na dany przedmiot i naciska przycisk "e". Problem jest taki że gracz podnosi przy jednym kliknięciu przedmioty które np są pod tym podniesionym przedmiotem zamiast poczekać na drugie kliknięcie plus często wykrywa rzeczy które są bardzo blisko przedmiotu na który patrzę.

używasz Input.GetKeyDown w skrypcie gracza czy w skrypcie przedmiotu, których jest kilka? może używasz metody, która 'zapina się' na wcisnięty klawisz a nie pojedyncze wciśnięcie i/lub kod odpowiadający za to jest w każdym z przedmiotów

1

Miałem podobny problem ostatnio i zaimplementowałem takie podnoszenie w GODOT, teraz przesiadłem się na UNITY ale do tego etapu jeszcze nie doszedłem. W każdym razie w GODOT:

signal item_in_range(item_id)

var items_in_range = {}

func _unhandled_input(event: InputEvent) -> void:
	if event.is_action_pressed("crouch") and items_in_range.size() > 0 and GameState.state == GameState.State.GAME:
		var keys = items_in_range.keys()
		var key = keys[0]
		Events.emit_signal("add_item_to_inventory", items_in_range[key], key.ammount)
	
		key.queue_free()
		items_in_range.erase(key)
		
func _on_ItemDetector_body_entered(body: Node) -> void:
	items_in_range[body] = body.item_id
	
	var keys = items_in_range.keys()
	var key = keys[0]
	var id = items_in_range[key]
	emit_signal("item_in_range", id)
	
func _on_ItemDetector_body_exited(body: Node) -> void:	
	if items_in_range.has(body):
		items_in_range.erase(body)

	var id = null
	
	if items_in_range.size() > 0:
		var keys = items_in_range.keys()
		var key = keys[0]
		id = items_in_range[key]
		
	emit_signal("item_in_range", id)

Każdy item ma takie kółko które oznacza obręb w jakim wchodzi w interakcje z graczem, a gracz też ma takie kółko z tym skryptem nazwany ItemDetector. Jak dwa te kółka na siebie najadą to item jest dodawany do var items_in_range = {} ale podnoszony jest tylko ten item z ostatnim indexem. Podczas gdy następuje dodanie nowego itemu który leży w obrębie detektora, albo usunięcie takiego itemu bo np. został podniesiony to jest wysyłany sygnał emit_signal("item_in_range", id) z id takiego przedmiotu, do UI które wyświetla nazwę tego itema jak w Death Gambit. Wyświetla się nazwa tylko jednego przedmiotu, tego co jest najwyżej na stosie.

1

masz 2 opcje:

  1. jak ktos pisal menu kontextowe na zasadzie skrzyni. pokazujesz liste przedmiotow jesli jest wiecej niz 1 i strzalkami wybierasz ktory chcesz podneisc na dole oopcja Wszystkie
  2. przy odkladaniu przedmiotu zrob maly colide box i rob tak zeby przedmioty sie odusuwaly na mala odleglosc tak by wyraznie gracz paczał na jeden.

Do czasu az nie wybierzesz jak chcesz to zrobic nie ma co ruszac kodu

1 użytkowników online, w tym zalogowanych: 0, gości: 1