-
[Unity]유니티 입문하기 6-1(오브젝트 활성화/비활성화, 위치 조정)프로그래밍 2023. 8. 1. 19:13
이전 글을 끝으로 C#의 기본은 끝냈습니다.
이젠 스크립트로 오브젝트를 움직이고, 속성을 변경하는 등의 조작을 가하는 법에 대해서 알아보겠습니다.

일단 앞서 C#을 배울 때 PlayerController 스크립트로 여러 가지 실험을 해 봤으므로, 삭제한 뒤 다시 새로 만들어 연결해 주었고, 상하좌우 움직임을 만든 뒤엔 총알도 발사해 볼 것이므로 오브젝트도 비행기로 바꾸어봤습니다.
혹시 이런 스프라이트를 만들거나 찾기 귀찮으시다면 그냥 'Knob' 라는 이름의 스프라이트를 고르시면 원 이미지가 씌워집니다.
만약 스크립트를 생성하고 연결하시는 법을 모르신다면, 이 글에서 확인하실 수 있습니다.
gameObject.SetActive() - 오브젝트 활성화와 비활성화
오브젝트를 만들어서 스프라이트를 씌우고 스크립트까지 연결했다면, 가장 기본적인 오브젝트 활성화 / 비활성화부터 시작해봅시다.
스크립트에서 프로젝트 내에 존재하는 오브젝트에 접근하기 위해서는 gameObject 키워드를 사용합니다.
gameObject를 통해 오브젝트의 활성화 여부를 조작할 때 우리는 SetActive() 메서드를 이용하는데요,
SetActive 메서드는 오브젝트의 활성화 여부를 바꿔주는 메서드로, bool(true / fasle) 값을 입력받아 true가 입력되면 해당 오브젝트를 활성화시켜주고, false가 입력되면 해당 오브젝트를 비활성화시킵니다.

그러니 위와 같이 코드를 작성한 뒤에 게임을 테스트해 보면...

이렇게, 게임 화면상에서 오브젝트가 사라지게 됩니다. 오브젝트가 단순히 보이지 않게 된 것이 아니라 비활성화된 것으로, 화면에 로딩이 되지도 않고, 다시 활성화시키기 전까지는 다른 오브젝트와 영향을 주고받지 않습니다.

이 상태에서 하이어라키 창을 보면 Player Object의 이름이 흐려진 것을 볼 수 있으며,

인스펙터 창을 보면 이름 옆의 체크표시가 해제되어 있는 것을 볼 수 있습니다.
반대로 해당 메서드의 입력값을 true로 바꾸면 게임 화면에 오브젝트가 보이고, 하이어라키 창에서 이름이 진해지며, 인스펙터 창의 이름 옆의 체크박스가 체크표시가 됩니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { // Start is called before the first frame update void Start() { bool a = true; bool b = false; gameObject.SetActive(a && b); } // Update is called once per frame void Update() { } }저번 글에서 배운 논리 연산자와 결합해 다음과 같은 코드를 짜게 된다면, a와 b의 값에 따라 활성화 상태를 조절할 수 있습니다. a && b 말고도 a || b나, !a, !b등도 실험해 보도록 합시다.
transform.position - 오브젝트 위치 변경
이번에는 오브젝트의 위치를 변경해 봅시다.

오브젝트의 위치는 트랜스폼(Transform) 컴포넌트에 저장이 되는데요, 저번에 인스펙터 창을 살펴볼 때 트랜스폼 컴포넌트의 값을 바꿔 오브젝트의 위치를 변경한 적이 있었습니다.
따라서 스트립트를 통해 오브젝트의 위치를 변경하고자 한다면, 스크립트에서 트랜스폼 컴포넌트에 접근할 필요가 있습니다.
스크립트에서 오브젝트에 접근할 때 gameObject 키워드를 이용했던 것처럼, 스크립트에서 트랜스폼 컴포넌트에 접근할 때에는 transform키워드를 이용하게 됩니다.
트랜스폼 컴포넌트에서 위치의 값은 transform 안에서도 position에 저장되어 있는데요, 따라서 스크립트를 통해서 오브젝트의 위치를 바꾸고자 한다면 transform.position의 값을 변경하면 됩니다.
이때 주의해야 할 점이 있는데, 오브젝트의 위치는 x, y, z의 3개의 값을 가지므로 transform.position에 대입하는 값은 Vector3로 표현되어야 합니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { // Start is called before the first frame update void Start() { transform.position = Vector3.one; } // Update is called once per frame void Update() { } }위와 같이 코드를 작성하고 실행하게 되면, 화면의 어느 부분에 오브젝트를 놓아두고 실행하든 Vector3.one이 의미하는 (1, 1, 1)의 위치로 이동하게 됩니다.
벡터나 Vector3에 대해서 잘 모르겠다면 당장은 x, y, z의 좌표를 표현하기 위한 값이라고만 이해해 두면 됩니다.
위에서 사용한 Vector3.one은 기본적으로 Vector3에 내장되어 있는 값으로, 이 외에도 Vector3.zero (=(0, 0, 0)),
Vector3.up(=(0, 1, 0)), Vector3.down(=(0, -1, 0)), Vector3.right(=(1, 0, 0)), Vector3.left(=(-1, 0, 0)),
등의 값이 미리 준비되어 있습니다.
물론 이렇게 미리 준비된 Vector 값으로 오브젝트를 이동시킬 수도 있겠지만, 현재 오브젝트의 위치를 기준으로 원하는 만큼 이동하는 것도 물론 가능합니다.

먼저, Start() 메서드에서 newPos라는 이름의 Vector2 변수를 선언하고, 현재 오브젝트의 위치값을 담아주도록 하겠습니다.
Vector3가 x, y, z의 3개의 값을 담았던 것과 마찬가지로, Vector2는 x, y 두 개의 값을 담으며, 2차원에서 위치를 나타낼 때 주로 사용됩니다.

현재 오브젝트의 위치를 newPos에 담았다면, newPos의 x값에 5를 더해준 뒤 이를 다시 transform.positon에 담아줍시다.
(Vector2나 Vector3 형태의 값에서 x, y, z값에 따로따로 접근하기 위해서는 .x, .y, .z를 이용하면 된다는 것도 알 수 있겠죠.)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { // Start is called before the first frame update void Start() { Vector2 newPos = transform.position; newPos.x = newPos.x + 5; transform.position = newPos; } // Update is called once per frame void Update() { } }이렇게 코드를 작성한 뒤 실행해 보면...

이렇게 이번에는 원래 있던 곳을 기준으로 오른쪽으로 이동한 것을 확인할 수 있습니다.
다음에는 이번 글에서 배운 것을 응용하여, 키 입력을 받았을 때 이동하는 것을 구현해 보겠습니다.
'프로그래밍' 카테고리의 다른 글
[Unity]유니티 입문하기 6-3(투사체 발사) (0) 2023.08.02 [Unity]유니티 입문하기 6-2(키 입력, 이동 구현) (0) 2023.08.02 [Unity]유니티 입문하기 5-5(C# 기초개념 - 제어문) (0) 2023.07.28 [Unity]유니티 입문하기 5-4(C# 기초개념 - 연산자 심화) (1) 2023.07.27 [Unity]유니티 입문하기 5-3(C# 기초개념 - 형변환, 배열) (0) 2023.07.27
