namespace UnityGameDevelopment.Day5 {
public class Outline {
public static string Chapter1 = "컴포넌트";
public static string Chapter2 = "유니티 C# 프로그래밍 기초 4";
}
}
1. 컴포넌트
컴포넌트는 게임 오브젝트에 붙어 특정 기능을 수행하는 부품입니다.
빈 게임 오브젝트를 생성하면 트랜스폼 컴포넌트가 기본적으로 추가되어있습니다.
큐브 오브젝트는 다음과 같이 여러 컴포넌트가 포함되어 있습니다.
Transform, Mesh Filter, Mesh Renderer, Box Collider 컴포넌트가 보입니다. 이렇게 특정 목적을 위해 다양한 컴포넌트를 조합해서 게임 오브젝트를 구성할 수 있습니다.
컴포넌트 활성화 및 비활성화
컴포넌트 이름 옆에 체크 박스로 활성화 혹은 비활성화시킬 수 있습니다. 비활성화할 경우 게임 오브젝트는 월드에 존재하지만 해당 컴포넌트의 기능만 동작하지 않도록 만들어 줍니다.
트랜스폼 컴포넌트
트랜스폼(Transform) 컴포넌트는 게임 오브젝트의 위치 및 회전, 크기 정보를 가지고 있습니다. 이 정보는 모든 게임 오브젝트가 필요하므로 월드 상에 존재하는 모든 게임 오브젝트는 트랜스폼 컴포넌트를 가지고 있습니다.
메쉬 필터 컴포넌트와 메쉬
메쉬(Mesh)는 다수의 폴리곤으로 구성되어 모양과 형태를 결정하는 데이터입니다.
메쉬 필터(Mesh Filter) 컴포넌트는 메쉬 데이터를 가지고 있는 컴포넌트입니다.
메쉬 렌더러 컴포넌트
메쉬 렌더러(Mesh Renderer) 컴포넌트는 게임 오브젝트의 메쉬를 그리는 컴포넌트입니다. 메쉬를 그리기 위해 어떻게 그리는지에 대한 정보인 머티리얼을 필요로 합니다.
2. 유니티 C# 프로그래밍 기초 4
게임 오브젝트 이름 바꾸기
스크립트에 연결된 오브젝트의 이름을 변경하려면 스크립트 내에서 gameObject라는 멤버 변수에 접근해야합니다.
public class Example : MonoBehaviour
{
void Start()
{
Debug.Log(gameObject.name);
gameObject.name = "게임 오브젝트";
}
}
빈 게임 오브젝트를 생성하고 Example 스크립트를 생성해서 연결해줍니다. MonoBehaviour 클래스 내에, 컴포넌트인 자기 자신을 추가한 게임 오브젝트를 접근할 수 있는 멤버 변수 gameObject가 존재합니다. 따라서 위 코드에서의 gameObject는 전에 생성해서 스크립트와 연결한 빈 게임 오브젝트를 의미합니다. gameObject의 name에 접근하면 게임 오브젝트의 이름을 가져오거나 설정할 수 있습니다.
컴포넌트 구하기
스크립트와 연결된 게임 오브젝트가 가진 컴포넌트를 구하려면 GetComponent 함수를 사용해야 합니다.
public class Example2 : MonoBehaviour
{
void Start()
{
gameObject.GetComponent<MeshRenderer>().enabled = false;
}
}
큐브 오브젝트에 Example2 스크립트를 생성해서 연결합니다. 큐브 오브젝트에는 MeshRenderer 컴포넌트가 있는데 이를 가져오려면 위와 같이 gameObject에 GetComponent함수를 호출해야합니다. GetComponent에 MeshRenderer를 꺽쇄 괄로안에 넣어주고 소괄호를 붙입니다. MeshRenderer가 반환되기 때문에 컴포넌트의 활성화 여부를 갖고 있는 enabled 변수를 false로 바꾸어 비활성화 시켜줄 수 있습니다.
실행해보면 씬 뷰에 큐브 오브젝트는 존재하지만 렌더링은 안되는 모습을 볼 수 있습니다.
다른 오브젝트 가져오기
그렇다면 자신과 연결된 게임 오브젝트가 아니라, 다른 게임 오브젝트를 가져와서 조작하려면 어떻게 해야할까요?
public class Example3 : MonoBehaviour
{
public GameObject targetObject;
void Start()
{
targetObject.GetComponent<MeshRenderer>().enabled = false;
}
}
먼저 빈 게임 오브젝트와 큐브 오브젝트를 생성하고 빈 게임 오브젝트에 Example3 스크립트를 새로 생성하여 연결해줍니다. Example3에서 큐브 오브젝트를 가져와서 메쉬 렌더러를 비활성화해보고 싶습니다. 위와 같이 Example3 스크립트를 작성하면 인스펙터 뷰에 Target Object 라는 속성이 표시됩니다. 여기에 큐브 오브젝트를 드래그하면, 플레이 시 Example3 클래스 내 targetObject 멤버 변수에 연결됩니다.
게임 오브젝트 이동하기
public class Example4 : MonoBehaviour
{
public GameObject targetObject;
void Start()
{
targetObject.transform.position = Vector3.forward * 2;
}
}
게임 오브젝트에 Example4 스크립트를 생성하여 붙여줍니다. 큐브 오브젝트를 생성해서 이를 Example4 스크립트의 Target Object 속성에 연결해줍니다. 위 코드는 이 큐브 오브젝트의 위치를 2칸 앞으로 순간 이동시켜줍니다. gameObject의 transform 컴포넌트는 위와 같이 접근합니다. transform의 위치를 조절하려면 position을 설정하면 됩니다.
사용자 입력 받기
Input 클래스를 활용하여 사용자로부터 마우스, 키보드 입력을 받을 수 있습니다.
public class Example5 : MonoBehaviour
{
public GameObject targetObject;
void Update()
{
if (Input.GetKeyDown(KeyCode.W)) {
targetObject.transform.position += Vector3.forward;
}
}
}
Input 클래스의 GetKeyDown 함수를 이용하면 위와 같이 특정 키를 받아서 물체를 이동시킬 수 있습니다. KeyCode에서 키를 선택하여 GetKeyDown 함수의 인자로 넘길 수 있습니다.
실습 및 응용
▶ 빈 게임 오브젝트에 컴포넌트 추가해서 큐브 만들기
빈 게임 오브젝트를 생성합니다.
인스펙터 뷰에서 Add Component 버튼을 눌러 생성한 오브젝트에 메쉬 필터 컴포넌트를 추가합니다.
처음 추가하면 메쉬 데이터가 None임을 확인할 수 있습니다. 메쉬를 선택하기 위해 None이라고 쓰여진 텍스트 오른쪽에 동심원 버튼을 클릭합니다.
Assets 탭에서 Cube 메쉬를 선택합니다.
이게 메쉬를 그려주기 위해 메쉬 렌더러 컴포넌트를 추가합니다
게임 오브젝트에 메쉬 렌더러를 추가하였습니다..
씬에서 보면 마젠타 색상으로 표시되는 걸 볼 수 있습니다. 이렇게 표시되는 이유는 머티리얼을 설정해주지 않아서 그렇습니다.
다시 인스펙터 뷰로 가서 메쉬 렌더러 컴포넌트에 머티리얼 속성을 보면 아무것도 데이터가 채워져 있지 않습니다. 머티리얼도 마찬가지로 동심원 버튼을 눌러 기본 머티리얼을 선택합니다.
Default-Material을 선택합니다.
씬 뷰를 보면 큐브가 기본 머티리얼로 잘 그려진 모습을 하고 있습니다.
추가로 기본 머티리얼을 바위 재질 머티리얼로 변경해보았습니다. 금방이라도 곡괭이로 캘 수 있을 것 같습니다.
'멋쟁이사자처럼 > 유니티 게임 개발 3기' 카테고리의 다른 글
[멋쟁이사자처럼 부트캠프 TIL 회고] 유니티 게임 개발 3기 8일차 (0) | 2024.11.28 |
---|---|
[멋쟁이사자처럼 부트캠프 TIL 회고] 유니티 게임 개발 3기 7일차 (0) | 2024.11.27 |
[멋쟁이사자처럼 부트캠프 TIL 회고] 유니티 게임 개발 3기 4일차 (0) | 2024.11.22 |
[멋쟁이사자처럼 부트캠프 TIL 회고] 유니티 게임 개발 3기 3일차 (0) | 2024.11.22 |
[멋쟁이사자처럼 부트캠프 TIL 회고] 유니티 게임 개발 3기 2일차 (0) | 2024.11.22 |