
1. Unity가 제공하는 기본 타입
- AudioClip: 소리 데이터(에셋). 길이, 샘플 수를 가지며 직접 재생은 못 하고 AudioSource가 재생합니다.
- AudioSource(컴포넌트): 소리를 재생하는 플레이어. clip, Play(), PlayOneShot(), loop, volume, pitch 등을 가짐.
- Rigidbody2D(컴포넌트): 2D 물리 몸체. velocity, AddForce(), gravityScale, mass, collisionDetectionMode 등.
- Animator(컴포넌트): 애니메이션 상태머신 재생기. SetBool/SetFloat/SetTrigger, CrossFade, speed 등으로 상태 전환을 제어.
* AudioClip과 AudioSource의 차이(비유)
- AudioClip = 음악 파일 (mp3, wav)
- AudioSource = 음악 플레이어 (재생기)
2. sound를 상황(jump, die)에 따라 나오게 하는 방법
Playercontroller이라는 함수 속에
1) AudioClip 클래스를 이용하여 사망했을 때 나올 오디오를 "deathClip"이라 설정
2) AudioSound 클래스를 이용하여 플레이어에 송출될 오디오를 "playerAudio"라 설정
| public class PlayerController : MonoBehaviour { public AudioClip deathClip; private AudioSource playerAudio; } |
3) 사망 시 deathClip을 가져와서(clip) 송출되게(play) 처리
| private void Die() { playerAudio.clip = deathClip; playerAudio.Play(); isDead = true; } |
* .clip = 과 .play()는 unity Audiosource에서 제공하는 자체 클래스.
위 2)에서 AudioSource로 설정한 playerAudio 뒤에 .clip = deathClip;을 붙이면
1)에서 설정한 AudioClip인 deathClip을 가져온다는 것이고(playerAudio라는 mp3에 deathclip;을 넣고)
.Play()를 하면 playerAudio라는 mp3가 작동된다고 이해.
playerAudio는 직접 붙인 변수 이름이기에, 다른 것으로 바꿀 수 있음(enemyAudio 등)
4) 그러나 여기까지는 deathClip이 어떠한 사운드를 품고 있는지 설정되지 않았기에 설정을 따로 해야 함
(deathclip은 변수일 뿐, deathclip이 jump 사운드를 낼지, death 사운드를 낼지 아직 설정되지 않은 상태)
함수가 적용된 Hierarchy - Player 클릭 시 1)에서 지정한 Player Controller (Script)가 새로 생겨 있음.
여기에서 Death Clip을 사운드 die로 지정하면, 사망 시 die 사운드가 재생됨

5) 만약 die 처럼 특정 trigger 시 1회만 발동되는 것이 아니라, 일상적으로 계속 반복되는 jump라면
클래스를 통해 별도의 변수를 만드는 것이 아니라 inspector의 Audio Source에 기본 값으로 넣어두고,
코딩을 통해 playerAudio.Play(); 만 실행하면 기본 오디오가 실행되게 처리할 수도 있음
| private void Update() { if (Input.GetMouseButtonDown(0) && jumpCount < 2) { jumpCount++; playerRigidbody.linearVelocity = Vector2.zero; playerRigidbody.AddForce(new Vector2(0, jumpForce)); playerAudio.Play(); } |

3. Public과 Private의 차이
- public: 다른 스크립트/오브젝트에서도 접근 가능. 인스펙터에 자동 노출(직렬화 가능 타입일 때).
- private: 해당 스크립트 내부에서만 접근. 기본적으로 인스펙터에 안 보임.
예를 들어 public으로 설정한 death clip, Jump force는 inspector에서 바로 수정 가능하지만,
private로 설정한 나머지 변수들은(jumpCount 등) inspector에서 수정 불가능


4. GetComponent란?
- private Rigidbody2D playerRigidbody; = 변수를 선언만 함
- playerRigidbody = GetComponent<Rigidbody2D>(); = 내 오브젝트의 Rigidbody2D를 찾아서 변수에 넣음
- 그 뒤로는 별다른 설정 없이 자동으로 playerRigidbody로 코딩한 물리법칙 값이 Rigidbody2D에 적용됨
- 게임 시작과 동시에 자동 적용 되게 private void Start() 안에 넣어 주는 것이 중요함!

5. Velocity / Vector 란?

1) velocity는 “함수”가 아니라 *속성(property)*입니다
- 의미: 이 물체의 *현재 속도(월드 좌표, 단위/초)*를 나타내는 값이에요.
예) (5, 0)이면 매 초 오른쪽으로 5유닛 이동 중. - 읽기: 현재 이동 상태를 확인할 때 사용
- 예: 점프 꼭대기 판단 → rb.velocity.y가 **위(+→0→-)**로 바뀌는 순간
- 쓰기: 즉시 속도를 바꿔 “상태를 덮어쓰기”
- 예: 즉시 정지 → rb.velocity = Vector2.zero;
- 대시 시작 → rb.velocity = new Vector2(dashSpeed, rb.velocity.y);
- 짧은 점프 → if (rb.velocity.y > 0) rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
2) Vector2란 2D 공간의 (x, y) 값을 다루는 자료, x는 좌우, y는 위아래 움직임을 의미합니다.
2D라서 뒤에 2가 붙음. 3D면 Vector3라고 칭함.
3) Vector2.zero란 좌우상하를 (0,0)으로 만들어서 즉시 정지하도록 하는 약자
4) 새로운 Vector를 사용하는 경우 앞에 new를 붙여서 기존 Vector와 혼동되지 않게 처리할 것
6. Velocity와 AddForce의 차이
1) velocity
- Rigidbody2D의 현재 속도를 직접 지정하는 것.
- 말 그대로 “순간 이동식”으로 속도 변경
- 예시:→ 이제 물리 엔진은 이 오브젝트를 “초당 5 유닛 오른쪽으로 계속 움직인다”라고 즉시 인식. rb.velocity = new Vector2(5f, 0f);
- 특징 : 기존 속도를 무시하고 새 값으로 덮어씀 / “물리적인 힘”은 고려하지 않음 (마찰, 질량 영향 X)
- 예시 : “자동차 속도계를 직접 조작하는 것” 지금 속도를 100km/h로 딱 맞춰버림
2. AddForce
- Rigidbody2D에 힘(force) 을 가하는 것.
- 뉴턴의 법칙 F = m * a (힘 = 질량 × 가속도)에 따라, Rigidbody2D의 질량(mass), 드래그(damping), 중력(gravity) 등이 계산되어 최종 속도 변화가 일어남.
- 예시:→ Rigidbody2D의 질량이 크면 같은 힘으로는 덜 움직이고, 질량이 작으면 더 빨리 튐.
rb.AddForce(new Vector2(5f, 0f));
- 특징 : 기존 속도에 누적되어 점진적으로 변화 / 더 현실적인 물리 움직임 구현 가능
- 예시 : “자동차 페달을 밟는 것” 엔진 힘(Force)이 들어가서 질량, 마찰, 중력에 따라 서서히 가속됨
7. OnTriggerEnter2D / OnCollisionEnter2D / OnCollisionExit2D 차이

OnTriggerEnter2D, OnCollisionEnter2D, OnCollisionExit2D는 Unity가 약속해 둔 특별한 메서드(콜백 함수) 입니다.
1) OnTriggerEnter2D (사망구역, 함정이나 특정 영역 도착 시)
-
- 조건: 한쪽 Collider2D에서 Is Trigger 체크됨
- 결과: 실제 물리 충돌은 없고 “겹침 감지”만 발생
- 매개변수: Collider2D other → 충돌한 대상의 Collider2D 정보
2) OnCollisionEnter2D
- 조건: 두 오브젝트 모두 Collider2D + 최소 한쪽에 Rigidbody2D 필요
- 결과: 실제 물리 충돌 (튕기거나 멈춤)
- 매개변수: Collision2D collision → 충돌 지점(contact point), 충돌한 normal 벡터 등 자세한 정보 제공
3) OnCollisionExit 2D
- 조건: 두 오브젝트가 닿지 않았을 때
3) other.tag란?
Dead라는 tag를 가진 어떤 것과 부딪혔는지 확인
4) collision.contacts[숫자]이란?
- [숫자]는 발생한 여러 충돌 지점 중 몇 번째 접점 정보인지를 파악. 0이면 첫번째로 닿은 정보
5) normal1이란?
표면이 어느 방향을 향하고 있는지를 알려주는 화살표(법선 벡터(Normal Vector))
normal.y는 그 중에서 “위쪽을 얼마나 향하고 있는지”를 나타냅니다.
예를 들어
- 평평한 바닥 → 표면이 위를 향하고 있음 → normal = (0, 1)
- 왼쪽 벽 → 표면이 오른쪽을 향함 → normal = (1, 0)
- 천장 → 표면이 아래를 향함 → normal = (0, -1)
따라서 normal.y > 0.7f이란 접촉면이 위쪽을 70% 이상 향하고 있을 때만 → “바닥에 닿았다”라고 인정하겠다는 뜻
- 만약 옆벽에 부딪히면 normal.y는 0이므로 “바닥 아님”
- 천장에 닿으면 normal.y는 -1이므로 “바닥 아님”
- 즉, 캐릭터가 바닥에 착지했는지, 아니면 벽이나 천장에 부딪힌 건지 구분하는 기준
'✏️ 취미 > 코딩' 카테고리의 다른 글
| [공부] 2D 유니런(유니티+런) 게임 제작 - 배경 (5) (3) | 2025.08.19 |
|---|---|
| [공부] 2D 유니런(유니티+런) 게임 제작 - player 총합 (4) (3) | 2025.08.17 |
| [공부] 2D 유니런(유니티+런) 게임 제작 - (2) (3) | 2025.08.17 |
| [공부] 2D 유니런(유니티+런) 게임 제작 - (1) (3) | 2025.08.16 |
| [공부] 인프런 Rookiss님 C++ 강의 정리 및 후기 (1) (3) | 2025.08.03 |
