게임에는 아이템, 마법진, 포탈 등 다양한 게임 오브젝트가 존재하며,
이러한 오브젝트는 플레이어와 닿으면 사용자와 상호작용을 할 수 있어야 한다.
예시로 플레이어 캐릭터를 하나 만들고 움직이는지 테스트를 해본 뒤 간단하게 구현해본다.
유니티에서 프로젝트는 3D로 프로젝트 생성한 후
Hierachy(하이어라키)에서 3D Object > Cube로 간단한 바닥 지형을 만든다.
플레이어는 간단히 Hierachy(하이어라키)에서 3D Object > Capsule 을 하나 생성해서 만들어준다.
플레이어(캡슐) 간단 구현하기
1. 플레이어는 테스트를 위해 캡슐(Capsule)로 선택한다.
+ 리지드바디(RigidBody)란?
유니티에서 GameObject가 물리적 동작을 할 수 있게 하는 컴포넌트
리지드바디는 유니티에서 필수적으로 사용되는 요소라 파악해 두면 유용하다
캡슐이 이동 중에 넘어질 수도 있으므로 Freeze Rotation의 Y값만 체크해 주자.
유니티 공식문서에서 살펴보면 큰 도움이 된다.
https://docs.unity3d.com/kr/2019.4/Manual/class-Rigidbody.html
리지드바디 - Unity 매뉴얼
Rigidbody 는 GameObject 가 물리 제어로 동작하게 합니다. 리지드바디는 힘과 토크를 받아 오브젝트가 사실적으로 움직이도록 해줍니다. 리지드바디가 포함된 모든 게임 오브젝트는 중력의 영향을
docs.unity3d.com
2. 캡슐(플레이어)를 움직이기 위해 스크립트를 생성한 뒤 플레이어 코드를 만들고 플레이어에 추가한다
주의!) C# Script 생성하고 바로 이름을 만들어줘야 된다. 생성하고 나서 이름을 바꿔주면 Unity에서 바꾸기 까다롭다.
플레이어 코드는 간단하게 키보드에서 방향키를 입력받아서 움직일 수 있도록 구현해보자!
PlayerTest.cs
public class PlayerTest : MonoBehaviour
{
[SerializeField]
private float moveSpeed = 100f;
Rigidbody myRigid;
private void Awake()
{
myRigid = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
KeyboardMove();
}
private void KeyboardMove()
{
Vector3 moveHorizontal = transform.right * Input.GetAxisRaw("Horizontal");
Vector3 moveVertical = transform.forward * Input.GetAxisRaw("Vertical");
Vector3 moveDirection = (moveHorizontal + moveVertical).normalized;
Vector3 velocity = moveDirection * moveSpeed * Time.deltaTime;
myRigid.MovePosition(transform.position + velocity);
}
}
Input.GetAxisRaw("Horizontal");
Input.GetAxisRaw("Vertical");
유니티에서는 Horizontal(수평), Vertical(수직)을 통해서 키보드의 방향키 입력이 이미 적용되어있다.
이제 Unity에서 게임 실행 시 잘 움직이는지 한번 테스트 해보자!
이벤트 영역 만들기
1. 영역 스크립트(Area.cs) 생성
잘 움직이는지 성공했다면 이번엔 영역을 담당하는 코드를 만들어 보자.
영역을 담당하는 c# 스크립트(Area.cs)를 생성하고 코드를 작성한다.
public class Area : MonoBehaviour
{
private bool isInside = false;
void Update()
{
if (isInside)
{
Debug.Log("플레이어가 들어왔습니다!");
}
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
isInside = true;
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
isInside = false;
}
}
}
영역 코드에서는 유니티에서 게임 오브젝트의 Tag 중 Player 태그에만 반응하도록 작성했다
그러므로 캡슐의 태그값을 Player로 변경해주자
2. 영역 이벤트 테스트
영역 코드가 잘 작동되는지 확인하기 위해서 간단한 테스트를 진행해 보자!
하이어라키 창에서 Create Empty를 생성하고 영역 스크립트를 넣고 Add Component로 Box Collider를 추가한다
Box Collider의 속성값에서 Is Trigger를 활성화 시킨다.
+ 콜라이더(Collider) 컴포넌트란?
콜라이더라는 충돌이라는 뜻을 가지고 있다.
즉, 물리적인 상호작용(접촉, 충돌...)의 모든것을 관리하는 컴포넌트라고 생각하면 편하다.
보이지 않는 게임 오브젝트의 충돌도 물론 관리하기에 투명한 영역에 들어오면 이벤트가 발생한다.
https://docs.unity3d.com/kr/2021.3/Manual/CollidersOverview.html
콜라이더 - Unity 매뉴얼
Collider 컴포넌트는 물리적 충돌을 위해 게임 오브젝트의 모양을 정의합니다. 보이지 않는 콜라이더는 게임 오브젝트의 메시와 완전히 똑같을 필요는 없습니다. 메시의 대략적인 근사치로도 효
docs.unity3d.com
3. 실행 테스트 결과
테스트 결과: Area 영역에만 들어올때만 실행되고 나가면 실행된다.
학습한 내용으로 활용할 수 있는 내용들
게임에서는 수많은 범위와 충돌이 존재하는데 공격의 범위, 스킬의 범위, 폭발의 범위 뿐만 아니라
특정 영역의 범위, 적 캐릭터의 인지 범위 등 눈에 보이지 않는 오브젝트에서도 범위가 존재하며
범위 내에 들어오면 충돌이 발생해 이벤트를 실행할 수 있다.
예를 들어 떨어진 아이템을 습득하는 것도 아이템 습득 범위 내에서만 습득 할 수 있거나
포탈 범위 내에 들어오면 다른 지역으로 이동 할 수 있는 것도 이 내용을 활용해서 구현할 수 있다.
'Unity > Unity 프로그래밍' 카테고리의 다른 글
[C#/Unity] try-catch를 이용해 개발 진행하기 (0) | 2025.03.25 |
---|---|
[C#/Unity] Builder 패턴을 이용해서 캐릭터 기술 만들기! (0) | 2025.03.24 |
[C#/Unity] 델리게이트(Delegate): 함수를 변수처럼! (0) | 2025.03.24 |
[Unity/프로그래밍] enum 연습: 플레이어 상태에 따라 행동 결정하기 (0) | 2025.03.22 |
[Unity] 유니티의 생명주기(Lifecycle)와 코루틴 (0) | 2025.02.05 |