전체 글70 [유니티6] Cinemachine Camera(시네머신 카메라) 1. Cinemachine 카메라 생성 먼저 Package Manager에서 Cinemachine 패키지를 설치한다. 설치가 완료되면 하이어라키 창에 Cinemachine 탭이 추가된다.Cinemachine 탭에서 Cinemachine Camera를 추가한다.추가된 오브젝트에는 Cinemachine 관련 컴포넌트가 자동으로 부착된다.Target을 플레이어 오브젝트로 설정한다.Control 옵션을 변경하면서 원하는 카메라 컨트롤 방식을 찾는다. 설정에 따라 Cinemachine이 자동으로 컴포넌트를 추가한다. Damping 값이 클수록 카메라가 부드럽게 움직이지만, 반응 속도가 느려지고 화면이 울렁거릴 수 있다.0.2 정도로 설정하면 자연스러운 카메라 움직임을 유지할 수 있다. Control을 설정.. 2025. 3. 22. [유니티] #6 수박 게임 만들기 (코루틴, 랜덤 확률, Line Renderer) 초기화 문제 해결 (코루틴) 싱글톤 인스턴스를 캐싱해두기 위해 작업을 하던 중 NullReference 오류가 발생했다.찾아본 결과 이유는 초기화 순서에 있었다. 유니티에서 게임 오브젝트의 흐름은 다음과 같은 순서로 실행된다.Awake() → OnEnable() → Start() OnEnable()에서 랜덤한 값을 업데이트하는 로직을 작성했는데,Start()에서 싱글톤 인스턴스를 초기화하는 코드를 작성했기에,싱글톤이 아직 초기화되지 않는 상태에서 접근하려 하여 NullReference 오류가 발생한 것이다. 또한 Awake 메서드에서 매니저들을 초기화하면 싱글톤으로 인해 오류가 발생한다.초기화 시점은 Awake 다음이어야 한다. private void OnEnable(){ StartCoroutine.. 2025. 3. 17. [유니티] #5 수박 게임 만들기 (업그레이드) 업그레이드 버튼 게임에서 특정 기능을 업그레이드할 때, 버튼을 클릭하여 업그레이드를 구매하는 시스템이 필요하다. using DG.Tweening;using TMPro;using UnityEngine;using UnityEngine.UI;public class UpgradeButton : MonoBehaviour{ [Header("References")] public Button button; [SerializeField] private GameObject limitPanel; [SerializeField] private GameObject purchasedPanel; [SerializeField] private LevelManager _levelManager; [Seria.. 2025. 3. 13. [유니티] #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. 이전 1 2 3 4 5 ··· 8 다음 728x90