오늘 공부한 내용
- 유니티 1주차 강의 수강
충돌 처리
오브젝트의 색상 변경
리소스 로드
싱글톤
시간 처리
- InvokeRepeating()
- 게임 초기화 및 다시시작
충돌 처리
각각의 오브젝트 마다 tag를 설정해줄수 있다.
tag는 오브젝트의 그룹을 구분할때 사용한다.
using UnityEngine;
void OnCollisionEnter2D(Collision2D coll){
if (coll.gameObject.tag == "ground") Destroy(gameObject);
}
OnCollisionEnter2D는 유니티의 내장함수로 오브젝트 간의 충돌이 발생할떄 실행된다.
우리는 이 함수를 오버라이딩
해서 충돌시 우리가 원하는 동작이 발생하게할 수 있다.
Collision2D coll
현재 오브젝트와 충돌한 다른 오브젝트의 Collision2D 컴포넌트를 매개변수로 받는다.
coll.gameObject
는 컴포넌트.gameObject
의 형태로 해당 컴포넌트와 연결된 gameObject에 접근할 수 있다.
그냥 gameObject는 현재 오브젝트를 의미한다.
gameObject.tag
를 통해 해당 오브젝트의 태그 속성에 접근할 수 있다.
색상 변경
using UnityEngine;
GetComponent<SpriteRenderer>().color = new Color(100/ 255f, 100/ 255f, 255/255f, 255/255f);
현재 오브젝트의 SpriteRenderer
컴포넌트를 가오고 color 속성을 변경해주는 코드이다.
rgb코드를 지정할떄는 255f로 나누어주어야한다. 왜?
Color 클래스의 생성자를 사용해서 RGB값과 알파(투명도)를 설정할 때는 0~1사이의 값을 지정해야 한다.
그런데 RGB값은 0~255범위의 값을 갖기 때문에 원하는 RGB색상의 값을 255f로 나누어주어 0~1사이의 값으로 변환해 주어야 된다.
Prefab 로드
강의에서는 Prefab을 변수를 생성해서 드래그 앤 드롭 방식
으로 로드 하는 방법을 알려주었는데
전에 다른 강의를 봤을떄 Resources.Load
함수를 사용했던 것이 기억이 나서 둘의 장단점이 뭔지 알고 싶어서 추가로 찾아보았다
그리고 Addressable Asset System
이라는 새로운 방법도 알게되어서 Addressable Asset System이 뭔지에 대해서도 정리했는데
다음에 추가로 Addressable Asset System를 어떤식으로 사용하는지 까지 공부해 볼 생각이다.
정리 : (Unity Prefab, 리소스 로드 방법)
싱글톤
게임의 전반적인 정보를 gameManager로 관리한다면 게임의 시작부터 끝까지 gameManager 오브젝트는 하나만 존재해야한다
.
싱글톤은 소프트웨어 디자인 패턴중 하나로 클래스 내부에 해당 클래스의 인스턴스를 전역으로 생성해
해당 클래스의 인스턴스가 하나만 존재
할 수 있도록 만드는 방법이다.
제공된 코드는 싱글톤의 개념을 정말 간단하게 소개한거 같아서 추가로 자료를 찾아 보완했다.
using UnityEngine;
static GameManager instance;
public static GameManager Instance
// GamaManager의 인스턴스는 GamaManager.Instance를 통해서 접근할 수 있다.
{
get
{
if (instance == null)
{
instance = FindObjectOfType<GameManager>(); ;
// 아직 instance가 null이라면 씬에서 GameManager 오브젝트를 찾아서 할당
}
return instance;
}
}
void Awake()
{
if (instance != null && instance != this)
// 이미 인스턴스가 존재하는데 그게 현재 오브젝트가 아니라면
{
Destroy(gameObject);
// 현재 오브젝트를 삭제한다.
return;
}
instance = this;
//DontDestroyOnLoad(gameObject);
// DontDestroyOnLoad가 있을경우 씬을 다시 로드해서 게임을 다시 시작할 떄 오류가 발생
}
이미 인스턴스가 있는지 확인하고 혹시 인스턴스가 2개가 생성되면 삭제하는 코드들을 추가해 싱글톤 패턴으로 구현했다.
시간 처리
limit -= Time.deltaTime;
if (limit < 0)
{
Time.timeScale = 0.0f;
limit = 0.0f;
}
timeText.text = limit.ToString("N2"); // N2는 소숫점 둘째자리 까지만 변환하겠다는 뜻
Time.deltaTime
프레임간의 시간 간격을 나타내는 변수
게임의 fps(프레임 레이트)에 따라 달라진다.
오브젝트의 동작 속도에 Time.deltaTime을 곱해주는 것으로
fps가 변해도 일정하게 움직이도록 할 수 있다
.
Time.timeScale
게임 시간의 스케일을 조정하는 변수로 모든 시간 관련 값에 영향
을 끼친다.
기본값은 1.0이고 값을 조정하여 슬로우 모션 빠른 모션등의 연출을 할 수 있다.
0이 라면 게임이 멈추게 된다 !
InvokeRepeating()
using UnityEngine;
InvokeRepeating("makeRain", 0, 0.5f);
일정 시간마다 함수를 실행시킨다.
- 첫 번째 매개변수 : 실행할 함수
- 두 번째 매개변수 : 처음 호출까지의 대기시간
- 세 번째 매개변수 : 반복주기
다시 시작
게임을 다시 처음부터 시작하려면 해당 씬을 다시 불러오면된다.
using UnityEngine.SceneManagement;
public void retry(){
SceneManager.LoadScene("MainScene");
}