Transform.Rotation(Vector3 vec)

transform을 기준으로 vec만큼 회전한다.

매개변수

반복되는 문장은 다른 부분만 매개변수로 대입하는 함수를 만들어주면 실수도 방지할 수 있고 가독성이 올라간다.

- 호출할 때 함수의 인자는 선언한 함수의 매개변수 타입과 같아야한다.

* Ctrl + .으로 반복되는 문장을 함수로 빠르게 만들 수 있다.
** Ctrl + R 두 번으로 이름을 한 번에 수정할 수 있다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour
{
    private Rigidbody rigid;
    [SerializeField]
    private float mod = 100f;
    [SerializeField]
    private float rotationSpeed = 1f;
    void Start()
    {
        rigid = GetComponent<Rigidbody>();
    }

    void Update()
    {
        ProcessThrust();
        ProcessRotation();
    }

    void ProcessThrust()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            rigid.AddRelativeForce(Vector3.up * mod * Time.deltaTime); // Time.deltaTime은 1프레임당 시간
        }
    }

    void ProcessRotation()
    {
        if (Input.GetKey(KeyCode.A))
        {
            // Ctrl + .으로 반복되는 문장을 함수로 빠르게 만들 수 있다.
            // 반복되는 문장은 다른 것만 매개변수로 받으면 좋다.
            // Ctrl + R 두 번으로 이름을 한 번에 수정할 수 있다.
            ApplyRotation(rotationSpeed);
        }
        else if (Input.GetKey(KeyCode.D))
        {
            ApplyRotation(-rotationSpeed);
        }
    }

    private void ApplyRotation(float rotationThisFrame)
    {
        transform.Rotate(Vector3.forward * rotationThisFrame * Time.deltaTime);
    }
}

 

 

Rigidbody Constraints

Rigidbody의 Constraints에서 위치와 회전 값을 고정할 수 있다.

Rigidbody의 Constaraints

물체에 부딪혔을 때 회전이 마음대로 안 되는 버그가 있다. (충돌 후 물리 계산 방향과 다른 방향으로 움직일려고 해서 버그가 발생함)

* 해결 방안 : 물리적 충돌에 의한 회전과 transform을 기반으로 한 회전은 다르기 때문에 물리적 충돌의 제약을 걸어 묶어준 후 수동으로 transform 회전을 하고 수동 회전 입력이 없으면 물리적 충돌의 제약을 푼다.  

물리적 충돌과 transform 회전

 

Rigidbody Drag

Drag 값은 공기 저항 값으로 움직일 때 저항이 발생한다.

물리적 힘을 줬을 때 어느정도 까지만 가고 더 추진 되지 않는다.

 

Physics Gravity

Project Setting - Physics - Gravity에서 월드 중력 값을 조정할 수 있다.

ex) 플레이어가 뚫고 가야할 맞바람 구현 - x축으로 -값을 줌

* 플레이 화면에서 고쳐도 저장 안 됨 => 플레이 중 테스트 가능

Gravity

 

Movement.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour
{
    private Rigidbody rigid;
    [SerializeField]
    private float mod = 100f;
    [SerializeField]
    private float rotationSpeed = 1f;
    void Start()
    {
        rigid = GetComponent<Rigidbody>();
    }

    void Update()
    {
        ProcessThrust();
        ProcessRotation();
    }

    void ProcessThrust()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            rigid.AddRelativeForce(Vector3.up * mod * Time.deltaTime); // Time.deltaTime은 1프레임당 시간
        }
    }

    void ProcessRotation()
    {
        if (Input.GetKey(KeyCode.A))
        {
            // Ctrl + .으로 반복되는 문장을 함수로 빠르게 만들 수 있다.
            // 반복되는 문장은 다른 것만 매개변수로 받으면 좋다.
            // Ctrl + R 두 번으로 이름을 한 번에 수정할 수 있다.
            ApplyRotation(rotationSpeed);
        }
        else if (Input.GetKey(KeyCode.D))
        {
            ApplyRotation(-rotationSpeed);
        }
    }

    private void ApplyRotation(float rotationThisFrame)
    {
        // 비트연산이라 더하면 xy 값 물리적 고정과 같음
        // rigid.constraints = (RigidbodyConstraints)((int)RigidbodyConstraints.FreezeRotationX + (int)RigidbodyConstraints.FreezeRotationY);
        // 물리적으로 회전 고정
        // rigid.constraints = RigidbodyConstraints.FreezeRotation;
        
        rigid.freezeRotation = true; // 회전 값을 고정해서 수동으로 회전을 조작할 수 있게 함
        // 이게 되는 이유는 rigid(물리)충돌의 회전만 제어했을 뿐이지 transform 기반으로 한 회전은 수동으로 제어 가능 
        transform.Rotate(Vector3.forward * rotationThisFrame * Time.deltaTime);
        rigid.freezeRotation = false; // 회전 값 고정을 풀어서 물리 시스템이 적용 됨
    }
}

Rotate

'유데미 강의 > C#과 Unity로 3D 게임 개발하기 : 부스트 프로젝트' 카테고리의 다른 글

유니티 오디오  (0) 2022.08.12
소스 컨트롤  (0) 2022.08.12
부스터  (0) 2022.08.03
클래스, Input 클래스  (0) 2022.08.03
유니티 유닛  (0) 2022.08.03

+ Recent posts