1. 서페이스 이펙터 2D
이대로면 스노보드가 움직이지 않기 때문에
스노보드가 중력과 마찰력에 따라 움직일 수 있도록 Surface Effector를 사용해볼 것이다.
서페이스 이펙터는 충돌 영역에 따라 힘을 추가하는 컨베이어 벨트 같은 역할을 해준다
Add Component를 이용해 Surface Effector를 추가해준 후
Edge Collider 2D에서 Used By Effector를 체크해준다

콜라이더가 여러 개 있을 수 있고, 이걸 체크해주지 않으면 어떤 콜라이더를 사용하는지
알 수 없기 때문에 꼭 체크해줘야한다
지금 상태로는 너무 느리기 때문에 Speed를 20쯤으로 조절해주면 빠르게 가는데

가끔 충돌하면 바닥으로 꺼지는데
충돌 영역에 문제가 있는 것 같으니 Collision Dectection을 Continuous로 바꿔보라하셨다...
물론 우리애는 거꾸로 가는 걸 보니 그 문제가 아닌 것 같지만 말이다
어쨌든, 오늘 배운 내용 중에
땅에 닿아있을 때만 이펙터가 작동하고, 공중에서는 작동하지 않는다는 특징이 있다
2. 회전 - Addtorque
이제 공중에서 돌게끔 설정할 차례인데, 원래 같았으면 인스펙터의 rotation을 건드렸을 것이다.
하지만 이번에는 유니티 엔진에 있는 Force를 이용해 Torque라는 회전력을 만들어볼 것이다
리지드 바디(물리 법칙 관련)에 Torque를 적용하기 위해 스크립트를 우선 만든다
Start와 Update 모두에 적용되게끔 하기 위해 중괄호 밑에 변수를 선언해준다
(여러 군데에서 접근이 필요하다면 멤버 변수?로 만들어줘야한다함)
그리고 GetComponent와 AddTorque를 사용해 코드를 작성하는데,
양쪽 방향키를 다 눌러 버그가 나는 걸 막기위해 이번에는 else if 를 사용한다
if 가 아닌 특정 키를 누르면 돌게끔 하는 것이다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] float torqueAmount = 1f;
Rigidbody2D rb2d;
// Start is called before the first frame update
void Start()
{
rb2d = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.A))
{
rb2d.AddTorque(torqueAmount);
}
else if (Input.GetKey(KeyCode.D))
{
rb2d.AddTorque(-torqueAmount);
}
}
}
강의에서는 LeftArrow랑 RightArrow를 사용하였는데 나는 우측 화살표키가 안 먹어서
A와 D로 바꾸었다
3. 실패/성공 조건 설정하기
충돌없이 골인 지점까지 들어간다면 성공이다
정확하게는 보드를 타다가 머리를 부딪히면 실패가 된다
성공 조건을 위해 FinishLine 스크립트를 만든다
그리고 만일의 경우를 대비해 플레이어만 인식하게끔 설정한다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FinishLine : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player")
{
Debug.Log("You finished!");
}
}
}
🔹 OnTriggerEnter2D란?
"부딪혔다"라는 사실만 감지할 때 씀 (예: 아이템 먹기, 적과 닿았는지 확인, 체크포인트 통과 등) |
그리고 머리 부분에 Circle Collider 2D를 넣어놨으니
Berry(캐릭터 이름임)에다가 CrashDetector를 적용해준다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CrashDetector : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Ground")
{
Debug.Log("Ouch, hit my head");
}
}
}
4. 네임스페이스 / 씬 전환
코드가 많을 수록 변수 이름이 겹치는 충돌이 일어날 확률이 많다
같은 이름을 두 개발자가 쓴다면 서로 간섭하여 문제가 일어날 것이다
그걸 방지하기 위해 네임스페이스를 사용한다
네임 스페이스는 여러 클래스를 가지고 있고, 한 클래스 안에는 여러 함수를 가지고 있다
이 네임스페이스를 사용하기 위해서는 "using"을 사용해야한다
이번에는 SceneManger를 사용해 다시 원점으로 되돌리는 것을 해볼 것이다
상단에 using UnityManager.SceneManagement;를 적고
SceneManager.LoadScene(씬의 인덱스 번호)를 사용해 씬을 처음으로 되돌린다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class FinishLine : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player")
{
SceneManager.LoadScene(0);
}
}
}
같은 방식으로 머리를 부딪히는 경우에도 돌아가게끔 하면 된다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class CrashDetector : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Ground")
{
SceneManager.LoadScene(0);
}
}
}
5. 딜레이하기 (Invoke())
Invoke와 Coroutines를 이용해서 딜레이를 줄 수 있는데, 이번에는 Invoke를 이용해볼 것이다
코드에서는 웬만하면 상수를 사용하지 않아야하기 때문에 loadDelay 변수를 만들어주고,
인스펙터에서 조절이 가능하도록 SerializeField를 해준다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class FinishLine : MonoBehaviour
{
[SerializeField] float loadDelay = 1f;
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Player")
{
Invoke("ReloadScene", loadDelay);
}
}
void ReloadScene()
{
SceneManager.LoadScene(0);
}
}
이렇게 짧은 딜레이를 만들어보았다
6. 파티클 이펙트 소개
입자 시스템은 분출기와 입자로 이루어진다
분출기는 우리가 직접 놓는 것이고(위치), 여기서 입자가 분출된다
각각의 입자는 게임 오브젝트가 아니고,
효과가 적용된 게임 오브젝트가 있고 거기에 입자 시스템 컴포넌트가 있는 것이다
그리고 컴포넌트 안에서 모듈을 사용할 수 있다
입자 각각의 Transform에는 접근할 수 없지만 분출기는 접근할 수 있다
모듈은 이펙트의 인스펙터에서 볼 수 있는데 체크되면 모듈을 사용한다는 뜻이 된다
Add Component를 사용해서 이펙트를 추가할 수 있지만, 그러면 위치를 옮기기 어려워서
Hierachy에서 직접 만드는 게 더 낫다

강의를 보며 인스펙터를 만져줬다
7. 파티클 이펙트 트리거
먼저 입자 시스템을 레퍼런스로 만들어줘야한다.
머리 부딪혔으니 뭘 하라고 유니티에게 알려주는 것이다
먼저 finishLine 스크립트에서 다음 코드를 추가한다
[SerializeField] ParticleSystem finishEffect;
인스펙터에 이펙트를 담고 있는 것을 만들기 위함이다.
이후 인스펙터에 finishEffect가 추가되면 Hierachy에서 FinishEffect를 끌어와 넣어준다
finishEffect.Play();
이제 다음 코드를 입력하기 전에 FinishEffect의 인스펙터에서 Play On Awake를 해제해준다(실행하자마자 뜨는걸 방지)
여기까지 진행하면 게임뷰에서는 안뜨지만 나는 볼 수 있는 오류가 발생하기도 한다.
이건 입자 효과가 3d뷰에서 봣을 때 Z포지션이 카메라 뒤에 있어서 그렇다
입자 효과의 z값을 전부 0으로 처리하면 된다.
'유데미 > C# Unity 2D' 카테고리의 다른 글
| Quiz Master - 1 (1강 - 6강) (0) | 2025.10.28 |
|---|---|
| Snow Boarder - 3 (42강-완) (0) | 2025.09.25 |
| Snow Boarder - 1 (29-34강) (0) | 2025.08.22 |
| Delivery Driver - 3 (21-강의 완) (3) | 2025.08.20 |
| Delivery Driver - 2 (16-20강) (2) | 2025.08.16 |