본문 바로가기

전체 글

(61)
11월 2일 TIL FSM은 상태를 기반으로 동작을 제어하는 방식을 구현하기 위한 디자인패턴이다 FSM은 단 하나의 상태만 가지므로 상태를 기준으로 어떤 동작을 할지 결정하기 때문에 상태만 알 수 있으면 어떤 동작을 해야하는지 명확하다는 특징이 있다 FSM은 AI를 프로그래머 외의 기획자나 제3자가 쉽게 확인할 수 있고 직관적이라는 장점이 있으나 확장하기에는 어렵다는 단점이 있다
11월 1일 TIL 커스텀 에디터 GunData 스크립터블 오브젝트로 총들의 데이터를 저장하고 있는데 권총에 필요 없는 우클릭 화면 확대 배율 변수나 샷건에만 추가하는 발당 산탄수, 산탄 범위 등을 다른 총 데이터의 인스펙터에서 보이지 않게 하기 위해 사용했다 현재 사용중인 총의 각 변수들이다 샷건의 구현을 위해 산탄수와 산탄 범위를 나타내는 변수를 2개 추가했는데 이 값은 산탄총을 제외한 다른 총들엔 필요가 없기 때문에 인스펙터에서 가리고 샷건일 경우에만 인스펙터에서 접근할 수 있도록 커스텀 에디터를 적용한다
10월 31일 TIL Collision Ditection 유니티 리지드바디에서 충돌체의 충돌 감지 옵션을 설정할 수 있다 기본적으로 Discrete가 적용되어있고 이는 CPU를 가장 적게 사용하며 물리 타임스탭이 끝날때마다 연산한다 그래서 총알같이 빠른 물체가 충돌하지 않고 지나가거나 얇은 콜라이더는 뚫고 지나가는 등 터널링 현상이 발생한다 Continuous는 CPU를 더 많이 사용하지만 빠르게 움직이는 개체에서 터널링을 방지한다 마지막 물리 타임스텝에서 다음 타임스텝까지 미리 예측하고 해당 시간 동안 객체가 무엇과 충돌하는지 확인한다 하지만 충돌 대상이 고정되어 있을 때만 사용 가능하다 Continuous Dynamic: Continuous와는 달리 다른 움직이는콜라이더와의 충돌도 확인할 수 있다 CPU를 가장 많이 사용..
10월 27일 TIL ScreenPointToRay 카마라 상의 스크린의 점을 통해 레이를 반환한다 죄측 하단부터 0,0으로 시작한다 FPS에서 실제 총구의 위치 및 방향이 화면의 중앙으로 가지 않기 때문에 총알 방향을 수정하기 위해서 사용했다 카메라로부터 플레이어가 클릭한 위치로 Ray(광선)을 쏜다 현재 카메라에 보이는 화면을 관통해 뻗어나가는 광선은 지정한 길이에 도달하거나 오브젝트에 부딪히면 멈춘다 오브젝트에 부딪혀 멈추게 되면 오브젝트의 정보를 얻는다
10월 25일 TIL Raycast는 직선을 씬에 투영하여 대상에 적중되면 true를 리턴하는 물리 함수다. Raycast 함수는 캐스팅 성공 실패에 따른 결과만 리턴하는 간단한 형태에서 부터 대상과 Ray의 충돌에 관련된 자세한 정보를 리턴하는 다양한 버전이 제공 되고 있다. Raycast 함수의 핵심은 아래 세가지 정도로 요약 된다 Ray 변수 RaycastHit 변수 Raycast 함수 Ray는 직선의 시작점(origin)과 방향(direction)을 가지고 있는 단순한 구조체다. 시작점(origin)은 Vector3 타입의 월드 포지션이며 방향(direction)은 직선의 방향을 나타낼 Vector3 타입의 법선 벡터다. RaycastHit은 객체와 Ray의 충돌에 대한 결과 정보를 저장하는 구조체다. Raycast ..
10월 24일 TIL 싱글톤(singleton) 객체의 인스턴스가 하나만 생성되도록 제한하는 디자인 패턴 게임매니저 등의 인스턴스를 어플리케이션 내에서 하나만 생성하고 해당 인스턴스를 전역적으로 접근하는 메커니즘 싱글톤 사용 목적은 리소스 절약과 전역상태 관리에 있다 public class Singleton { // 인스턴스를 저장할 정적 변수 private static Singleton instance; // 다른 클래스에서 인스턴스 생성을 막기 위한 private 생성자 private Singleton() { } // 인스턴스에 접근하기 위한 메서드 public static Singleton GetInstance() { // 인스턴스가 없을 경우에만 생성 if (instance == null) { instance = ne..
10월 20일 TIL 심화 팀프로젝트 제출 과제 제출 거의 직전에 버그를 발견했다 door에서 플레이어가 충돌했을 때 물리적 충돌 처리를 무시하도록 구현한 부분이 제대로 작동하지 않았는데 ignorecollision은 충돌이 발상해기 전에 실행되어야 정상적으로 적용되는 메서드였다 oncolliderenter2d로 충돌 후 플레이어인지 확인하고 나서 충돌을 무시하도록 코드를 작성해도 의미가 없는 것이었다 그래서 레이어를 추가한 뒤 추가한 레이어와 플레이어 레이어의 물리 충돌을 비활성화 하도록 유니티 프로젝트 세팅을 변경하고 충돌 시 문의 레이어를 변경하도록 수정했다
10월 18일 TIL 맵에 스폰될 몬스터와 아이템을 관리할 스크립터블 오브젝트 생성 using UnityEngine; [CreateAssetMenu(fileName = "RoomConfig", menuName = "ScriptableObjects/RoomConfig", order = 1)] public class RoomConfig : ScriptableObject { [Range(0, 1f)] public float monsterSpawnRate; // 몬스터가 스폰될 확률 (0~1) public GameObject[] itemPrefabs; // 이 방에서 생성될 수 있는 아이템 프리팹들 // TODO: 실제 게임에서 사용할 몬스터와 아이템 클래스로 교체해야 합니다. public GameObject SpawnMonster..