2023. 8. 14. 16:53ㆍUnity
오브젝트의 위치 읽어오기
public class Test : MonoBehaviour
{
void Start()
{
Vector3 pos;
pos = transform.position;
print(pos);
}
}
해당 오브젝트의 현재 위치를 읽어오려면 위의 코드를 사용하면 되며, x, y, z 특정 위치를 알고자 한다면 pos = transform.position.x의 형식으로 지정해 주면 된다.
오브젝트 위치 입력하기
transform은 프로퍼티 get, set을 쓰기 때문에 transform.position.x = 10; 은 오류가 발생한다. Vector3 값을 transform.position에 대입하면 된다. 아래와 같은 예시로 살펴볼 수 있다.
public class Test : MonoBehaviour
{
public struct MyTransform
{
private Vector3 _position;
public Vector3 position
{
get { return _position; }
set { _position = value; }
}
public MyTransform(int x, int y, int z)
{
_position.x = x; _position.y = y; _position.z = z;
}
void Start()
{
Vector3 vec = new Vector3(1,2,3);
MyTransform myTransform = new MyTransform();
myTransform.position = vec;
print(myTransform.position);
}
}
프로퍼티를 이용하여 position 변수에만 접근 가능하도록 하였고 MyTransform 생성자를 만들었다. 구조체 초기화를 하였고 vec 변수에 Vector3 값을 넣어 초기화 하여 구조체에 대입한다.
void Start()
{
Vector3 vec = new Vector3(10,0,0);
transfrom.position = vec;
print(transform.position);
}
오브젝트 이동하기 (한 방향)
public class Test : MonoBehaviour
{
void Start()
{
transform.position = new Vector3();
}
void Update()
{
if (Input.GetKey(KeyCode.UpArrow))
{
transform.position += new Vector3(0, 0, 0.1f);
}
}
}
이동 화살표 위쪽을 누르고 있으면 0.1f 씩 계속 전진한다.
오브젝트의 속도와 거리
void Update()
{
float dist = Time.deltaTime *2;
Vector3 pos = transform.position;
pos.x = pos.x + dist;
transform.position = pos;
}
시간(Time.deltaTime) * 속도(2) 결과로 거리 값이 나온다. 현재 위치의 x 값에 해당 거리를 더하면서 속도의 값에 따라 거리가 결정된다.
void Update()
{
Vector3 v = new Vector3(1,0,0) * Time.deltaTaime * 2
transform.position += v;
}
방향을 가지는 단위 벡터 Vector3(1,0,0)를 사용해서 표현할 수도 있다.
Vector3.right //(1,0,0)
Vector3.left //(-1,0,0)
Vector3.up //(0,1,0)
Vector3.down //(0,-1,0)
Vector3.forward //(0,0,1)
Vector3.one //(1,1,1)
Vector3.zero //(0,0,0)
기본 벡터는 유니티에서 지원하고 있다.
void Update()
{
transform.position += Vector3.right * Time.deltaTime * 2;
}
transform.Translate
void Update()
{
transform.Translate(Vector3.right * Time.deltaTime * 2);
}
한 프레임 당 이동한 거리 값을 Translate에 입력한다. 위의 예시들과 동일하게 작동한다.
오브젝트의 이동 (4방향)
void Update()
{
if (Input.GetKey(KeyCode.UpArrow))
{
transform.Translate(Vector3.forward * Time.deltaTime * speed);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Translate(Vector3.left * Time.deltaTime * speed);
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.Translate(Vector3.right * Time.deltaTime * speed);
}
if (Input.GetKey(KeyCode.DownArrow))
{
transform.Translate(Vector3.back * Time.deltaTime * speed);
}
}
종합하면 위와 같이 네 방향으로 이동하는 오브젝트 스크립트를 만들 수 있다. 하지만 대각선으로 움직일 때 두 개의 if문이 실행되면서 한 방향으로 움직일 때보다 빠르게 오브젝트가 이동하는 것을 볼 수 있다. 여기서 단위벡터가 필요하다.
45도 대각선으로 갈 때 좌표 평면 기준으로 (1, 1) 만큼이 아닌 (0.707, 0.707) 만큼만 가야한다.
오브젝트의 이동 (4방향) + normalized
public class Test : MonoBehaviour
{
public float speed = 2;
void Start()
{
transform.position = new Vector3();
}
void Update()
{
Vector3 dir = Vector3.zero;
if (Input.GetKey(KeyCode.UpArrow))
{
dir += Vector3.forward;
}
if (Input.GetKey(KeyCode.LeftArrow))
{
dir += Vector3.left;
}
if (Input.GetKey(KeyCode.RightArrow))
{
dir += Vector3.right;
}
if (Input.GetKey(KeyCode.DownArrow))
{
dir += Vector3.back;
}
transform.Translate(dir.normalized * speed * Time.deltaTime);
}
}
벡터를 단위 벡터화 하는 normalized를 이용하여 대각선 움직임에도 같은 속도를 유지하도록 설정하였다.
'Unity' 카테고리의 다른 글
[Unity] 오브젝트 통과와 충돌, 제거(Collider / Rigid Body / Destroy) (0) | 2023.08.17 |
---|---|
[Unity] GameObject.Find (0) | 2023.08.16 |
[Unity] 변수를 보호하는 방법(캡슐화) - 접근 제한자 / 프로퍼티 (0) | 2023.08.14 |
[Unity] Generic 문법 / GetComponent로 오브젝트 색깔 바꾸기 (0) | 2023.08.14 |
[Unity] Enum / 키보드 입력(GetKey, GetButton) / 마우스 입력(GetMouseButton, 마우스 이벤트) (0) | 2023.08.11 |