Menu
CoddyTech

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 프로퍼티도 같은 방식으로 동작합니다.

challenge icon

챌린지

쉬움

썰매는 초당 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);
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 스크립팅 기초의 모든 레슨