Vector3는 구조체
Coddy Unity 여정의 Unity 스크립팅 기초 섹션에 포함된 레슨. 67개 중 22번째.
Vector3는 struct이며, C# 학습 과정에서 다루지 않았던 종류의 타입입니다. 구조체는 int처럼 값이며, 할당하면 전체가 복사됩니다. Vector3 b = a; b.x = 9;를 실행한 뒤에도 a.x는 바뀌지 않습니다. b가 별도의 복사본이기 때문입니다. (클래스는 반대로 동작합니다. 두 변수가 하나의 공유 객체를 참조할 수 있습니다.)
transform.position은 프로퍼티이며, 이를 읽으면 위치의 복사본을 받습니다. 따라서 transform.position.x = 0;은 즉시 버려지는 복사본을 변경하게 되므로 C#에서 컴파일을 거부합니다. 오류는 다음과 같습니다. error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. 해결 방법은 위치를 복사하고, 복사본을 변경한 다음 다시 할당하는 것입니다. 다음 러너는 Space를 누르면 가운데 레인으로 돌아옵니다.
if (Input.GetKeyDown(KeyCode.Space))
{
Vector3 p = transform.position; // 복사
p.x = 0; // 복사본을 변경
transform.position = p; // 변경한 값을 다시 할당
}마지막 줄을 빼면 코드는 컴파일되지만 아무것도 움직이지 않습니다. 복사본만 변경되기 때문입니다. transform.localScale과 다른 Vector3 프로퍼티도 같은 방식으로 동작합니다.
챌린지
쉬움썰매는 초당 fall 단위만큼 떨어지고, 방향키를 누르면 x축을 따라 움직입니다. 두 줄의 코드는 썰매가 바닥(y가 0.5보다 낮아지지 않음)에 있고 벽 사이(x가 -4부터 4까지)에 있도록 해야 하지만, 스크립트가 컴파일되지 않습니다.
Play를 눌러 오류를 확인하세요. 위치의 복사본을 사용해 두 줄을 수정하되, 각 줄의 기능은 유지한 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class Sled : MonoBehaviour
{
public float speed = 4f;
public float fall = 3f;
void Update()
{
float h = Input.GetAxisRaw("Horizontal");
transform.position += new Vector3(h * speed, -fall, 0) * Time.deltaTime;
// 썰매가 바닥 위에 있고 벽 사이를 벗어나지 않도록 합니다.
transform.position.y = Mathf.Max(transform.position.y, 0.5f);
transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.