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 속성도 같은 방식으로 작동합니다.
챌린지
쉬움썰매의 스크립트가 컴파일되도록 수정해 바닥에 붙어 있고 벽 사이에 머물게 하세요.
transform.position.y와.x를 설정하는 두 줄을 다음 복사본으로 바꾸세요:Vector3 p = transform.position;.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 플레이그라운드