Unity 시작 #001

주환서·2026년 2월 22일

Unity 기본 사용법들

  • 맵 구조를 설계 할 때 Cube, Plane 등을 이용해서 맵을 설계하고 꾸밀 수 있습니다.
  • 구조물들을 Meterial을 이용하여 디자인 할 수 있습니다.
  • 각종 Light들을 이용해서 기본적인 Light, Spotlight 등 조명을 밝힐 수 있습니다.
  • 플레이어 캐릭터를 움직이기 위해 Animator Controller를 설계하고 스크립트를 추가해서 구현 할 수 있습니다.
  • 캐릭터 이동 구현 시 Animator Controller의 Parameters는 float 혹은 int형 파라미터를 추가하여 키 입력을 판단합니다.

  • State Machine 에서 Idle 상태를 중심으로 상하좌우로 가는 Transition을 설정합니다.

  • Has Exit Time은 현재 애니메이션을 끝까지 보고 다음으로 넘어갈지 바로 넘어갈지를 결정하는 도구입니다.

  • 캐릭터 이동 코드 예시

void Update()
{
    // A키: 왼쪽 이동
    if (Input.GetKey(KeyCode.A)) {
        animator.SetBool("isLeft", true);
    } 
    else {
        animator.SetBool("isLeft", false);
    }

    // S키: 뒤로 이동
    if (Input.GetKey(KeyCode.S)) {
        animator.SetBool("isRunBack", true);
    } 
    else {
        animator.SetBool("isRunBack", false);
    }

    // D키: 오른쪽 이동 
    if (Input.GetKey(KeyCode.D)) {
        animator.SetBool("isRight", true);
    } 
    else {
        animator.SetBool("isRight", false);
    }
}
  • 캐릭터 이동이나 회전할 때는 Unity에서 지원하는 Input Manager를 사용하여 Mouse X, Vertical, Horizontal 등을 활용해서 구현 할 수 있습니다.

기본적인 기믹들

  • 구조물들을 옮겨서 은엄폐 할 수 있는 기믹
using UnityEngine;

public class PushableBlock : MonoBehaviour
{
    //
    public float pushSensitivity = 5.0f;

    private Rigidbody rb;   // rigidbody 가져오기

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // 무언가와 계속 닿아있을 때 
    void OnCollisionStay(Collision collision)
    {
        // 닿은 물체가 Player 일때만 작동
        if (collision.gameObject.CompareTag("Player"))
        {
            // 플레이어 위치 - 블럭 위치 = 나를 바라보는 방향 벡터 (왼쪽에서 밀면 +x)
            Vector3 direction = transform.position - collision.transform.position;

            // 힘을 가해서 밀기
            rb.AddForce(direction * pushSensitivity, ForceMode.Force);
        }
    }
}
  • 밟판 위에 올라가서 이동 할 수 있는 기믹
using UnityEngine;

public class MoveBridge : MonoBehaviour
{
    public float speed = 3.0f;       // 이동 속도
    public float moveRange = 5.0f;   // 이동 범위

    private Vector3 startPos;
    private float _timer = 0f;       // 작동 시간 누적용
    private bool _isActive = false;

    void Start()
    {
        startPos = transform.position;
    }

    void Update()
    {
        if (_isActive)
        {
            _timer += Time.deltaTime;

            // 왕복 이동 값 계산
            float zPos = Mathf.PingPong(_timer * speed, moveRange);
            transform.position = startPos + new Vector3(0, 0, zPos);
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            _isActive = true;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            _isActive = false;
        }
    }
}
  • 위 아래로 열고 닫히는 문
using UnityEngine;

public class VerticalDoor : MonoBehaviour
{
    public float speed = 2.0f;       // 문이 움직이는 속도
    public float openHeight = 3.0f;  // 문이 열리는 높이

    private Vector3 startPos;
    private float _timer = 0f;
    private bool _isPlayerNear = false; // 플레이어 감지 상태

    void Start()
    {
        startPos = transform.position;
    }

    void Update()
    {
        if (_isPlayerNear)
        {
            // 플레이어가 근처에 있음
            _timer += Time.deltaTime;
            float newY = Mathf.PingPong(_timer * speed, openHeight);
            transform.position = startPos + new Vector3(0, newY, 0);
        }
        else
        {
            // 플레이어가 멀어지면 문이 원래 위치로 델타타임속도로 닫힘
            // MoveTowards(현재위치, 목표위치, 속도)
            transform.position = Vector3.MoveTowards(transform.position, startPos, speed * Time.deltaTime);

            // 문이 완전히 닫혔다면, 다음 작동을 위해 타이머를 초기화
            if (transform.position == startPos)
            {
                _timer = 0f;
            }
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            _isPlayerNear = true;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            _isPlayerNear = false;
        }
    }
}

컴포넌트

  • Transform: 오브젝트의 위치, 회전, 크기를 설정하는 컴포넌트입니다.
  • Animator: 애니메이션 클립을 재생하고 언제 어떠한 동작을 할지 결정하는 컴포넌트입니다.
  • Rigidbody: 오브젝트에 물리적인 힘을 입혀주는 컴포넌트입니다. 중력이나 물체와 충돌을 감지 할 수 있습니다.
  • Collider: 오브젝트의 충돌을 설정하는 컴포넌트입니다. 오브젝트가 물리적인 힘을 가질지 말지 Is Trigger를 통해서 결정 할 수 있습니다.

벡터

  • 유니티에서 벡터의 역할은 오브젝트들이 어디에 위치해 있고 어느 방향으로, 얼마나 세게 움직이는지를 설명합니다.
  • x, y, z 조합으로 위치를 나타냅니다.
  • 목적지와 본인의 위치의 차이를 계산하면 목적지로 향하는 방향을 구할 수 있습니다.
  • 벡터의 길이는 거리와 힘의 세기를 나타냅니다.

0개의 댓글