Menu
CoddyTech

Vector3는 구조체

Coddy Unity 여정의 Unity 스크립팅 기초 섹션에 포함된 레슨. 85개 중 29번째.

Vector3는 아직 배우지 않은 종류의 타입인 구조체입니다. 구조체는 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

챌린지

쉬움

썰매의 스크립트가 컴파일되도록 수정해 바닥에 붙어 있고 벽 사이에 머물게 하세요.

  1. transform.position.y와 .x를 설정하는 두 줄을 다음 복사본으로 바꾸세요: Vector3 p = transform.position;.
  2. p.y = Mathf.Max(p.y, 0.5f);와 p.x = Mathf.Clamp(p.x, -4f, 4f);를 설정한 다음, transform.position = p;를 설정하세요.

‘플레이’를 누르세요. 썰매가 바닥에 착지하고 벽이 썰매를 멈춥니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

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);
    }
}

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

직접 연습해 보세요: Unity 플레이그라운드