먼저 알아야 하는 정보

대표적인 이동방식은 tranform을 조작하거나 rigidbody를 조작하여 이동을 처리한다. 애니메이션 이동도 있음

  • tranform 이동 예시
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    private float   moveSpeed = 2.0f;
    private Vector3 moveDir = Vector3.zero;

    private void Update() {

        float x = Input.GetAxisRaw("Horizontal");
        float y = Input.GetAxisRaw("Vertical");

        moveDir = new Vector3(x, y, 0);

        transform.position += moveDir * moveSpeed * Time.deltaTime;
    }
}
  • rigidbody 이동 예시
using UnityEngine;

public class PlayerCtrl : MonoBehaviour
{
    private float   moveSpeed = 2.0f;
    private Vector3 moveDir = Vector3.zero;
    private Rigidbody2D rigidbody2D;

    private void Awake() {
        rigidbody2D = GetComponent<Rigidbody2D>();
    }

    private void Update() {

        float x = Input.GetAxisRaw("Horizontal");
        float y = Input.GetAxisRaw("Vertical");

        rigidbody2D.velocity = new Vector3(x, y, 0) * moveSpeed;
    }
}

Time클래스 정보
Rigidbody 컴포넌트 정보

Transform

Transform클래스를 설명하기 앞서 Transform != transform은 같지않다.!

이 부분이 헷갈릴 수 있는게 모든 유니티 상 오브젝트는 Transform컴포넌트가 있으며 절대 삭제할 수 없다.

따라서 스크립트 상에서도 존재의 유무가 확실하기 때문에 따로 불러올 필요 없이 transform 즉, Transform클래스의 멤버변수로 접근이 가능하다.
이미 연결되어 있는 부분

// 요약:
//     The Transform attached to this GameObject.
public Transform transform { get; }

실제로 해당 프로퍼티를 타고 올라가면 위 처럼 Component클래스에 정의가 되어 있다.

같은 맥락으로 gameObject != GameObject이며 해당 프로퍼티가 정의되어 있음

// 요약:
//     The game object this component is attached to. A component is always attached
//     to a game object.
public GameObject gameObject { get; }

GetAxis VS GetAxisRaw

사용자의 입력받기

InputManager에서 정의된 입력에 대한 조합을 미리정의해두었다.

이런 조합을 미리 정의해둔 이유는 스크립트 상에서의 수정보다 어떠한 입력에 대한 대응키를 수정하는 방식이 더 효율적이고 안전하기 때문이다.

간단하게 필터가 하나 더 생긴것이라고 생각하는데 좀 더 나아가 입력되는 키에 대응되는 조이스틱, 마우스, 키보드 등등을 정의해놓았다.

이외에도 사용자가 직접 정의하여 사용할 수 있다..!

이러한 키 조합을 Input.GetAxis함수로 가져올 수 있는데 좌우 움직임에 대해서는 미리 정의된 “Horizontal”, “Vertical”을 사용한다.

float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");

반환되는 값은 -1.0f ~ 1.0f사이의 값을 반환한다.
키를 누르지 않을 경우는 0을 반환한다.

그렇다면 GetAxisRaw의 경우는 ??

GetAxisRaw의 경우 -1.0f, 0.0f, 1.0f세가지의 값만을 반환하며 방향을 바로 바꾸거나 딱딱한 움직임에 사용된다.

그럼 추축할 수 있는 GetAxis부드러운 움직임에 사용된다.

Transform.Position

직접 transform.postion을 변경하는 방법으로 사용된다.

하지만 매번 postion의 값을 조정하는 것은 복잡하고 가독성이 떨어지기 때문에 Translate라는 함수가 존재한다.

transform.position += Vector3.forward * 1;
transform.translate(Vector3.forward * 1.0f);

좀 더 명확하고 사용이 간편하다 또한 좌표계의 설정까지 신경쓸 수 있어서 transform의 이동의 경우 translate를 사용하는 편이다.

Transform.Rotate

public void Rotate(float xAngle, float yAngle, float zAngle);
public void Rotate(Vector3 eulers, [DefaultValue("Space.Self")] Space relativeTo);
public void Rotate(Vector3 eulers);
public void Rotate(float xAngle, float yAngle, float zAngle, [DefaultValue("Space.Self")] Space relativeTo);
public void Rotate(Vector3 axis, float angle, [DefaultValue("Space.Self")] Space relativeTo);
public void Rotate(Vector3 axis, float angle);

Transform클래스에 존재하는 Rotate(오버로딩)된 함수들이다.

tr.Rotate(new Vector3(0.0f, 30.0f, 0.0f));
tr.Rotate(0.0f, 30.0f, 0.0f);
tr.Rotate(Vector3.up * 30.0f);

사용방법은 다양하지만 결과는 같다. (y축 기준 30도 회전)

쿼터니언 정보

플레이어 마우스 회전

float r = Input.GetAxis("Mouse X");

tranform.Rotate(Vector3.up * turnSpeed * Time.deltaTime * r);

GetAxis을 사용하여 마우스의 x축 움직임을 -1.0f ~ 1.0f까지의 값을 받는다 해당 값 만큼 y축을 기준으로 캐릭터가 회전한다.

내부 속성인 속력을 제어하여 사용한다.

카메라가 플레이어 따라가기

일단 라이프서클편에서도 설명했듯이 Update함수에서 플레이어를 따라가는 카메라 함수를 같이 넣어 둔다면 동시에 실행되거나 실핼순서가 꼬이게 되어서 카메라가 심하게 흔들리는 오류가 있다.

따라서 Update이후에 호출되는 LateUpdate에서 처리해야 한다.

public class FollowCam : MonoBehaviour
{
    public Transform targetTr;
    private Transform CamTr;

    [Range(2.0f, 20.0f)]
    public float distance = 10.0f;

    [Range(0.0f, 10.0f)]
    public float height = 2.0f;

    void Start()
    {
        CamTr = GetComponent<Transform>();
    }

    void LateUpdate()
    {
        CamTr.position = targetTr.position + (-targetTr.forward * distance) + (Vector3.up * height);
        CamTr.LookAt(targetTr.position);
    }
}

해당 오브젝트를 따라가기 위해서 카메라 자신, 타켓의 위칠 받아서 해당 위에서 -forward즉 전진 방향에서 음수로 해당 거리(distance)만큼 떨어진다. 그리고 Y방향에서 해당 높이(height)만큼 올라가 LookAt()타켓을 바라보도록 설정.

  • 구면 선형 보간을 활용하여 부드러운 움직임 추가
public float damping = 10.0f;

void LateUpdate()
{
    Vector3 pos = targetTr.position + (-targetTr.forward * distance) + (Vector3.up * height);
    CamTr.position = Vector3.Slerp(CamTr.position, pos, Time.deltaTime * damping);
    CamTr.LookAt(targetTr.position);
}
  • SmoothDamp 함수 사용
private Vector3 velocity = Vector3.zero;
void LateUpdate()
{
    Vector3 pos = targetTr.position + (-targetTr.forward * distance) + (Vector3.up * height);
    CamTr.position = Vector3.SmoothDamp(CamTr.position, pos, ref velocity, damping);
    CamTr.LookAt(targetTr.position);
}

태그: ,

카테고리:

업데이트:

댓글남기기