Här kommer nästa tvåtimmarslektion där vi tar vårt spel ett steg vidare. I denna lektion kommer vi att:
Nu ska vi göra så att insamlade objekt kan användas till specifika ändamål. Till exempel kan en nyckel användas för att öppna en dörr, eller en potion kan användas för att återställa spelarens hälsa.
Skapa en dörr i spelet:
Skapa ett Door-skript:
Door och skriv följande kod för att låta spelaren öppna dörren när de har nyckeln:using UnityEngine;
public class Door : MonoBehaviour
{
public bool isLocked = true; // Dörren är låst tills spelaren använder en nyckel
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
Inventory playerInventory = other.GetComponent<Inventory>();
// Kolla om spelaren har en nyckel
if (playerInventory != null)
{
foreach (var item in playerInventory.collectedItems)
{
if (item.name == "Key") // Kontrollera om det insamlade objektet är en nyckel
{
isLocked = false; // Lås upp dörren
Debug.Log("Dörren är nu öppen!");
OpenDoor();
return; // Sluta leta efter fler objekt efter att nyckeln har använts
}
}
}
}
}
void OpenDoor()
{
// Här kan du lägga till animationer eller dölja dörren
gameObject.SetActive(false); // Dölj dörren för att simulera att den öppnas
}
}
Lägg till Door-skriptet på dörren:
Door-skriptet på din dörr i Inspector.Justera nyckelobjektet:
Skapa en hälsobar:
Skapa ett HealthManager-skript:
HealthManager och lägg till det till spelaren. Detta skript kommer att hantera spelarens hälsa:using UnityEngine;
using UnityEngine.UI;
public class HealthManager : MonoBehaviour
{
public Slider healthBar;
public int maxHealth = 100;
public int currentHealth;
void Start()
{
currentHealth = maxHealth;
UpdateHealthBar();
}
public void TakeDamage(int amount)
{
currentHealth -= amount;
if (currentHealth < 0)
currentHealth = 0;
UpdateHealthBar();
}
public void Heal(int amount)
{
currentHealth += amount;
if (currentHealth > maxHealth)
currentHealth = maxHealth;
UpdateHealthBar();
}
void UpdateHealthBar()
{
healthBar.value = currentHealth;
}
}
Lägg till HealthManager till spelaren:
HealthManager-skriptet på din Player och dra din hälsobar (Slider) till skriptets Health Bar-fält i Inspector.Lägg till funktionalitet för att använda potion:
InventorySlot.cs-skript så att en potion kan återställa spelarens hälsa när den används:void UseItem()
{
if (item.name == "Potion") // Kontrollera om objektet är en potion
{
HealthManager healthManager = GameObject.FindGameObjectWithTag("Player").GetComponent<HealthManager>();
if (healthManager != null)
{
healthManager.Heal(20); // Återställ 20 enheter hälsa
Debug.Log("Potion användes! Hälsa återställd.");
}
}
// Ta bort objektet från inventariet efter användning
Destroy(gameObject);
}
Nu ska vi lägga till möjligheten för spelaren att flytta objekt runt i sitt inventory med en drag-och-släpp-funktion. Detta gör att vi kan hantera objekt mer dynamiskt och ordna dem i olika slots.
Lägg till en ny panel för att visa slots:
Skapa ett DragHandler-skript:
DragHandler. Detta skript kommer att hantera drag-och-släpp av objekt i UI:using UnityEngine;
using UnityEngine.EventSystems;
public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
private RectTransform rectTransform;
private CanvasGroup canvasGroup;
void Awake()
{
rectTransform = GetComponent<RectTransform>();
canvasGroup = GetComponent<CanvasGroup>();
}
public void OnBeginDrag(PointerEventData eventData)
{
canvasGroup.alpha = 0.6f; // Gör ikonen halvtransparent under drag
canvasGroup.blocksRaycasts = false; // Låt ikonen ignoreras under drag
}
public void OnDrag(PointerEventData eventData)
{
rectTransform.anchoredPosition += eventData.delta / transform.lossyScale;
}
public void OnEndDrag(PointerEventData eventData)
{
canvasGroup.alpha = 1f;
canvasGroup.blocksRaycasts = true; // Återställ efter släpp
}
}
DragHandler till dina inventoryslots:DragHandler som komponent.DropHandler:using UnityEngine;
using UnityEngine.EventSystems;
public class DropHandler : MonoBehaviour, IDropHandler
{
public void OnDrop(PointerEventData eventData)
{
// Detta kallas när ett objekt släpps på en annan slot
Debug.Log("Objekt släppt i slotten.");
if (eventData.pointerDrag != null)
{
// Flytta det dragna objektet till denna slots position
eventData.pointerDrag.GetComponent<RectTransform>().anchoredPosition = GetComponent<RectTransform>().anchoredPosition;
}
}
}
2
. Lägg till DropHandler till varje slot:
DropHandler-skriptet till alla dina InventorySlot-prefabs.I nästa lektion kan vi bygga vidare på systemet genom att:
I nästa lektion kommer vi att:
Vi fortsätter att bygga upp spelet med fler funktioner och interaktionsmöjligheter, vilket gör det både mer komplext och intressant!