Startpunkten
This commit is contained in:
40
Assets/Scripts/CameraController.cs
Normal file
40
Assets/Scripts/CameraController.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/CameraController.cs.meta
Normal file
2
Assets/Scripts/CameraController.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 53363d18367114b698ef3a41f7599bbe
|
||||
40
Assets/Scripts/EnemyController.cs
Normal file
40
Assets/Scripts/EnemyController.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/EnemyController.cs.meta
Normal file
2
Assets/Scripts/EnemyController.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bb89b5fed3c7b472b911d78d63a26407
|
||||
118
Assets/Scripts/GameController.cs
Normal file
118
Assets/Scripts/GameController.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/GameController.cs.meta
Normal file
2
Assets/Scripts/GameController.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 56ec2dff1ec3a4109b5a82574c95a444
|
||||
77
Assets/Scripts/PlayerController.cs
Normal file
77
Assets/Scripts/PlayerController.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/PlayerController.cs.meta
Normal file
2
Assets/Scripts/PlayerController.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9381e01eba1e24fd29076d2e37eaa616
|
||||
32
Assets/Scripts/ShotAway.cs
Normal file
32
Assets/Scripts/ShotAway.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/ShotAway.cs.meta
Normal file
2
Assets/Scripts/ShotAway.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a6834d656f101426a89f91725ef7ea3b
|
||||
Reference in New Issue
Block a user