목록Unity(유니티) (72)
Deff_Dev
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)의 생성/삭제의 빈도 수가 늘어난다면 게임 성..
배경 화면 무한 스크롤을 만드는 방법에 대해 포스팅하겠다. 일단 배경 화면 무한 스크롤을 만드는 방법은 크게 두 가지가 있다. (두 가지 말고 다른 방법이 있을 수 도 있다.)배경 이미지 3개를 순서대로 배치하고 위치를 최신화 시켜주는 방법Material의 Offset 값을 이용하는 방법현재 진행하는 프로젝트의 배경은 애니메이션이 들어가 있기 때문에 1번 방법을 사용해 구현해 보겠다. 스크롤하고자 하는 배경 이미지 3개를 스크롤하고자 하는 방향에 맞춰 배치한다. (이 글에서는 아래로 스크롤하겠다.) 이렇게 생성한 배경 이미지를 스크롤하는 Background Scroll Handler 스크립트를 작성하겠다.using System.Collections;using UnityEngine;public class ..
이 글에서는 게임 수학에 관한 자세한 내용은 다루지 않고 사용법과 왜 쓰는지에 대해 설명하겠다.게임 수학에 관한 자세한 설명은 다른 블로그를 찾아보면 자세하게 설명되어있으니 다른 블로그 참고하면 된다.만들어 볼 기능 위처럼 로켓(삼각형)이 바라보고 있는 방향의 부채꼴 범위 안에 들어온 오브젝트를 탐지하는 기능을 만들어보겠다. 이 글에서 설명하는 프로젝트는 2D이기 때문에 Vector2를 기준으로 설명하겠다.내적 내적은 Vector2.Dot(vector , vector)로 사용 가능하다. 그럼 내적을 왜 쓸까 ? 내적은 플레이어가 바라보는 방향과 물체의 사이 각도의 코사인 값를 구하기 위해 사용한다. Vector2.dot(오브젝트가 바라보는 방향, 타겟의 방향);이런 식으로 내적을 사용할 수 있고 내적에 ..
NPC에 가까이 갔을 때 상호 작용 키가 활성화되고 해당 키를 누르면 대화가 시작되는 기능을 만들어볼려고 한다. 이 글에서는 편의를 위해 외부 컴포넌트를 가져올 때 캐싱해서 가져온다는 것을 가정하에 모든 과정을 진행하기 때문에, 본인의 프로젝트에 맞게 적절하게 수정하면서 진행하면 된다. 그리고 카메라 줌, 텍스트 타이핑 등 디테일적인 요소 구현은 이 글에서 다루지 않았으니 참고하길 바란다.NPC 대화 저장 및 반환하는 클래스NPC 대화 내용을 저장하고 현재 대화 단계에 맞는 대화를 반환하는 DialogueData 클래스를 생성한다.[System.Serializable] public class DialogueData { private int dialogueStep = 0; // 대화 단계 public st..