Här kommer nästa tvåtimmarslektion, där vi fokuserar på att implementera fiende-AI och introducera animationer för att skapa ett mer dynamiskt och engagerande spel. Vi kommer även börja fundera på nivådesign och progression i spelet.
Nu ska vi ge fienderna ett mer dynamiskt beteende genom att implementera AI, så att de kan följa och attackera spelaren. Vi kommer även att lägga till enkel "patrulleringslogik" där fienderna rör sig mellan olika punkter.
EnemyAI. Detta skript kommer att hantera fiendens beteende, som att följa spelaren eller patrullera mellan punkter.using UnityEngine;
public class EnemyAI : MonoBehaviour
{
public float speed = 2f; // Fiendens hastighet
public float detectionRange = 5f; // Hur nära spelaren måste vara för att fienden ska börja följa
private Transform player; // Referens till spelarens position
void Start()
{
// Hitta spelaren genom dess tagg
player = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update()
{
// Kolla avståndet mellan spelaren och fienden
float distanceToPlayer = Vector2.Distance(transform.position, player.position);
if (distanceToPlayer < detectionRange)
{
// Följ spelaren om den är inom räckhåll
FollowPlayer();
}
}
void FollowPlayer()
{
// Flytta fienden mot spelarens position
Vector2 direction = (player.position - transform.position).normalized;
transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
}
}
Lägg till EnemyAI-skriptet till fienderna:
EnemyAI-skriptet till fienderna. Justera hastigheten och detectionRange i Inspector beroende på hur snabbt och aggressivt du vill att fienderna ska vara.Testa fiendernas rörelser:
Lägg till patrulleringspunkter:
Uppdatera EnemyAI-skriptet för patrullering:
public class EnemyAI : MonoBehaviour
{
public float speed = 2f;
public float detectionRange = 5f;
public Transform player;
public Transform[] patrolPoints; // Array för patrulleringspunkter
private int currentPatrolIndex = 0;
void Update()
{
float distanceToPlayer = Vector2.Distance(transform.position, player.position);
if (distanceToPlayer < detectionRange)
{
FollowPlayer();
}
else
{
Patrol();
}
}
void FollowPlayer()
{
Vector2 direction = (player.position - transform.position).normalized;
transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
}
void Patrol()
{
if (Vector2.Distance(transform.position, patrolPoints[currentPatrolIndex].position) < 0.2f)
{
currentPatrolIndex = (currentPatrolIndex + 1) % patrolPoints.Length;
}
transform.position = Vector2.MoveTowards(transform.position, patrolPoints[currentPatrolIndex].position, speed * Time.deltaTime);
}
}
Tilldela patrullpunkter:
EnemyAI-skriptet genom att dra "PatrolPoint1" och "PatrolPoint2" till Inspector under fältet för patrulleringspunkter.Testa patrulleringen:
Animationer är en viktig del för att skapa ett mer dynamiskt och levande spel. I denna del kommer vi att lägga till enkel animation för att visa när spelaren rör sig eller attackerar, samt ge fiender rörelseanimationer.
Skapa en Animator Controller:
Lägg till animationer:
Tilldela animationerna:
Skapa parametrar för animationer:
Använd Animation Triggers i koden:
public Animator animator;
void Update()
{
float moveX = Input.GetAxisRaw("Horizontal");
float moveY = Input.GetAxisRaw("Vertical");
if (moveX != 0 || moveY != 0)
{
animator.SetBool("isWalking", true); // Spelaren rör sig
}
else
{
animator.SetBool("isWalking", false); // Spelaren står still
}
}
if (Input.GetKeyDown(KeyCode.Space)) // Om spelaren trycker på mellanslag
{
animator.SetTrigger("Attack"); // Spelaren utför en attack
}
void EnableWeaponCollider()
{
// Aktivera vapnet när attacken startar
weaponCollider.enabled = true;
}
void DisableWeaponCollider()
{
// Stäng av vapnet när attacken slutar
weaponCollider.enabled = false;
}
För att göra spelet mer intressant kan vi börja fundera på nivådesign och progression. Vi kan skapa enkla nivåer med olika utmaningar, och när spelaren besegrar fiender eller klarar specifika mål, kan de avancera till nästa nivå.
Skapa nya scener:
Ladda nästa nivå:
besegrar en boss eller plockar upp ett objekt), kan du ladda nästa nivå:
using UnityEngine;
using UnityEngine.SceneManagement;
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
// När spelaren når slutet av nivån, ladda nästa scen
SceneManager.LoadScene("Level2");
}
}
Skapa progression genom svårare fiender:
Lägg till bossar:
I nästa lektion kommer vi att:
Vi börjar närma oss ett spel med full funktionalitet, och snart kan vi fokusera på att förfina och utöka spelet ytterligare med fler funktioner och detaljer!