GameDevelop/Unity팀프로젝트

Unity | 플레이어 위치에 따라 따라오는 '핀치새' 구현하기

도도돋치 2025. 7. 30. 21:01
Contents 접기
728x90

이번에는 튜토리얼에서 플레이어가 특정 위치에 도달하면 핀치새가 이동하는 시스템을 구현했다.

 

목표

  • 맵마다 핀치새(PinchBird)를 배치
  • 플레이어가 지정된 트리거 위치에 도달하면
  • 핀치새가 대응되는 위치로 이동

 

맵 구조 설계

00_TutMove
├─ PinchBirdManager
│   ├─ PinchRoute
│   │   ├─ PinchRoutePoint_1
│   │   ├─ PinchRoutePoint_2 ...
│   ├─ PlayerTriggers
│       ├─ PlayerRoutePoint_1
│       ├─ PlayerRoutePoint_2 ...
│   └─ PinchBirdSpawnPoint

 

  • PinchRoutePoint는 핀치새가 이동할 지점
  • PlayerRoutePoint는 플레이어가 밟을 트리거
  • 각 포인트는 같은 인덱스로 매칭

 

작동 방식

  1. 게임 시작 시 PinchBirdManager에서 핀치새를 소환
  2.  PlayerRoutePoint에 Trigger 콜라이더 스크립트 연결
  3. 플레이어가 트리거에 닿으면
    → 해당 인덱스의 PinchRoutePoint로 핀치새 이동

 

주요 스크립트 구성

1. PinchBirdManager.cs

public class PinchBirdManager : MonoBehaviour
{
    [SerializeField] private GameObject _pinchBirdPrefab;
    [SerializeField] private Transform _spawnPoint;
    [SerializeField] private Transform[] _birdTargets;
    [SerializeField] private Transform[] _playerTriggers;
    [SerializeField] private float _speed = 2f;

    private Transform _pinchBird;
    private int _currentTarget = -1;
    private bool _isMoving = false;

    private void Start()
    {
        GameObject bird = Instantiate(_pinchBirdPrefab, _spawnPoint.position, Quaternion.identity, this.transform);
        _pinchBird = bird.transform;

        for (int i = 0; i < _playerTriggers.Length; i++)
        {
            var trigger = _playerTriggers[i].GetComponent<PlayerRouteTrigger>();
            if (trigger != null) trigger.Initialize(this, i);
        }
    }

    private void Update()
    {
        if (!_isMoving || _pinchBird == null || _currentTarget < 0 || _currentTarget >= _birdTargets.Length)
            return;

        _pinchBird.position = Vector3.MoveTowards(
            _pinchBird.position,
            _birdTargets[_currentTarget].position,
            _speed * Time.deltaTime
        );

        if (Vector3.Distance(_pinchBird.position, _birdTargets[_currentTarget].position) < 0.05f)
            _isMoving = false;
    }

    public void MoveToPoint(int index)
    {
        if (index < 0 || index >= _birdTargets.Length) return;
        _currentTarget = index;
        _isMoving = true;
    }
}

 

 

2. PlayerRouteTrigger.cs

public class PlayerRouteTrigger : MonoBehaviour
{
    private PinchBirdManager _manager;
    private int _targetIndex;

    public void Initialize(PinchBirdManager manager, int index)
    {
        _manager = manager;
        _targetIndex = index;
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (!other.CompareTag("Player")) return;
        _manager?.MoveToPoint(_targetIndex);
    }
}

 

 

오브젝트 설정 팁

🔸 PlayerRoutePoint

  • BoxCollider2D 컴포넌트 추가
  •  Is Trigger 체크
  • PlayerRouteTrigger 스크립트 부착

🔸 플레이어

  • Rigidbody2D & Collider2D 필수
  • Tag는 "Player"로 설정
728x90