방명록
- 유니티 게임 개발 - 팀 과제#12023년 09월 27일 20시 06분 03초에 업로드 된 글입니다.작성자: noun06
적 및 보스 구현을 진행하였고 각각 근접 공격, 원거리 공격, 순간이동, 원 공전과 보스는 다양한 적들을 소환하는 스킬을 가지고 있다. 체력 시스템과 체력바 시스템을 구현 후 전체적인 리펙터링을 진행할 예정이다.
근접 공격 적
using Components.Action; using UnityEngine; public class MeleeEnemyController : EnemyController { [SerializeField] [Range(0f, 100f)] private float followRange; [SerializeField] private string targetTag = "Player"; private bool _isCollidingWithTarget; [SerializeField] private SpriteRenderer characterRendere; private HealthSystem healthSystem; private HealthSystem _collidingTargetHealthSystem; private Movement _collidingMovement; protected override void Start() { base.Start(); healthSystem = GetComponent<HealthSystem>(); healthSystem.OnDamage += OnDamage; } private void OnDamage() { followRange = 100f; } protected override void FixedUpdate() { base.FixedUpdate(); Vector2 direction = Vector2.zero; if (DistanceToTarget() < followRange) { direction = DirectionToTarget(); } CallMove(direction); Rotate(direction); } private void Rotate(Vector2 direction) { float rotZ = Mathf.Atan2(direction.x, direction.y) * Mathf.Deg2Rad; characterRendere.flipX = Mathf.Abs(rotZ) > 90f; } private void OnTriggerEnter2D(Collider2D collision) { GameObject receiver = collision.gameObject; if (!receiver.CompareTag(targetTag)) { return; } _collidingTargetHealthSystem = receiver.GetComponent<HealthSystem>(); if (_collidingTargetHealthSystem != null) { _isCollidingWithTarget = true; } _collidingMovement = receiver.GetComponent<Movement>(); } private void OnTriggerExit2D(Collider2D collision) { if (!collision.CompareTag(targetTag)) { return; } _isCollidingWithTarget = false; } }
순간이동 스킬 적
using UnityEngine; public class TeleportingEnemyController : EnemyController { [SerializeField] private float teleportDistance = 5f; [SerializeField] private float teleportCooldown = 2f; private Vector2 _playerPosition; private float _lastTeleportTime; private float _minX, _maxX, _minY, _maxY; protected override void Start() { base.Start(); CalculateCameraBounds(); } protected override void FixedUpdate() { base.FixedUpdate(); UpdatePlayerPosition(); TeleportEnemy(); } private void UpdatePlayerPosition() { _playerPosition = Target.position; } private void TeleportEnemy() { if (Time.time - _lastTeleportTime >= teleportCooldown) { float distanceToPlayer = Vector2.Distance(transform.position, _playerPosition); if (distanceToPlayer < teleportDistance) { Vector2 teleportPosition = GetRandomTeleportPosition(); transform.position = teleportPosition; _lastTeleportTime = Time.time; } } } private Vector2 GetRandomTeleportPosition() { float x = Random.Range(_minX, _maxX); float y = Random.Range(_minY, _maxY); return new Vector2(x, y); } private void CalculateCameraBounds() { Camera mainCamera = Camera.main; float cameraHeight = 2f * mainCamera.orthographicSize; float cameraWidth = cameraHeight * mainCamera.aspect; _minX = mainCamera.transform.position.x - cameraWidth / 2f; _maxX = mainCamera.transform.position.x + cameraWidth / 2f; _minY = mainCamera.transform.position.y - cameraHeight / 2f; _maxY = mainCamera.transform.position.y + cameraHeight / 2f; } }
보스
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BossEnemyController : EnemyController { [SerializeField] private float specialAttackRange = 10f; [SerializeField] private float summonInterval = 10f; [SerializeField] private GameObject[] minionPrefabs; [SerializeField] private Transform summonPosition; private float _lastSummonTime; private List<GameObject> _minions = new List<GameObject>(); protected override void Start() { base.Start(); _lastSummonTime = summonInterval; } protected override void FixedUpdate() { base.FixedUpdate(); float distance = DistanceToTarget(); if (distance <= specialAttackRange) { PerformSpecialAttack(); } if (Time.time - _lastSummonTime >= summonInterval) { SummonMinion(); _lastSummonTime = Time.time; } } private void PerformSpecialAttack() { // 공격 로직 } private void SummonMinion() { if (minionPrefabs != null && minionPrefabs.Length > 0) { int randomIndex = Random.Range(0, minionPrefabs.Length); GameObject selectedMinionPrefab = minionPrefabs[randomIndex]; GameObject minion = Instantiate(selectedMinionPrefab, summonPosition.position, Quaternion.identity, summonPosition); _minions.Add(minion); } } }
다음글이 없습니다.이전글이 없습니다.댓글