본문 바로가기

전체 글58

[유니티] #4 수박 게임 만들기 (난이도, 씬매니저) 난이도 조정 private Fruit RandomRequest(){ // 기본적으로 요청할 수 있는 최소 과일 (토마토) int baseRequestCount = 3; // completeCount가 3번 증가할 때마다 요청할 수 있는 과일 인덱스 증가 int increaseCount = Mathf.FloorToInt(NPCManager.Instance.completeCount / 3); // 요청 가능한 과일의 최대 인덱스 계산 (과일 목록 초과하지 않도록 제한) int maxRequestIndex = Mathf.Min(FruitManager.Instance.FruitList.Count, baseRequestCount + increaseCoun.. 2025. 3. 9.
[유니티] #3 수박 게임 만들기 (사운드, 애니메이션, 이펙트) 사운드 (BGM, SFX) 더 생동감 있는 게임을 위해 사운드를 추가했다. using UnityEngine;public class SoundManager : MonoBehaviour{ [Header("references")] [SerializeField] private AudioClip bgmClip; private AudioSource _audioSource; private void Start() { _audioSource ??= GetComponent(); } public void PauseBGM() { _audioSource.Pause(); } public void ResumeBGM() { _audioS.. 2025. 3. 4.
[유니티] #2 수박 게임 만들기 (UI) 수박 게임을 만들면서 NPC와 UI를 어떻게 처리해야 할지 고민했다.일단 UI를 2개의 Canvas로 분리하여 글로벌 정보(일시 정지 버튼, 골드량)와 게임 내 상호작용(터치 패드, NPC 요청 패널)을 만들었다. 글로벌 캔버스  1. GlobalCanvas (Screen Space - Overlay) 이 캔버스는 카메라와 관계없이 항상 화면 위에 렌더링 된다.항상 화면에 보여야 하는 정보를 위한 UI이므로, 다른 게임 오브젝트에 영향 받지 않고 안정적으로 노출된다.예시: 일시 정지 버튼, 현재 골드량 UI 2. Canvas (World Space)이 캔버스는 게임 월드의 일부처럼 동작하며, 게임 플레이와 직접 연관된 UI를 담는다.게임 내 상호작용이 필요한 UI이므로, 카메라에 따른 변화가 중요하다.예.. 2025. 2. 26.
[유니티] 게임 재화 저장하는 방법 : PlayerPrefs + XOR 연산, JSON + AES-256 PlayerPrefs +  XOR 연산 PlayerPrefs를 사용하여 게임 내 재화를 저장하는 방법을 구현해 보았다.이 방법은 비트 연산을 활용하여 보안 기능을 추가한 방식이다. public class GoldManager : SingleTon{ [SerializeField] private TextMeshProUGUI goldText; private int currentGold; private readonly int goldKey = 123456; // 암호화 키 public int CurrentGold { get => currentGold ^ goldKey; // 복호화 private set => currentGold = value ^ goldKey.. 2025. 2. 25.
[유니티] C#에서 여러 값을 반환하는 방법 : out, Tuple C#에서 함수가 여러 개의 값을 반환해야 할 때, out 키워드와 Tuple을 사용할 수 있다.둘 다 여러 값을 반환할 수 있지만, 방식과 사용 용도가 조금 다르다.  튜플은 가독성이 좋고 요즘 많이 사용되는 방식이라고 한다.다만 최적화가 필요한 경우 out 키워드가 더 나을 수 있다.   Out 키워드  out 키워드를 사용하면 함수 내부에서 전달된 변수를 직접 수정할 수 있다.즉, 함수가 void라도 out 키워드를 사용하면 여러 개의 값을 반환할 수 있다. 위 코드에서 Calculate 함수는 void 지만, sum과 product 값을 out을 통해 반환한다.   C# 7.0 이전 함수 호출 전에 sum과 product 변수를 미리 선언해야 했다.out 키워드는 함수 내부에서 값을 설정하지만, 변.. 2025. 2. 24.
[유니티] #1 수박 게임 만들기 (최적화) 물리 엔진을 이용한 수박 게임을 만들었다.프레임 드랍을 줄이기 위해 Instantiate와 Destroy를 오브젝트 풀로 바꾸었고,코루틴 함수도 없애고 Invoke로 바꾸었다. 중간까지는 괜찮지만 박스에 중간쯤 과일이 가득차면,과일이 제멋대로 날아가고 Merge 함수도 작동을 하지 않는다.가끔 과일이 합쳐지면서 박스 밖으로 나가기도 한다.      버벅거림이 심해지고 Merge 함수 호출이 미뤄질 때 전후 사진이다.Physics가 과도하게 CPU를 사용중인걸 볼 수 있다.  Collider 줄이기  과일 프리팹에 캡슐 콜라이더 2~3개, 폴리곤 콜라이더가 들어있었는데이걸 캡슐 콜라이더 1~2개로 줄이고 폴리곤 콜라이더도 최대한 없앴다. 과일이 박스를 꽉 채웠는데도 CPU 사용량이 아까보다 줄었다.   S.. 2025. 2. 15.
[유니티] 디자인 패턴 : 오브젝트 풀링 (Object Pooling) 오브젝트 풀링 게임에서 오브젝트를 사용할 때마다 새로 생성(instantiate)하고,삭제(Destroy)하면 성능 저하가 발생한다.이를 해결하는 방법 중 하나가 오브젝트 풀링이다. 오브젝트 풀링은 오브젝트를 필요할 때마다 생성하는 것이 아니라,미리 생성해 두고 필요할 때 가져와 사용하는 방식이다.사용이 끝난 오브젝트는 삭제하지 않고 다시 풀로 반환하여 재사용할 수 있다. 이 패턴은 게임 플레이 전에 특정 순간에 필요한 모든 오브젝트를 미리 인스턴스화해야 한다.풀은 로딩 화면과 같이 플레이어가 끊김 현상을 알아차리지 못할 적절한 시기에 활성화한다.   원리 ① 초기화 단계게임이 시작될 때 미리 여러 개의 오브젝트를 생성해서 풀에 저장 ② 사용 단계오브젝트가 필요할 때 새로 생성하는 대신 풀에서 하나를 꺼.. 2025. 2. 15.
[유니티] #18 광부 타이쿤 게임 만들기 (구름, 통화 시스템) 하늘을 떠다니는 구름이 게임을 더 생동감 있게 만들 것이다.Clouds와 CloudManaer 스크립트를 새로 만든다. Clouds 스크립트에서는 구름의 움직임을 정의하고, CloudManager에서는 게임이 시작할 때 구름이 생성되도록 한다.CloudManager에 스폰될 위치를 넣으면 Clouds의 프로퍼티에도 똑같이 들어가게 된다.이렇게 하는 이유는 구름이 프리팹으로 저장되어 있기 때문에 씬에 배치되어 있는 오브젝트의 위치값을 참조할 수 없기 때문이다.   Cloud 오브젝트를 만들고 Box Collider 2D, Rigidbody 2D, Clouds 스크립트를 추가한다.Body Type은 Kinematic으로 설정하여 물리 엔진의 영향을 받지 않도록 했다.  대부분 Dynamic을 사용했었는데 K.. 2025. 2. 8.
[유니티] #17 광부 타이쿤 게임 만들기 (샤프트 매니저 부스트) ShaftManagerLocation 스크립트를 만들고 Action을 선언한다.엘리베이터, 창고와 마찬가지로 오버라이드한 RunBoost 함수에서 호출한다.   MineManager에서 SetupManager 함수를 만들고 매개변수로 받은 값을 location에 할당한다.   Shaft 스크립트에서 변수를 만들고 Instantiate 메서드를 통해 객체를 만들고 변수에 저장한다.   Shaft 스크립트에서 _shaftManagerLocation 변수를 만들고 Start 메서드에서 초기화한다.   CreateManager 함수에서 shaftManager 변수를 통해 MineManager 스크립트를 가져오고,이를 통해 SetupManager 함수를 호출해 위치를 설정한다.   ShaftUpgrade 스크립트.. 2025. 2. 8.