[2D] 플라피 버드
무한 맵 기능 만들기

private SpriteRenderer sp;
// SpriteRenderer 타입의 변수로, 현재 게임 오브젝트의 SpriteRenderer 컴포넌트를 참조.
public float offsetSpeed = 0.5f;
// 텍스처 오프셋이 이동하는 속도(offsetSpeed) 를 실수값인 0.5로 설정.
접근제한자가 public 이기 때문에, Inspector 창에서 수치를 조절 가능.
void Start(){ sp = GetComponent<SpriteRenderer>();}
// 하기의 코드가 게임이 시작될 때 한번만 실행되어야 하기 때문에 Start 함수를 사용.
GetComponent<SpriteRenderer>()를 사용하여 현재 오브젝트의
SpriteRenderer 컴포넌트를 가져와 sp 변수에 저장
void Update()
// 하기의 코드가 프레임마다 실행되어야 하기 때문에, UpDate 함수를 사용
float offsetVal = offsetSpeed * Time.deltaTime;
// offsetSpeed에 Time.deltaTime을 곱해 프레임 시간에 비례한 움직임 속도를 계산.
그 후에, 계산한 값을 offsetVal 에 할당.
sp.material.SetTextureOffset
("_MainTex", sp.material.mainTextureOffset + new Vector2(offsetVal, 0f));
// 현재 텍스처의 오프셋 값을 가져오고( sp.material.SetTextureOffset ),
현재 메인 텍스처의 오프셋 값에( sp.material.mainTextureOffset )
new Vector2(offsetVal, 0f) 을 더한값은 _MainTex 에 할당.
(new Vector2(offsetVal, 0f) 은 y값이 0 이기 때문에, x축( offsetVal) 값으로만 이동)
** 이 스크립트를 각 배경 오브젝트(4개)에 적용을 시키면, 캐릭터는 가만히 움직이고 있지만
배경이 텍스쳐기 움직여서, 캐릭터가 이동하는 것처럼 부여질 수 있음
무한 파이프 이동 기능 만들기

public enum PIPE_TYPE { TOP = 0, BOTTOM, ALL }
// PIPE_TYPE는 열거형(enum)으로, 파이프의 유형을 정의.
TOP 은 1, BOTTOM은 2, ALL은 3 으로 설정 { TOP = 0, BOTTOM, ALL }
(열거형은 접근제한자로 Public 을 자주 사용함)
public PIPE_TYPE pipeType;
// pipeType은 PIPE_TYPE 열거형 타입의 변수.
public 이기 때문에, Inspector 창에서 파이프 유형을 선택할 수 있음
( TOP, BOTTOM, ALL 중 1개 선택가능)
public GameObject[] pipes;
// pipes는 GameObject 배열로, 여러 개의 게임 오브젝트(파이프들)를 저장할 수 있음.
public 이기 때문에, Inspector 창에서 파이프 오브젝트를을 할당할 수 있음.
public float pipeSpeed = 10f;
// pipeSpeed 는 pipe 라는 Speed 의 초기값을 10으로 설정.
public 이기 때문에, Inspector 창에서 수치를 재조정 할 수 있음.
void Start(){ RandomPipeType();}
// 하기의 코드가 게임이 시작될 때 한번만 실행되어야 하기 때문에 Start 함수를 사용.
RandomPipeType() 함수를 실행.
void Update()
// 하기의 코드가 프레임마다 실행되어야 하기 때문에, UpDate 함수를 사용.
foreach (GameObject pipe in pipes)
// pipes 라는 배열이나 리스트에 있는 모든 파이프(GameObject)를 반복하며 처리.
pipe.transform.position -= Vector3.right * pipeSpeed * Time.deltaTime;
// pipe 의 현재 위치에( .transform.position) 에, Vector3.right * pipeSpeed * Time.deltaTime
의 값을 뺌. 그리고 그 값을 저장함
(현재위치에서 해당값을 뺏음으로, -x 축으로 이동(Vector3.left) 함)
if (pipe.transform.position.x <= -10f)
// 만약 pipe 의 x 축의 현재 위치가(pipe.transform.position.x) -10f 보다 작거나 같다면,
if 문이 true 가 되어 하기의 코드를 실행.
RandomPipeType();
pipe.transform.position =
new Vector3(10f, pipe.transform.position.y, pipe.transform.position.z);
// RandomPipeType() 함수를 실행.
// 실행한 후에 pipe 의 현재 위치에( .transform.position) x 축으로만 10f 이동시키는 값을
적용.(new Vector3(10f, pipe.transform.position.y, pipe.transform.position.z))
(pipe.transform.position.y, pipe.transform.position.z 를 사용함으로서, y,z 축은
이동하지 않는다는것을 선언)
파이프 랜덤 타입 만들기

private void RandomPipeType()
// RandomPipeType() 의 함수를 실행(실행은 Start 함수에서 실행)
int ranInt = Random.Range(0, 3);
// 정수값의 0부터 3 미만의 값을 랜덤으로 반환(Random.Range(0, 3)).
해당 값을 ranInt 라는 변수값에 저장.
pipeType = (PIPE_TYPE)ranInt;
// 반환된 값(ranInt)을 열거형(ENUM)인 PIPE_TYPE로 변환해서,
pipeType 에 할당.
if (pipeType == PIPE_TYPE.TOP)
// 만약, pipeType 이 PIPE_TYPE.TOP(배열0번) 이라면, if 문이 true 가 되어
하기의 코드를 실행
pipes[0].SetActive(true);
pipes[1].SetActive(false);
// pipes[0], 즉 Inspector 상의 Element 0 번에 있는 오브젝트를 활성화(SetActive(true)).
// pipes[1], 즉 Inspector 상의 Element 1 번에 있는 오브젝트를 비활성화(SetActive(false)).
else if (pipeType == PIPE_TYPE.BOTTOM)
// pipeType 이 PIPE_TYPE.TOP 이 아니고, PIPE_TYPE.BOTTOM 이라면
else if 문이 true 가 되어 하기의 코드를 실행
pipes[0].SetActive(false);
pipes[1].SetActive(true);
// pipes[0], 즉 Inspector 상의 Element 0 번에 있는 오브젝트를 비활성화(SetActive(false)).
// pipes[1], 즉 Inspector 상의 Element 1 번에 있는 오브젝트를 활성화(SetActive(true)).
else if (pipeType == PIPE_TYPE.ALL)
// pipeType 이 PIPE_TYPE.TOP 이 아니고, PIPE_TYPE. ALL 이라면
else if 문이 true 가 되어 하기의 코드를 실행
pipes[0].SetActive(true);
pipes[1].SetActive(true);
// pipes[0], 즉 Inspector 상의 Element 0 번에 있는 오브젝트를 활성화(SetActive(true)).
// pipes[1], 즉 Inspector 상의 Element 1 번에 있는 오브젝트를 활성화(SetActive(true)).
float ranFloat = Random.Range(-3f, 2f)
// 실수값의 -3부터 2 이하의 값을 랜덤으로 반환( Random.Range(-3f, 2f ).
해당 값을 ranFloat 라는 변수값에 저장.
transform.position =
new Vector3(transform.position.x, ranFloat, transform.position.z);
// 오브젝트의 현재위치에(transform.position), y값(ranFloat) 만 적용시켜서, 위치를 변동시킴.
(transform.position.x, transform.position.z 를 선언함으로서, x,z 축은
이동하지 않는다는것을 선언)
오브젝트에 사운드 관련 기능 추가하기

private AudioSource audioSource;
// AudioSource 의 변수로 audioSource 을 할당함. 후에, audioSource 로 AudioSource 에 접근이 가능.
public AudioClip[] clips;
// 오디오 클립 배열(AudioClip[ ])로, 재생할 여러 개의 소리를 저장할 수 있음. 변수로는 clips 를 할당.
public 이기 때문에, Inspector 창에서 AudioClip 타입의 변수를 설정가능함.
private void Start()
// 게임이 시작할 때 한번만 실행해야하는 코드를 실행하기 위해 사용.
audioSource = GetComponent<AudioSource>();
OnIntroBGM();
// AudioSource 컴포넌트를 가져와서, audioSource 에 할당.
// 그 후에, OnIntroBGM() 이라는 함수를 실행.

public void OnIntroBGM()
// OnIntroBGM() 이라는 함수를 실행. public 이기 때문에
다른 클래스에서 이 클래스에 접근할 수 있음.
audioSource.clip = clips[0];
audioSource.loop = true;
audioSource.Play();
// audioSource.clip 의 0번자리(Inspector 상의 Element 0) 에 있는 클립 설정.
// 해당 클립의 루프(반복재생할지 안할지) 를 true 로 함으로서,
계속해서 클립이 재생됨
// 해당 오디오 클립을 재생.
public void OnMainBGM()
// OnMainBGM() 이라는 함수를 실행. public 이기 때문에
다른 클래스에서 이 클래스에 접근할 수 있음.
audioSource.clip = clips[1];
audioSource.loop = true;
audioSource.Play();
// audioSource.clip 의 1번자리(Inspector 상의 Element 1) 에 있는 클립 설정.
// 해당 클립의 루프(반복재생할지 안할지) 를 true 로 함으로서,
계속해서 클립이 재생됨
// 해당 오디오 클립을 재생.
public void OnJumpBGM()
// OnJumpBGM() 이라는 함수를 실행. public 이기 때문에
다른 클래스에서 이 클래스에 접근할 수 있음.
audioSource.PlayOneShot(clips[2]);
// audioSource.clip 의 2번자리(Inspector 상의 Element 2) 에 있는 클립을 실행.
( PlayOneShot 함수를 사용했기 때문에, 현재 재생 중인 배경음악을 중단하지 않음.)
public void OnCollisionSound()
// OnCollisionSound() 라는 함수를 실행. public 이기 때문에
다른 클래스에서 이 클래스에 접근할 수 있음.
audioSource.PlayOneShot(clips[3]);
// audioSource.clip 의 3번자리(Inspector 상의 Element 3) 에 있는 클립을 실행.
( PlayOneShot 함수를 사용했기 때문에, 현재 재생 중인 배경음악을 중단하지 않음.)
충돌시 진행되는 파이프 이벤트

public GameObject endUI;
// endUI 를 GameObject 의 변수로 할당.
public 이기 때문에 Inspector 창에서 GameObject 타입의 변수를 할당가능.
public SoundManager soundManager;
// soundManager 를 SoundManager 의 변수로 할당.
public 이기 때문에 Inspector 창에서 SoundManager 타입의 변수를 할당가능.
public void OnTriggerEnter2D(Collider2D collision)
// 오브젝트와 충돌이 발생했을 때 실행되는 메서드
( collision은 Collision2D 타입의 매개변수 변수 이름으로, 충돌 발생 시 전달되는 객체)
( Unity의 물리 엔진에서 충돌 이벤트를 처리하기 위해 전달되는 파라미터)
if (collision.CompareTag("Player"))
// 만약 충돌한 오브젝트의 태그가 "Player" 라면 if 문이 true 가 되어 하기의 코드를 실행.
soundManager.OnCollisionSound();
endUI.SetActive(true);
Debug.Log("Game Over");
// OnCollisionSound() 함수를 실행.
// endUI 의 오브젝트를 활성화(SetActive(true)) 시킴.
// 콘솔창에 "Game Over" 라는 로그를 생성.
'게임 개발(유니티) > 멋쟁이 사자처럼 3기_회고록' 카테고리의 다른 글
| [멋쟁이사자처럼 유니티 TIL] 2024_12_03(화) 강의 요약 및 정리(1) (0) | 2024.12.03 |
|---|---|
| [멋쟁이사자처럼 유니티 TIL] 2024_12_02(월) 강의 요약 및 정리 (0) | 2024.12.02 |
| [멋쟁이사자처럼 유니티 TIL] 2024_11_28(목) 강의 요약 및 정리 (0) | 2024.12.01 |
| [멋쟁이사자처럼 유니티 TIL] 2024_11_27(수) 강의 요약 및 정리 (0) | 2024.11.28 |
| [멋쟁이사자처럼 유니티 TIL] 2024_11_26(화) 강의 요약 및 정리 (0) | 2024.11.27 |