본문 바로가기

게임 개발31

[Unity] 디펜스게임 개발 - 분열 스킬 Split Skill 스크립트using DG.Tweening;using System.Collections;using System.Collections.Generic;using TMPro;using UnityEngine;public class SplitSkill : OneTimeSkill{ [Header("# Split Skill")] [SerializeField] private int splitEnemyCount; [SerializeField] private float moveDelay; [Header("# Split Skill Effect")] [SerializeField] private GameObject splitEffect; [SerializeField] priva.. 2024. 7. 31.
[Unity] 디펜스게임 개발 - 유닛 소환 막기 스킬 물 보스는 유닛 소환을 막는 스킬을 사용한다. 보스가 나타나기 전 UI 보스 나타난 후 UI물보스는 일정 체력이 되었을 때 분열하므로 보스 체력을 보여주지 않도록 했다. 보스가 스킬을 사용하면 Boss 스킬이 체력바 아래에 생기고, 소환 버튼에 카운트다운 UI가 생긴다.저 카운트다운 UI는 물 보스 스킬 사용시에만 사용하므로 동적생성으로 Instantiate 해주었다. 어려웠던 점 물 보스는 분열할 때 자기 자신을 복제한다.즉 스킬 중복 사용이나 동적 UI 중복 생성, 분열 보스는 다른 Init 로직을 사용하는 등의 예외처리가 굉장히 많이 필요했다. BlockUnitSpawnSkill 스크립트using System.Collections;using UnityEngine;public class BlockUn.. 2024. 7. 30.
[Unity] 디펜스게임 개발 - Hp Bar 최적화 문제 상황 생성되는 몬스터가 각각 자신의 World Space 캔버스를 가지고 있었다.디펜스 게임 특성 상 몬스터의 수가 많을 수 밖에 없는데, 이 때 몬스터가 많아질수록각각 가진 캔버스의 개수에 따라 드로우 콜이 발생하였다.  window > Analysis > Frame Debugger에서 드로우 콜 개수를 확인해보았더니  몬스터가 21마리일 때 드로우콜 21개가 발생하는 것을 확인할 수 있었다. 따라서 HP바 이미지을 오브젝트 풀링을 사용하여 미리 생성해두고 Enemy가 스폰될 때 각각의 Enemy에 새로운 Hp바를 할당해주었다.enemy = GameManager.Instance.Pool.SpawnFromPool((int)EEnemyType.Basic).ReturnMyComponent();UIMan.. 2024. 7. 29.
Enemy가 웨이포인트 주변에서 부르르 떨리는 이슈 문제 상황  원래 코드using UnityEngine;public class EnemyMoveState : EnemyBaseState{ private readonly float range = 0.01f; public EnemyMoveState(EntityStateMachine stateMachine) : base(stateMachine) { } public override void Enter() { base.Enter(); StartAnimation(entityStateMachine.Entity.AnimationData.MoveParameterHash); } public override void Exit() { base.. 2024. 7. 19.
[Unity] 보스 키우기 (6) - 완성 팀 노션 Z1존 ‘승도’ | Notion teamsparta.notion.site  플레이 영상 2024. 6. 26.
[Unity] 보스 키우기 (5) - 버프 몬스터 EnemyBuffState.csusing System.Collections.Generic;using UnityEngine;public class EnemyBuffState : CharacterBaseState{ private EnemyStateMachine eStateMachine; private Enemy enemy; private bool bIsPlayed = false; private bool bIsBuffed = false; public EnemyBuffState(CharacterStateMachine stateMachine) : base(stateMachine) { eStateMachine = stateMachine as EnemyStateMachin.. 2024. 6. 25.
[Unity] 보스 키우기 (4) - 원거리 몬스터 위와 같이 총알을 오브젝트 풀에서 생성해준 후위치를 설정해주었다. 총알 생성 -> OnEnable -> 위치 할당 -> Start순서로 코드가 실행되어 아래와 같이 코드를 짜 해결하였다.  Bullet.csusing System;using UnityEngine;public class Bullet : PoolObject{ public event Action OnHitBullet; [SerializeField] private float bulletSpeed; [SerializeField] private float bulletLifeTime; private Vector3 startPos; private Vector3 targetPos; private Vector3 bulletD.. 2024. 6. 23.
[Unity] 보스 키우기 (3) - 코루틴 최적화 캐릭터가 죽었을 때 Die 애니메이션을 실행하고해당 애니메이션이 끝나면 오브젝트를 꺼주려고 한다. 처음엔IEnumerator WaitForDieAnim(){ Animator.SetTrigger(AnimationData.DieParameterHash); while (!Animator.GetCurrentAnimatorStateInfo(0).IsTag("Die")) yield return null; while (Animator.GetCurrentAnimatorStateInfo(0).normalizedTime  다음과 같이 Die 태그를 가진 애니메이션이 실행되고 해당 애니메이션이 끝나는 조건을 While 문을 사용해서 판별해 주었으나비효율적인 방법이었다. 알고보니 현재 재생 중인 애니메이션의 .. 2024. 6. 21.
[Unity] 보스 키우기 게임 (2) - FSM 이번 프로젝트에서는 유한 상태 머신( FSM )을 사용했다. Player와 Enemy 둘 다 움직이거나 공격하는 부분에서 공통적인 부분이 많으므로 Character를 상속받아 구현하였다. 구조CharacterStateMachine을 상속받는 PlayerStateMachine, EnemyStateMachine이 존재하고각 머신들은 플레이어의 State, Enemy의 State를 생성자로 가진다. 자식 머신들은 공통적으로 본인의 데이터(CharacterSO)와 스크립트(Character), 그리고 공격 대상의 Health 스크립트를 가지므로 CharacterStateMachine에서 선언해주었다. public class EnemyStateMachine : CharacterStateMachine{ pub.. 2024. 6. 20.