김김김의 게임개발
  • 유니티 게임 개발 - 팀 과제#1
    2023년 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);
            }
        }
    }
    댓글