목록Unity(유니티) (75)
Deff_Dev
유니티에서 Text UI를 개발할 때, TextMeshPro를 많이 사용한다. 이때, 텍스트의 OutLine,Underlay 등을 설정하고 싶을 때, Material에서 OutLine 등을 설정하게 된다면 모든 해당 폰트를 사용하는 모든 Text가 바뀌게 된다. 왜 그럴까 ? 기본적으로 TextMeshPro의 폰트는 Material를 공유하기 때문에 Material 값이 수정되면 해당 폰트를 쓰는 모든 텍스트들이 변하는 것이다. 그럼 폰트를 복사해서 여러개 만들면 될까 ? 기본적으로 SDF 파일은 한글 범위를 포함할 경우 용량이 크고 무겁기 때문에 게임 성능에 문제를 미칠 수 있다.(특히 모바일 게임에서는 이 문제를 필수적으로 해결해야한다.) 그렇기 때문에 텍스트의 Material를 인스턴스화하여 M..
법선 벡터 : 특정 지점에서 표면에 수직으로 뻗어 있는 벡터 법선 벡터를 이용하여 점프대를 만들어보자 위와 같이 점프대를 만들 때 법선 벡터가 왜 필요할까 ? [Range(0f,15f)][SerializeField] private float jumpPadPower; private void OnCollisionEnter(Collision other) { if (other.gameObject.CompareTag("Player")) { Rigidbody rigid = other.gameObject.GetComponent(); rigid.velocity = Vector3.zero; rigid.AddFor..
게임 개발 할 때, 가장 많이 사용하는 디자인 패턴 중 하나인 싱글톤 패턴을 사용한다고 하면 public static GameManager _Intstance; private void Awake() { _Intstance = this; } 이런식으로 많이 사용했을 것 이다. 예외 처리, 프로퍼티,DontDestroyOnLoad 설정 등을 포함한 다양한 기능을 구현할 때, 싱글톤으로 선언된 클래스가 많아진다면 긴 코드를 각각의 싱글톤으로 선언한 클래스마다 작성해줘야한다. 이 과정은 중복된 코드를 많이 생성하게 되고 유지 보수적인 측면에서도 좋지않다.(하나의 기능을 추가/삭제할 때 싱글톤으로 선언된 모든 클래스를 다 수정해야한다.) Generic Class를 이용해 이 문..
Quaternion.LookRotation(Vector3 forward, Vector3 upwards = Vector3.up) forward 방향으로 회전하는 Quaternion 값을 반환한다.여기서 upwards는 기본 값으로 Vector3.up이 사용되고 회전할 오브젝트의 y축이 바라보는 방향을 얘기한다. 위 사진처럼 upwords를 vector3.right로 설정한다면 y축이 오른쪽을 바라보도록 오브젝트를 회전시킨다. LookAt() 함수와 다른 점은 뭘까 ? LookAt() 함수는 회전하기 위해 타겟의 정보가 필요하고 Quaternion.LookRotation() 함수는 타겟 정보가 없어도 회전하고 싶은 방향 값을 알고 있다면 회전을 할 수있다.Quaternion.LookRotation()이용한..
객체지향 언어로 코딩 해봤다면 한 번쯤은 들어봤을 SOLID 원칙을 유니티를 예를 들어 설명해보겠다.SOLID 원칙이 뭘까 ?SOLID 원칙은 객체지향 설계에서 지켜야하는 5가지 원칙이다.단일 책임의 원칙 (SRP: Single Responsibility Principle)개방 폐쇄 원칙 (OCP: Open Close Principle)리스코프 치환의 원칙 (LSP: Liskov Subsitution)인터페이스 분리의 원칙 (ISP: Interface Segregation Principle)의존성 역전의 원칙 (DIP: Dependency Inversion Principle)단일 책임의 원칙 (SRP: Single Responsibility Principle)하나의 클래스는 하나의 목적을 위해 생성한다...
유니티에서 오브젝트 풀링을 구현할 때, 리스트, 딕셔너리 등을 이용해 구현을 한다. [Unity/C#] 오브젝트 풀 구현게임을 만들다보면 프리팹으로 저장된 오브젝트를 생성, 삭제해야할 경우가 생긴다. 예를 들어, 총알을 발사하는 경우를 생각해보자. 이때, 총알 프리팹을 저장한 뒤, Instantiate를 이용하여 총알deff-dev.tistory.com 유니티 자체에서 지원하는 오브젝트 풀 라이브러리에 대해 설명해보려한다.using UnityEngine.Pool; 라이브러리 선언은 위처럼 작성하면 된다. 객체 생성ObjectPool초기화 private ObjectPool pool; void Awake() { pool = new ObjectPool(createFunc, actio..
오늘 배운 내용오브젝트 풀을 이용하여 오브젝트 생성을 구현했는데, 하나의 딕셔너리로 오브젝트를 관리하고 GetComponent를 최소화하 위해 오브젝트 풀로 생성되는 각각의 클래스들이 PoolObject 클래스를 상속 받도록 설계했다. 그리고 활성화된 PoolObject 오브젝트들을 가상함수의 오버라이딩 이용하여 자식 클래스의 Init(초기화 함수)를 불러오는 방식으로 구현했다. 하지만 이 방식을 Bullet이 아닌 Enemy, Item 등 여러 오브젝트로 확장할려고할 때, 각 클래스에 필요없는 초기화함수가 존재한다는 문제가 있었다. 객체 지향적인 관점에서 바로볼 때도 옳지 못한 방법이라 생각이 들어 가상함수를 사용하지 않는 방법을 생각해봤다. 튜터님과 고민을 하다가 Generic Programming을..
게임을 만들다보면 프리팹으로 저장된 오브젝트를 생성, 삭제해야할 경우가 생긴다. 예를 들어, 총알을 발사하는 경우를 생각해보자. 이때, 총알 프리팹을 저장한 뒤, Instantiate를 이용하여 총알을 생성하고, 적이 총알에 맞았거나 총알이 카메라를 벗어났을 때 Destroy를 이용하여 발사된 총알을 삭제하게 된다. 이때, Destroy 함수를 이용하여 오브젝트를 삭제한다면, 해당 오브젝트의 메모리가 깔끔하게 전부 삭제될까 ? 정답은 '아니다' 이다. (깔끔하게 메모리가 삭제된다면 복잡하게 오브젝트 풀을 쓸 이유가 없다.) 물론 몇개만 Destroy한다고 게임에 큰 지장을 주진 않을 것이다. 하지만 프로젝트의 볼륨이 커져서, 오브젝트(Bullet, Enemy)의 생성/삭제의 빈도 수가 늘어난다면 게임 성..