개발/UNITY

Unity 3D Basic - 1

개발자 구리 2022. 4. 26. 01:22

우선 이번 포스팅에서 만들어볼 내용이다. 아래 강의를 따라하며 정리해보았다.

 

https://www.inflearn.com/course/%EA%B3%A0%EB%B0%95%EC%82%AC-%EC%9C%A0%EB%8B%88%ED%8B%B0-%EA%B8%B0%EC%B4%88/lecture/48465?tab=curriculum 

 

따라하면서 배우는 고박사의 유니티 기초 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

Player🕺

- Character Controller 컴포넌트

3차원 게임에서 캐릭터 움직임과 관련된 제어를 위해 사용한다.

캡슐 형태의 Collider가 포함되어있기 때문에, Rigid Body 컴포넌트 없이도 간단히 충돌/물리 처리가 가능하다.

단, 중력을 포함한 여러가지 물리엔진은 포함하지 않으므로 필요한 경우 캐릭터 컨트롤러 대신 Rigid Body를 사용하자.

 

- Mesh Renderer

3D 오브젝트에 색상을 지정하려면,

Material을 추가해서 색깔을 설정한 후 > 3D 오브젝트의 Mesh Renderer에 등록하면 된다.

 

- Player Controller (C#)

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [SerializeField]
    private KeyCode jumpKeyCode = KeyCode.Space;
    [SerializeField]
    private CameraController cameraController;
    private Movement3D movement3D;

    private void Awake()
    {
        movement3D = GetComponent<Movement3D>();
    }

    private void Update()
    {
        // move
        float x = Input.GetAxisRaw("Horizontal");
        float z = Input.GetAxisRaw("Vertical");
        movement3D.MoveTo(new Vector3(x, 0, z));

        // jump
        if (Input.GetKeyDown(jumpKeyCode))
        {
            movement3D.JumpTo();
        }

        // camera rotate
        float mouseX = Input.GetAxis("Mouse X");
        float mouseY = Input.GetAxis("Mouse Y");
        cameraController.RotateTo(mouseX, mouseY);
    }
}

 

- Movement 3D (C#)

using UnityEngine;

public class Movement3D : MonoBehaviour
{
    [SerializeField]
    private float moveSpeed = 5.0f; // 이동 속도
    [SerializeField]
    private float jumpForce = 3.0f; // 뛰는 힘
    private float gravity = -9.81f; // 중력 계수
    private Vector3 moveDirection;  // 이동 방향

    [SerializeField]
    private Transform cameraTransform;
    private CharacterController characterController;

    private void Awake()
    {
        characterController = GetComponent<CharacterController>();
    }

    private void Update() // 업데이트된 moveDirection, moveSpeed 등으로 플레이어를 이동
    {
        if (characterController.isGrounded == false)
        {
            moveDirection.y += gravity * Time.deltaTime;
        }
        characterController.Move(moveDirection * moveSpeed * Time.deltaTime);
    }

    public void MoveTo(Vector3 direction) // public이라 PlayerController에서 호출 가능
    {
        // 앞을 보도록 함
        Vector3 movedis = cameraTransform.rotation * direction;
        moveDirection = new Vector3(movedis.x, moveDirection.y, movedis.z);
    }

    public void JumpTo() // public이라 PlayerController에서 호출 가능
    {
        if (characterController.isGrounded == true)
        {
            moveDirection.y = jumpForce;
        }
    }
}

 

Camera 📷

- Main Camera

카메라가 플레이어를 따라다니도록 하려면?

Hierarchy에서 플레이어의 자식이 되도록 이동시켜주면 된다.

하지만 이렇게 하는 경우 한쪽 방향만 보며 따라가게 되므로 아래와같이 RotateTo를 이용해 카메라의 축을 바꾸어주자.

using UnityEngine;

public class CameraController : MonoBehaviour
{
    private float rotateSpeedX = 3;
    private float rotateSpeedY = 5;
    private float limitMinX = -80;
    private float limitMaxX = 50;
    private float eulerAngleX;
    private float eulerAngleY;

    public void RotateTo(float mouseX, float mouseY)
    {
        // 마우스를 좌/우로 움직이는 mouxeX 값을 y축에 대입하는 이유는
        // 마우스를 좌/우로 움직일 때 카메라도 좌/우를 보려면 카메라 오브젝트의 y축이 회전되어야 하기 때문
        eulerAngleY += mouseX * rotateSpeedX;
        eulerAngleX -= mouseY * rotateSpeedY;

        // x축 회전 값의 경우 아래, 위를 볼 수 있는 제한 각도가 설정되어 있다.
        eulerAngleX = ClampAngle(eulerAngleX, limitMinX, limitMaxX);

        transform.rotation = Quaternion.Euler(eulerAngleX, eulerAngleY, 0);
    }

    private float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360) angle += 360;
        if (angle > 360) angle -= 360;

        return Mathf.Clamp(angle, min, max);
    }
}

 

 

Player와 Main Camera간의 동작을 간략하게 정리하면 아래와 같다.

 

Player는 Player Controller를 통해 방향키를 입력받고(Input.Get...),

Movement3D 컴포넌트의 public 함수인 MoveTo()와 JumpTo()를 통해 내부 변수를 업데이트하고,

Update()를 이용해 Player를 이동시킨다.

 

Main Camera는 Player의 하위에 위치하므로 Player를 따라다닌다.

Player Controller를 통해 마우스 방향을 입력받고(Input.Get...),

Camera Controller 컴포넌트의 public 함수인 RotateTo()를 통해 카메라 축을 회전시킨다.

 

OOP며드는중..