* 물체를 이동시키거나 회전시키는 방법
> 첫번째. Transform 컴포넌트의 position, rotation 속성을 지속해서 변경하는 방법
> 두번째. 물리엔진(PhysX, Box2D)을 이용해 물리적인 힘 또는 회전력을 가해 변경하는 방법
1. Transform 컴포넌트의 position, rotation 속성을 지속해서 변경하는 방법
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerCtrl : MonoBehaviour
{
void Start()
{
}
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Debug.Log("h=" + h);
Debug.Log("v=" + v);
// Transform 컴포넌트의 position 속성값을 변경
// Transform 컴포넌트의 position 속성의 z축 값을 프레임마다 1씩 증가시켜 전진.
transform.position += new Vector3(0, 0, 1);
}
}
- Transform 컴포넌트의 position 속성의 Vector3(x, y, z)타입으로 생성.
- 전진 : 유니티는 왼손 좌표계임으로 +Z 축 방향
- 후진 : -Z 축 방향
- Update 함수에 코드를 작성했기에 프레임마다 실행.
- 예시 : 30fps? 1초에 30번 호출.
2. Vector3 구조체
public struct Vector3 : IEquatable<Vector3>, IFormattable
{
public const float kEpsilon = 1E-o5F;
public const float kEpsilonNormalSqrt = 1E-15F;
public float x;
public float y;
public float z;
public static Vector3 right { get; }
public static Vector3 left { get; }
public static Vector3 up { get; }
public static Vector3 back { get; }
public static Vector3 forward { get; }
}
- Vector3 구조체의 일부분 코드임.
3. 정규화 벡터
- 벡터 vector : 크기, 방향을 나타냄.
- 정규화 벡터 Nomalized Vector / 단위 벡터 Unit Vector : 각 축의 크기가 1인 벡터. 방향만 표시.
- 표1 : 방향을 가리키는 정규화 벡터
- x, y, z 축 : 이는 R, G, B 색상에 대응된다.
Vector3.forward | Vector3(0, 0, 1) |
Vector3.back | Vector3(0, 0, -1) |
Vector3.left | Vector3(-1, 0, 0) |
Vector3.right | Vector3(1, 0, 0) |
Vector3.up | Vector3(0, 1, 0) |
Vector3.down | Vector3(0, -1, 0) |
Vector3.one | Vector3(1, 1, 1) |
Vector3.zero | Vector3(0, 0, 0) |
- Vector3.forward * 1 : "전진 방향 * 속력" 이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerCtrl : MonoBehaviour
{
void Start()
{
}
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Debug.Log("h=" + h);
Debug.Log("v=" + v);
//정규화 벡터를 사용한 코드
transform.position +=Vector3.forward * 1;
}
}
4. 컴포넌트 캐시 처리
- Update 함수는 프레임마다 한 번씩 호출되므로 최적화에 주의해야함.
- 따라서, Transform 컴포넌트의 변수 transform 사용보다 미리 변수에 담아 이에 접근하는 것이 빠름.
- 컴포넌트 캐시 처리 : 스크립트에서 접근할 컴포넌트를 Start와 같은 함수에 미리 변수 할당한 후, 변수를 통해 접근.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerCtrl : MonoBehaviour
{
// 컴포넌트 캐시 처리 변수
private Transform tr;
void Start()
{
//Transform 컴포넌트를 추출해 변수에 대입
tr = GetComponent<Transform>();
}
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Debug.Log("h=" + h);
Debug.Log("v=" + v);
tr.position += Vector3.forward * 1;
}
}
- GetComponent 함수는 아래와 같이 다양하게 쓸 수 있음.
tr = GetComponent<Transform>();
tr = GetComponent("Transform") as Transform;
tr = (Transform)GetComponent(typeof(Transform));
tr = this.gameObject.GetComponent<Transform>();
5. Translate 함수
- 게임오브젝트의 이동 처리를 편하게 할 수 있는 함수
- Translate 함수의 두 번째 인자 : 게임오브젝트 이동의 월드 좌표(Space.World)기준할지, 로컬 좌표( 기준할지 결정.
void Translate(Vector3 direction, [Space relativeTo])
void Update()
{
tr.Translate(Vector3.forward * 1.0f);
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerCtrl : MonoBehaviour
{
private Transform tr;
void Start()
{
tr = GetComponent<Transform>();
}
void Update()
{
float h =Input.GetAxis("Horizontal");
float v =Input.GetAxis("Vertical");
Debug.Log("h=" + h);
Debug.Log("v=" + v);
//Translate 함수를 사용한 이동 로직
tr.Translate(Vector3.forward * 1);
}
}
'STUDY > Unity' 카테고리의 다른 글
[유니티 기초] 캐릭터의 이동(2) (0) | 2022.02.17 |
---|---|
[유니티 기초] 키보드 입력 값 받아들이기 (0) | 2022.02.17 |
유니티의 주요 이벤트 함수 (0) | 2022.02.11 |
유니티 엔진의 개발방식 (0) | 2022.02.11 |