27일차) [Unity] 벡터(Vector)의 이해 및 트리거 기반 기믹 구현 기록

엄기태·2026년 2월 11일

Unity

목록 보기
3/13

📚 1. 오늘의 학습 요약

수학적 기초인 벡터의 개념을 정립하고, 이를 유니티 실무에 적용하는 방법을 학습하였다.

벡터의 개념 및 연산

  • 벡터(Vector): 크기와 방향을 동시에 가지는 값.

  • 스칼라(Scalar): 크기만 있는 값.

  • 연산 활용:

  • 덧셈: 두 힘의 합성.

  • 뺄셈: 대상 간의 방향 벡터 산출.

  • 곱셈: 방향은 유지하되 크기(길이)만 변화.

  • 정규화(Normalization): 벡터의 크기를 1로 만들어 '방향' 정보만 남기는 과정 (Normalize() 함수 사용).

🎯 2. 구현 목표

기존의 자동 기믹을 플레이어의 상호작용에 반응하는 수동/트리거 기믹으로 발전시켰다.

  • 트리거 문 제작: 플레이어나 특정 물체가 위치에 도달했을 때만 동작하는 문 구현
  • 물리 퍼즐: 무게가 있는 물체(Key)를 특정 위치에 놓아야 문이 열리는 기믹 추가
  • 시점 및 조작: 1인칭 시점 추가, 시점 변경 기능 및 점프 기능 구현

🖼️ 3. 구현 결과

  • 🎬 결과물 영상:

주요 소스코드 📄

DoorController.cs

using UnityEngine;

public class DoorController : MonoBehaviour
{
	[SerializeField] private DoorMovement _DoorMovementTarget;
	private int _stayCount = 0;
	private void OnTriggerEnter(Collider other)
	{
		if (other.CompareTag("Key") || other.CompareTag("Player"))
		{
			_stayCount++;
			UpdateDoorState();
		}
	}
	private void OnTriggerExit(Collider other)
	{
		if (other.CompareTag("Key") || other.CompareTag("Player"))
		{
			_stayCount--;
			if (_stayCount < 0) _stayCount = 0;

			UpdateDoorState();
		}
	}

	private void UpdateDoorState()
	{
		_DoorMovementTarget._isMoving = (_stayCount > 0);
	}
}

DoorMovement.cs

using UnityEngine;

public class DoorMovement : MonoBehaviour
{
	[SerializeField] float _moveDistance = 4f;
	[SerializeField] float _moveSpeed = 2f;
	public bool _isMoving = false;

	Vector3 _closedPos;
	Vector3 _openPos;
	void Start()
    {
		_closedPos = transform.position;
		_openPos = _closedPos + Vector3.up * _moveDistance;
	}

    void Update()
    {
		Vector3 targetPos = _isMoving ? _openPos : _closedPos;
		transform.position = Vector3.MoveTowards(transform.position, targetPos, _moveSpeed * Time.deltaTime);
	}
}

💡 4. 문제 해결 방법

트리거 중복 판정 오류 해결

  • 문제: 플레이어가 트리거 존에 들어와 문이 열린 상태에서, 같이 있던 물체만 가지고 나가거나 플레이어만 나갈 경우 문이 닫히는 현상 발생(객체 하나라도 Exit 되면 닫힘).
  • 해결: _stayCount 변수를 도입하였다. Enter 시 카운트를 증가시키고 Exit 시 감소시켜, 존 안에 남아있는 객체가 하나라도 있다면(Count > 0) 문이 열린 상태를 유지하도록 로직을 개선하였다.

🚀 5. 개선 계획 및 회고

🤔 아직 어려운 부분

  • 점프 로직: 현재 점프 키를 꾹 누를 시 공중 점프가 무한히 가능한 문제가 있다. 지면 접지 여부(Grounded)를 체크하는 로직 보완이 필요하다.
  • 벡터 정규화 적용: 대각선 이동 속도를 일정하게 맞추기 위해 Normalize()를 적용하려 했으나, 미세한 조작 시에도 속도가 1로 고정되어 미끄러지는 듯한 조작감이 발생하는 문제가 생겼다. 입력 값의 크기에 따른 예외 처리가 필요함을 느꼈다.

향후 계획

  • 물리 기반 이동 시 조작감을 해치지 않으면서 대각선 속도를 보정하는 법을 추가 학습할 예정이다.
  • 지면 체크 레이캐스트(Raycast)를 활용하여 점프 기능을 정상화할 계획이다.

점프 기능 수정을 위해 지면을 감지하는 Raycast 방식이나 OnCollisionStay 활용법을 함께 알아볼까? 도움이 필요하면 말해다오.

profile
코딩 학습 공간

0개의 댓글