[RayCast]
시작 위치에서, 설정 방향으로 Ray를 쏴서, 내가 설정한 거리 이내에서 물체 충돌 감지를 한다.
ex) 충돌 사전 감지, 상호작용, 바닥 체크, 시야 체크, 히트 스캔 등 사전 확인 용도로 사용
RaycastHit hit; //충돌 감지 여부 선언. hit 시 코드 실행, 아닐 시 null
//Physics.RayCast(시작 위치, 설정 방향, 감지할 RaycastHit, 설정 거리);
Physics.RayCast(origin, direction, out RayCastHit hit, distance)
//Ray 그리기(오브젝트 위치에서, 바라보는 앞방향으로, rayDistance만큼 빨간 광선 쏘기
Debug.DrawRay(transform.position, transform.forward * rayDistance, Color.red);
//충돌감지 여부 확인: if(충돌 시)
if (Physics.Raycast(transform.position, transform.forward, out hit, rayDistance))
//충돌한 물체의 색상 변경
hit.transform.GetComponent<MeshRenderer>().material.color = Color.red;
[RaycastAll]
RayCast가 처음 맞은 오브젝트만 검사한다면, RaycastAll은 경로상 Ray에 닿은 모든 정보를 배열로 반환.
//hits 배열에 담긴 Ray의 위치, 방향, 길이를 잡는다.
RaycastHit[] hits = Physics.RaycastAll(origin, direction, distance)
//for문 or foreach문으로 Ray와 충돌한 물체값이 담긴 hits를 모두 반환한다
foreach(RaycastHit hit in hits)
[Ray가 맞지 않을 때 체크]
- 맞추려는 오브젝트에 콜라이더가 있는지
- Ray의 방향(direction)이 옳은지
- 거리(distance)가 충분한지
- 레이어마스크(필터)가 옳게 설정 됐는지
[Tag]
오브젝트의 정보 (ex: Player, Enemy, Weapon...)
[Layer]
오브젝트의 처리 분류표, 필터링화
ex)
물리 충돌 제어: Enemy, Bullet끼리 충돌하지 않게, 특정 layer끼리 충돌 무시 기능
RayCast 필터링: Enemy만 검사하는 등 특정 layer만 검사
카메라 렌더링 분리: 미니맵 카메라는 맵만 보는 등, UI 제외 렌더링
물리 최적화: 충돌 연산이 필요없는 대상을 계산에서 제거
[LayerMask]
특정 Layer만 검사하기 위한 기능.
RayCast 등에서, 혹은 혼용해서도 많이 사용된다.
Layer는 비트 연산을 기반으로 하기에, 32개만 있으나 연산 속도가 빠르다.
Layer와 Tag조합 패턴은 많이 사용된다.
큰 그룹의 분류를 Layer로 한 뒤(Enemy 분류), 세부 역할을 Tag(Boss, Monster, Animal 등으로 구분.
using UnityEngine;
public class PlayerGun : MonoBehaviour
{
[SerializeField] private Transform cameraTransform; //트랜스폼에 카메라 넣기
[SerializeField] private float shootDistance = 50.0f;
[SerializeField] private LayerMask shootLayer; //레이어마스크
[SerializeField] private int damage = 25;
void Update()
{
if(Input.GetMouseButtonDown(0)) //0왼쪽버튼, 1오른쪽버튼, 2휠
{
Shoot();
}
}
private void Shoot()
{
RaycastHit hit;
Debug.DrawRay(
cameraTransform.position, //위치
cameraTransform.forward * shootDistance, //방향 * 거리
Color.red, //색상
0.5f); // + 활성화 시간
if(Physics.Raycast(cameraTransform.position, //시작위치
cameraTransform.forward, //보는 방향
out hit, //충돌 대상 정보를 담는 매개변수
shootDistance, //거리
shootLayer)) // + 레이어
{
if(hit.collider.TryGetComponent<Enemy>(out Enemy enemy))
{
enemy.TakeDamage(damage); //에너미 존재시 데미지 처리
}
else
{
Debug.Log("허공에 발사");
}
}
}
}
[CharacterController]
유니티에서 제공하는 캐릭터 이동용 컴포넌트. GetComponent를 통해 가져온 뒤 사용.
RigidBody 없이 이동, 벽 충돌 가능, 계단 오르기 가능, 중력 처리.
[이동 기능 비교]
RigidBody: 물리작용이 중요한 오브젝트, 물리엔진기반
캐릭터 컨트롤러: 캐릭터 이동 전용. 특성상 FPS/TPS에서 매우 자주 사용된다.
ex) characterController.Move(moveDir * moveSpeed * Time.deltaTime);
[Character Controller 설정]

Slope Limit : 오를 수 있는 최대 경사각
Step Offset : 자동으로 계단을 오르는 높이
Skin Widty : 충돌 넓이 (떨림이 있을 수 있다)
Center : 오브젝트 중심
Radius : 반지름
Height : 높이
[UI 액자 틀]
[Canvas]
Render Mode : UI 표기 위치

Screen Space - Overlay : 화면 고정
Screen Space - Camera : 카메라 기준
World Space : 월드 공간 내 배치, 상호작용 가능 (VR에서 많이 활용)
[Canvas Scaler]
UI Scale Mode : UI 해상도 결정

Constant Pixel Size (디폴트) : UI가 화면 해상도, 크기에 관계없이 동일 픽셀 크기로 유지
Scale With Screen Size: UI가 화면 크기, 해상도에 따라 자동 조정, 동일 픽셀 사이즈로 유지(해상도 대응, 비례 조정)
Constant Physical Size : 물리적 사이즈(거의 쓸 일 없음. 의료 장비, 의료 기기, 키오스크 등에 사용)
[UI (Canvas) 하이어라키]

EventSystem: 필수. UI 상호작용에 필요하다.

Image : 이미지 삽입
TextMesh : 텍스트 삽입
Panel: 여러 UI 요소들을 그룹화 해서 관리하는 컨테이너
Toggle: 토글, 체크박스
Slider: 수직바. 음량, 밝기 등 조절 기능
Scrollbar: 긴 콘텐츠를 스크롤 할 수 있는 영역 제공
Button : 버튼
Inputfield: 사용자가 입력가능한 필드
Canvas: UI 캔버스
[UI 인스펙터 설명]

Rect Transform : UI 전용 트랜스폼
Anchors : 부모 Rect Transform 범위 내 UI가 고정될 위치 지정
Pivot : UI 위치/크기/회전 중심점

Anchors Presets : 자주 쓰는 위치를 프리셋으로 모아둠
(shift: 피벗도 함께 변경 | alt: 포지션도 함께 변경 | 입력X: 앵커만 변경)
보통 shift + alt를 동시에 눌러서 씀(피벗, 포지션 둘 다 변경)
stretch : 부모크기에 맞춰서 자동으로 늘어난다.
[OverLap 계열]
범위 안의 콜라이더를 찾는다. 다양한 오버랩 계열이 있다(오버랩 박스, 오버랩 캡슐 등...)
[OverlapSphere] (구)
특정 위치를 중심으로, 구 영역 안에 들어온 콜라이더들을 한번에 찾아오는 물리 메서드.
콜라이더가 붙은 오브젝트를 감지한다.
ex) 근처 아이템 탐색(가상의 범위를 탐색하는 구를 씌운다), 플레이어 서치, 적 감지 Ai, 폭발 범위, 판정, 타워 디펜스 등
//포지션(탐색중심위치), 탐색 반지름, 반환값은 범위 안에 있는 콜라이더 배열), 레이어 마스크 선언도 가능.
Collider[]hits = Physics.OverlapSphere(position, radiius)
using UnityEngine;
public class OverLapBasic : MonoBehaviour
{
[SerializeField] private float radius = 2.0f; //범위
void Update()
{
Collider[]hits = Physics.OverlapSphere(transform.position, radius); //레이어 마스크 선언 가능
foreach(Collider hit in hits)
{
Debug.Log($"{hit.name}");
}
}
private void OnDrawGizmos()
{
Gizmos.DrawWireSphere(transform.position, radius); //센터, 반지름
}
}
[Check 계열]
True/False만 반환, 범위 안에 무엇이 있는지 체크한다. 단순하기에 오브랩 계열보다 비교적 가볍다.
ex) 플레이어 발 밑에 땅의 유무, 근처 적 유무, 점프 가능한 상태 여부
//(위치, 반지름, 레이어마스크)
ex) is Grounded = Physics.CheckSphere(groundCheck.position, checkRadius, groundLayer);
[충돌 관련 컴포넌트 정리]
1. RayCast
Ray를 쏴서 검사.
직관적, 거리 측정 가능, 어떤 오브젝트인지 알 수 있다, 충돌 정보, 법선 벡터 확인 가능
단점: 선형, 좁은 지형에선 놓칠 가능성이 있다.
2. OverLap/Check
Ray보다 넓게 검사(범위).
상세 충돌 정보를 알 수 없다(간단한 그라운드 체크 등)
둘 다 다양하게, 상황에 따라 다르게 사용한다. (플랫폼 게임 등)
Check계열은 bool 기반 확인(검사) 행위라 가볍고, OverLap계열은 물체가 충돌 영역 진입시 겹쳐지는 상태를 나타낸다.
3. Collider: 충돌, 물리연산이 필요할 때 사용
4. Trigger: 영역 트리거, 포탈, 순간이동 등에 사용
[함께 보면 좋은 내용]
[Renderer]
해당 스크립트가 연결된 게임 오브젝트의 렌더러 컴포넌트에 접근하기 위해 선언하는 변수.
myRenderer = GetComponent<Renderer>();
private Renderer currentRenderer
[Interface]
Interactable(상호작용 가능)구현. 캐릭터가 문, 아이템, NPC 등 다양한 오브젝트와 상호작용할 때 코드를 깔끔하고 유연하게 만들어준다.
1. 상호작용할 객체들이 공통적으로 구현해야 할 메서드 정의.
public interface IInteractable
{
void Interact(); //상호작용 시 실행할 동작
}
2. 인터페이스를 상속받은 객체들은 각자의 상호작용 방식을 작성한다. (ex: 문, 상자 등)
3. 플레이어는 RayCast 등을 통해 상호작용한 오브젝트가 IInteractable 인터페이스를 가졌는지 확인하고 상호작용을 실행한다.
[GetComponent]
같은 게임 오브젝트에 부착된 특정 컴포넌트(스크립트, Rigidbody, Xollider 등)를 스크립트 상에서 찾아오거나 제어할 때 사용하는 메서드
변수명 = GetComponent<컴포넌트이름>();
[GetAxis 관련 키워드 example]
mouseX = Input.GetAxis("Mouse X") * mouseSensitivity; (마우스 이동 가로축, 부드럽게(감도감지)
[Input.GetMouseButtonDown(n)]
마우스 클릭 기능 할당. 0(좌클), 1(우클), 2(휠클)
[Clamp]
범위 내의 값으로 제한(이동/회전 등)
ex) xRotation = Mathf.Clamp(xRotation, -80.0f, 80.0f); //최소 -80 ~ 최대 80도
[RaycastNonAlloc]
배열을 미리 만들고 재사용한다. 메모리 할당 없이 사용하는 RayCast.
새로 생성하는 것이 아니기에, GC 부하를 줄이고 최적화에 사용된다. 성능적인 면에선 RaycastAll보다 좋다.
계속 업데이트 해야하는 상황, 최적화가 필요한 모바일 환경 등에서 사용된다.
(가끔 한번 검사하거나 누르는건 RayCast로도 충분하다)
[OnDrawGizmos ()] //매 프레임 호출되는 기즈모
씬의 게임 오브젝트와 연관된 그래픽스. 화면 물체. 에디터의 필요 정보를 시각적으로 노출시키며, 플랫폼에 노출되지 않는다.
.color : 색 변경
ex) Gizmos.color = Color.red; //기즈모 색상을 빨강으로 변경
유니티에서 제공하는 기능은 어느 한 쪽이 우월한 것이 없다. 상호보충 관계. 상황에 맞춰서 적재적소로 사용해야 한다.
'개발일지 > Unity' 카테고리의 다른 글
| [Unity] 애니메이션 (작성중) (0) | 2026.06.02 |
|---|---|
| [Unity] Find, Coroutine (0) | 2026.05.28 |
| [Unity] Prefabs, RayCast (0) | 2026.05.26 |
| [Unity]Rigidbody, Collider (0) | 2026.05.26 |
| [Unity]이동, 회전 (0) | 2026.05.26 |