Här kommer nästa tvåtimmarslektion, där vi fokuserar på att implementera mer avancerade spelmekaniker som power-ups, fällor och olika typer av utmaningar för att skapa mer djup i spelet. Vi kommer även börja titta på hur vi kan spara spelarens framsteg och hantera spelstatistik som poäng och högsta poäng.
Power-ups är objekt som ger spelaren speciella förmågor eller bonusar under spelets gång, som ökad hälsa, hastighet eller styrka. Vi kommer nu att skapa några enkla power-ups och se till att de påverkar spelaren när de plockas upp.
Skapa en power-up sprite:
Lägg till en Collider och Trigger:
PowerUp. Detta skript kommer att definiera hur power-ups fungerar och vad de gör för spelaren:using UnityEngine;
public class PowerUp : MonoBehaviour
{
public enum PowerUpType { Health, Speed, Strength }
public PowerUpType powerUpType; // Typ av power-up
public float powerUpDuration = 5f; // Hur länge power-upen varar (om tillämpligt)
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
PlayerController player = other.GetComponent<PlayerController>(); // Referens till spelarens skript
if (player != null)
{
ApplyPowerUp(player);
Destroy(gameObject); // Ta bort power-upen efter att den plockats upp
}
}
}
void ApplyPowerUp(PlayerController player)
{
switch (powerUpType)
{
case PowerUpType.Health:
player.IncreaseHealth(20); // Öka spelarens hälsa med 20
break;
case PowerUpType.Speed:
StartCoroutine(player.IncreaseSpeed(powerUpDuration)); // Öka spelarens hastighet tillfälligt
break;
case PowerUpType.Strength:
StartCoroutine(player.IncreaseStrength(powerUpDuration)); // Öka spelarens skada tillfälligt
break;
}
}
}
PowerUp-skriptet till ditt PowerUp-objekt. I Inspector kan du nu välja vilken typ av power-up det är (Health, Speed eller Strength).public class PlayerController : MonoBehaviour
{
public float speed = 5f;
public int maxHealth = 100;
private int currentHealth;
public int damage = 10;
void Start()
{
currentHealth = maxHealth;
}
public void IncreaseHealth(int amount)
{
currentHealth += amount;
if (currentHealth > maxHealth)
{
currentHealth = maxHealth;
}
Debug.Log("Hälsan ökade med " + amount);
}
public IEnumerator IncreaseSpeed(float duration)
{
speed *= 2; // Fördubbla hastigheten
Debug.Log("Hastigheten ökade!");
yield return new WaitForSeconds(duration); // Vänta tills power-upen tar slut
speed /= 2; // Återställ hastigheten
Debug.Log("Hastigheten återställd.");
}
public IEnumerator IncreaseStrength(float duration)
{
damage *= 2; // Fördubbla spelarens skada
Debug.Log("Skadan ökade!");
yield return new WaitForSeconds(duration);
damage /= 2; // Återställ skadan
Debug.Log("Skadan återställd.");
}
}
Fällor och utmaningar gör spelet mer spännande genom att sätta hinder i spelarens väg. Vi kommer nu att skapa några enkla fällor som minskar spelarens hälsa eller orsakar andra problem när de aktiveras.
Skapa en fällesprite:
Lägg till en Collider och Trigger:
Trap. Detta skript kommer att hantera vad som händer när spelaren aktiverar fällan.using UnityEngine;
public class Trap : MonoBehaviour
{
public int damage = 20; // Hur mycket skada fällan gör
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
PlayerController player = other.GetComponent<PlayerController>();
if (player != null)
{
player.TakeDamage(damage); // Spelaren tar skada från fällan
Debug.Log("Spelaren träffades av en fälla och tog " + damage + " skada!");
}
}
}
}
public void TakeDamage(int amount)
{
currentHealth -= amount;
if (currentHealth <= 0)
{
currentHealth = 0;
Die(); // Hantera spelarens död
}
Debug.Log("Spelaren tog " + amount + " skada. Nuvarande hälsa: " + currentHealth);
}
void Die()
{
Debug.Log("Spelaren dog!");
// Här kan du lägga till logik för att återställa spelet eller gå tillbaka till huvudmenyn
}
public class MovingTrap : MonoBehaviour
{
public Transform pointA; // Startpunkt
public Transform pointB; // Slutpunkt
public float speed = 2f;
private bool movingToB = true;
void Update()
{
if (movingToB)
{
transform.position = Vector2.MoveTowards(transform.position, pointB.position, speed * Time.deltaTime);
if (Vector2.Distance(transform.position, pointB.position) < 0.1f)
{
movingToB = false;
}
}
else
{
transform.position = Vector2.MoveTowards(transform.position, pointA.position, speed * Time.deltaTime);
if (Vector2.Distance(transform.position, pointA.position) < 0.1f)
{
movingToB = true;
}
}
}
}
Nu ska vi lägga till funktioner för att spara spelarens framsteg och hantera statistik, som poäng och högsta poäng. Detta gör spelet mer engagerande och ger spelaren mål att sträva mot.
ScoreManager. Detta skript kommer att hantera spelarens poäng och spara dem mellan olika spelsessioner:using UnityEngine;
public class ScoreManager : MonoBehaviour
{
public int score = 0;
public int highScore = 0;
void Start()
{
// Ladda högsta poängen från tidigare sessioner
highScore = PlayerPrefs.GetInt("HighScore", 0);
}
public void AddScore(int points)
{
score += points;
if (score > highScore)
{
highScore = score;
PlayerPrefs.SetInt("HighScore", highScore); // Spara högsta poängen
}
Debug.Log("Nuvarande poäng: " + score + ", Högsta poäng: " + highScore);
}
void OnApplicationQuit()
{
PlayerPrefs.Save(); // Se till att poängen sparas när spelet avslutas
}
}
ScoreManager för att öka spelarens poäng:public class Enemy : MonoBehaviour
{
public int scoreValue = 100; // Poängen som spelaren får när fienden besegras
void Die()
{
ScoreManager scoreManager = FindObjectOfType<ScoreManager>();
if (scoreManager != null)
{
scoreManager.AddScore(scoreValue); // Öka spelarens poäng
}
Destroy(gameObject);
}
}
public void SaveProgress(int currentLevel)
{
PlayerPrefs.SetInt("CurrentLevel", currentLevel); // Spara aktuell nivå
PlayerPrefs.Save();
}
public int LoadProgress()
{
return PlayerPrefs.GetInt("CurrentLevel", 1); // Ladda aktuell nivå (standard 1 om inget sparat)
}
void OnLevelComplete()
{
SaveProgress(currentLevel + 1);
SceneManager.LoadScene("Level" + (currentLevel + 1));
}
I nästa lektion kommer vi att:
Vi bygger nu upp ett spel med fler interaktiva element och ett mer engagerande spelupplägg!