til 69

[Unity] 적 자동 생성 시스템 리팩토링 — ScriptableObject → JSON 데이터 관리 방식 변경

개요처음에는 ScriptableObject를 활용해 적 능력치를 관리했지만,점점 게임 데이터가 많아지고 관리가 어려워지면서,JSON 파일을 통한 데이터 관리로 리팩토링을 진행했다.이번 포스팅에서는 기존 방식과 새 방식의 차이점, 그리고 수정된 적 자동 생성 시스템을 소개하겠습니다.기존 방식: ScriptableObject를 이용한 능력치 관리초기에는 적마다 별도로 ScriptableObject를 만들어서 능력치를 세팅했다.[SerializeField] private List enemySOList;EnemySO 안에 체력, 공격력 등의 데이터가 들어있고적 오브젝트는 이 EnemySO를 참조해서 능력치를 가져왔다.장점: 직관적이고 에디터에서 쉽게 수정할 수 있음단점: 적 개수가 많아지면 관리가 복잡하고, 빌..

[Unity] 웨이브 기반 적 스폰 시스템 구현기

이번에는 유니티에서 웨이브 기반으로 적을 생성하는 시스템을 만들어 간단하게 적 데이터를 ScriptableObject로 관리하고, 그 데이터를 기반으로 적을 스폰하는 방식으로 구현했다.EnemyManager 구조public class EnemyManager : Singleton 우선 EnemyManager는 싱글톤으로 구현하여 게임 내에서 언제 어디서든 적을 생성하거나 관리할 수 있도록 하였다.ScriptableObject로 적 데이터 따로 관리[SerializeField] private List enemySOList = new List();적 능력치는 EnemySO라는 ScriptableObject에 따로 저장해서 리스트로 관리하여 나중에 능력치 바꾸기도 편하고, 데이터만 따로 보기 좋게 정리할 수 있..

유니티에서 3D 최적화를 위한 랜더링 파이프라인 개선 방법

3D 그래픽을 최적화하는 과정은 랜더링 파이프라인을 단순화하는 것에서 시작됩니다. 불필요한 연산을 줄이고 효율적인 랜더링을 수행하는 것이 핵심입니다.1. 문제 진단: 프로파일링최적화를 하기 전, 먼저 현재 성능의 병목 현상이 어디서 발생하는지를 분석해야 합니다. Unity의 Profiler와 Frame Debugger를 활용하여 CPU와 GPU의 부하를 확인하고, 최적화가 필요한 부분을 파악합니다.2. 덜 그리기 (Draw Call 줄이기)랜더링 성능을 높이기 위해 가장 중요한 것은 불필요한 오브젝트를 그리지 않는 것입니다.2.1 카메라 절두체 줄이기카메라의 절두체(Fustum) 크기를 조정하여 너무 멀리 있는 오브젝트를 렌더링하지 않도록 설정합니다.너무 짧게 설정하면 화면에서 갑자기 오브젝트가 사라지는..

Unity 3D 사다리 구현

사다리 시스템 작동 방식플레이어가 사다리 근처로 가면 OnTriggerEnter()가 실행되어 사다리 사용 상태로 변경플레이어가 사다리를 사용중에는 오르고 내려갈 수 있음플레이어가 사다리에서 벗어나면 OnTriggerExit()가 실행되어 다시 중력 활성화코드 구현 - 사다리 감지 및 상태 변경(Landder.cs)using System.Collections;using System.Collections.Generic;using UnityEngine;public class Landder : MonoBehaviour{ bool useLandder = false; // 사다리 사용 상태 private void Update() { if (useLandder) { ..

Unity 버프 UI 및 타이머 시스템 구현하기

게임에서 버프는 플레이어에게 엄청난 효과를 주는 기능 중 하나이다. 오늘은 아이템을 사용했을 때 버프 효과와 타이머 시스템을 구현 해보자버프 시스템 작동 방식버프 아이템을 획득 하거나 사용하면 StartBuff() 함수 실행버프 아이콘이 UI에 표시됨기존에 같은 버프가 있으면 타이머를 초기화새로운 버프라면 빈 슬롯에 등록버프 지속 시간 동안 BuffTimer() 코루틴 실행게이지 바 (fillAmout)가 줄어듦버프 만료 시 EndBuff() 실행적용했던 효과 제거UI에서 아이콘을 삭제하고 슬롯을 비움코드 구현 - 버프 UI우선 UI에서 버프 아이콘을 표시하는 Image배열을 만들어 주자public Image[] buffUI;private Coroutine[] activeBuffCoroutines;pri..

Unity 3D 점프 발사대 구현

게임에서 점프대와 발사대를 사용하면 플레이어가 가지 못하는 구역을 이동할 수 있는 수단이다. 오늘은 점프 발사대를 구현 해보자우선 점프 발사대를 구현 하기 위해 핵심 기능인 AddForce(Vector3 force, ForceMode mode)를 사용할 것 이다.AddForce(Vecter3 force, ForceMode mode)란?Unity에서 Rigidbody를 가진 객체에 물리적인 힘을 주어 오브젝트를 이동시킬 수 있는 기능이다._rigidbody.AddForce(Vector3 force, ForceMode mode);매개변수 설명Vecter3 force : 힘을 가할 방향과 크기ForceMode mode : 힘을 가하는 방식 (4가지의 방식)ForceMode.Force : 지속적인 힘을 가함 (..

Unity AI Navigation

AI Naviagtion이란우선 사전적 의미로는 AI( Artificial Intelligence )의 "인공지능"과 Naviagtion의 명사인 "배나 다른 차량의) 항해[운항/조종](술)"이 합쳐진 단어로 인공지능이 스스로 조종하여 이동한다는 의미를 가지고 있다. 주로 게임에서 캐릭터나 NPC가 스스로 이동하도록  사용하는 기능입니다. AI Naviagtion 주요 기능Navigation Mesh(네비게이션 메쉬)AI가 이동할 수 있는 역영을 나타내는 매쉬이다.아래 이미지와 같이 Layer처럼 이동할 수 있는 영역과 없는 영역을 정의하고, 이를 기반으로 경로를 계산  Pathfinding(경로 탐색)AI가 목표 위치까지 이동할 때 최적의 경로를 찾는 알고리즘이다.주로 A* 알고리즘이 사용되며, 지정된..

Unity Input System (Send Messges / Invok Unity Events 차이점)

Unity에서 플레이어를 움직이게 하는 방식은 여러가지가 있는데 그 중 하나의 방법이 Input System을 활용하여 움직이는 것이다. Input System은 사용자가 기기, 터치, 제스처를 사용하여 게임이나 앱을 제어할 수 있도록 도와주는 패키지이다. Input System에서는 입력 이벤트의 처리 방법이 4가지가 있다. 방식설명Send Messages특정 함수"OnJump()" 등를 자동으로 호출Broadcast Messages부모-자식 관계의 모든 오브젝트에서 함수 호출Invoke Unity Events"UnityEvent"를 이용한 이벤트 방식으로 호출Invoke C# EventsC# 델리게이트 이벤트를 호출 이중에 가장 많이 사용하는 "Send Messages",  "Invoke Unity ..

Unity 2D 팀 프로젝트 - 마지막 날

Untiy 2D 팀 프로젝트 궁수의 전설 래퍼런스 작품 만들기 -  마지막 날팀 프로젝트 후기오늘 팀프로젝트가 끝났다. 참으로 길다면 길었고 짧았다면 너무나 짧았던 시간이였다. 꼭 프로젝트가 끝나니 고쳐야 할 부분이 왜 이렇게 잘 보이는지..... 다른 팀들은 어찌 그렇게 잘만들 수 있는건지...... 나도 잘만들고 싶다 대략 5일동안 팀 프로젝트를 하고 나니 느낀점은 모든 팀의 기능은 비슷한데 누가 디자인을 잘하나 구조를 잘 구성하나 그 차이였던갔다. 다음 프로젝트 때는 좀더 탄탄하게 만들고 게임이라고 부를 수 있는 게임을 만드는 것이 목표 이다 작품 시연 영상

Unity 2D 팀 프로젝트 - 4

Untiy 2D 팀 프로젝트 궁수의 전설 래퍼런스 작품 만들기 -  4 오늘로 팀 프로젝트 5일차가 진행 되었다. 스킬 구현이 어느 정도 다 끝나 사운드 작업을 추가적으로 하였다. 먼저 소리를 내줄 SoundSource를 프리팹으로 만들어 주어 다른 소리와 중복으로 발생할 수 있게 만들어 주자using UnityEngine;public class SoundSource : MonoBehaviour{ private AudioSource _audioSource; public void Play(AudioClip clip, float soundEffectVolume, float soundEffectPitchVariance) { if (_audioSource == null) ..