Startpunkten

This commit is contained in:
2026-04-20 13:09:07 +02:00
commit 1e9f31f003
177 changed files with 77970 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
using UnityEngine;
public class CameraController : MonoBehaviour {
public Transform player; // Dra in din Player i Inspector
public float smoothSpeed = 0.125f; // Hur mjukt kameran följer
public Vector3 offset = new Vector3(0, 0, -10); // Kamerans position bakom spelaren
// Begränsningar för kamerans rörelse
private float minX = -16.4f;
private float maxX = 16.4f;
private float minY = -15f;
private float maxY = 15f;
// Dead zone (hur långt spelaren måste röra sig innan kameran följer)
public float deadZoneX = 0.5f;
public float deadZoneY = 0.3f;
void LateUpdate() {
Vector3 targetPosition = player.position + offset;
// Dead zone: kameran rör sig bara om spelaren är utanför zonen
float deltaX = targetPosition.x - transform.position.x;
float deltaY = targetPosition.y - transform.position.y;
if (Mathf.Abs(deltaX) < deadZoneX) {
targetPosition.x = transform.position.x;
}
if (Mathf.Abs(deltaY) < deadZoneY) {
targetPosition.y = transform.position.y;
}
// Begränsa kameran inom banans gränser
targetPosition.x = Mathf.Clamp(targetPosition.x, minX, maxX);
targetPosition.y = Mathf.Clamp(targetPosition.y, minY, maxY);
// Mjuk rörelse
transform.position = Vector3.Lerp(transform.position, targetPosition, smoothSpeed);
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 53363d18367114b698ef3a41f7599bbe

View File

@@ -0,0 +1,40 @@
using UnityEngine;
public class EnemyController : MonoBehaviour {
private GameObject player;
public float enemySpeed = 2f;
public float minDistance = 0.5f; // Minsta avstånd mellan fiender
void Start() {
player = GameObject.FindWithTag("Player");
}
void Update() {
if (player != null) {
// Beräkna riktning mot spelaren
Vector3 direction = (player.transform.position - transform.position).normalized;
// Kontrollera om det finns andra fiender nära
Collider2D[] nearbyEnemies = Physics2D.OverlapCircleAll(transform.position, minDistance);
foreach (Collider2D enemy in nearbyEnemies) {
if (enemy.gameObject != this.gameObject && enemy.CompareTag("Enemy")) {
// Flytta bort från den andra fienden
Vector3 away = (transform.position - enemy.transform.position).normalized;
direction += away; // Justera riktningen
}
}
// Normalisera riktningen igen
direction = direction.normalized;
// Flytta fienden mot spelaren (med justerad riktning)
transform.position += direction * enemySpeed * Time.deltaTime;
}
}
void OnDrawGizmosSelected() {
// Rita cirkeln i Scene för att se minDistance
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, minDistance);
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: bb89b5fed3c7b472b911d78d63a26407

View File

@@ -0,0 +1,118 @@
using TMPro;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class GameController : MonoBehaviour {
public GameObject prefab; // Dra in din prefab i Inspector
public int numberOfPrefabs = 100; // Antal att skapa
public Vector2 spawnAreaMin = new Vector2(-25f, -20f);
public Vector2 spawnAreaMax = new Vector2(25f, 20f);
public float minDistanceFromPlayer = 5f; // Minsta avstånd från spelaren
public TMP_Text enemysLeftText, WinText, LooseText;
public Slider healthBar;
public Image barColor;
int enemyLeft;
int currentHealth = 100;
private AudioSource audioSource;
public AudioClip backgroundMusic;
public AudioClip explosion;
void Start() {
audioSource = GetComponent<AudioSource>();
audioSource.PlayOneShot(backgroundMusic);
WinText.enabled = false;
LooseText.enabled = false;
SpawnPrefabs();
enemyLeft = GameObject.FindGameObjectsWithTag("Enemy").Length;
UpdateUI();
}
void SpawnPrefabs() {
int spawned = 0;
while (spawned < numberOfPrefabs) {
float randomX = Random.Range(spawnAreaMin.x, spawnAreaMax.x);
float randomY = Random.Range(spawnAreaMin.y, spawnAreaMax.y);
Vector2 randomPosition = new Vector2(randomX, randomY);
// Kontrollera avstånd till spelaren (0,0)
if (Vector2.Distance(randomPosition, Vector2.zero) >= minDistanceFromPlayer) {
Instantiate(prefab, randomPosition, Quaternion.identity);
spawned++;
}
}
}
void Update() {
if (currentHealth <= 0) {
LooseText.enabled = true;
RemoveAllEnemies();
RemovePlayer();
Time.timeScale = 0;
}
if(enemyLeft <= 0) {
WinText.enabled = true;
RemoveAllEnemies();
RemovePlayer();
Time.timeScale = 0;
}
if (Input.GetKeyDown(KeyCode.Q))
{
QuitGame();
}
}
public static void QuitGame()
{
#if UNITY_EDITOR
// Stoppar Play Mode i Editor
EditorApplication.isPlaying = false;
#else
// Avslutar applikationen i build
Application.Quit();
#endif
}
void RemoveAllEnemies() {
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
foreach (GameObject enemy in enemies) {
Destroy(enemy);
}
}
void RemovePlayer() {
GameObject player = GameObject.FindGameObjectWithTag("Player");
if (player != null) {
player.SetActive(false);
}
}
public void KilledAnemy() {
enemyLeft--;
audioSource.PlayOneShot(explosion, 0.65f);
UpdateUI();
}
void UpdateUI() {
enemysLeftText.text = "LEFT: " + enemyLeft.ToString();
healthBar.value = currentHealth;
}
public void DrawHealth() {
currentHealth -= 15;
if (currentHealth <= 60) {
barColor.color = Color.orange;
}
else if (currentHealth <= 20) {
barColor.color = Color.red;
}
UpdateUI();
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 56ec2dff1ec3a4109b5a82574c95a444

View File

@@ -0,0 +1,77 @@
using UnityEngine;
public class PlayerController : MonoBehaviour {
public float moveSpeed = 5f;
public LayerMask wallLayer;
public GameObject projectilePrefab;
BoxCollider2D playerCollider;
Vector3 lastMoveDirection = Vector3.zero;
float shootTimer = 0f;
float shootInterval = 0.5f;
GameController gameController;
SpriteRenderer spriteRenderer;
Animator animator;
void Start() {
playerCollider = GetComponent<BoxCollider2D>();
gameController = FindFirstObjectByType<GameController>();
spriteRenderer = GetComponent<SpriteRenderer>(); // Hämta SpriteRenderer
animator = GetComponent<Animator>();
}
void Update() {
float moveX = Input.GetAxis("Horizontal");
float moveY = Input.GetAxis("Vertical");
bool isMoving = (moveX != 0 || moveY != 0);
animator.SetBool("isMoving", isMoving);
Vector3 move = new Vector3(moveX, moveY, 0f) * moveSpeed * Time.deltaTime;
Vector3 targetPosition = transform.position + move;
if (moveX != 0 || moveY != 0) {
lastMoveDirection = new Vector3(moveX, moveY, 0f).normalized;
}
if (!IsBlocked(targetPosition)) {
transform.position = targetPosition;
}
// Flippa sprite beroende på riktning
if (moveX > 0) {
spriteRenderer.flipX = false; // Tittar åt höger
} else if (moveX < 0) {
spriteRenderer.flipX = true; // Tittar åt vänster
}
// Skjut bara om vi rör oss
if (lastMoveDirection != Vector3.zero) {
shootTimer += Time.deltaTime;
if (shootTimer >= shootInterval) {
ShootProjectile();
shootTimer = 0f;
}
}
}
bool IsBlocked(Vector3 targetPos) {
Bounds bounds = playerCollider.bounds;
return Physics2D.OverlapBox(targetPos, bounds.size, 0f, wallLayer) != null;
}
void ShootProjectile() {
GameObject projectile = Instantiate(projectilePrefab, transform.position, Quaternion.identity);
projectile.GetComponent<ShotAway>().SetDirection(lastMoveDirection);
Destroy(projectile, 3f);
}
void OnTriggerEnter2D(Collider2D other) {
if (other.tag == "Enemy") {
gameController.DrawHealth();
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9381e01eba1e24fd29076d2e37eaa616

View File

@@ -0,0 +1,32 @@
using UnityEngine;
public class ShotAway : MonoBehaviour {
[SerializeField] private float ShotSpeed = 15f;
Vector3 direction;
GameController gameController;
void Start() {
gameController = FindFirstObjectByType<GameController>();
}
public void SetDirection(Vector3 dir) {
direction = dir.normalized;
// Beräkna vinkel i grader
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
// Sätt rotation på projektilen
transform.rotation = Quaternion.Euler(0, 0, angle);
}
void Update() {
transform.position += direction * ShotSpeed * Time.deltaTime;
}
void OnTriggerEnter2D(Collider2D collision) {
if (collision.CompareTag("Enemy")) {
Destroy(collision.gameObject); // Ta bort fienden
Destroy(gameObject); // Ta bort projektilen
gameController.KilledAnemy();
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a6834d656f101426a89f91725ef7ea3b