Contents
접기
728x90
이번에는 튜토리얼에서 플레이어가 특정 위치에 도달하면 핀치새가 이동하는 시스템을 구현했다.
목표
- 맵마다 핀치새(PinchBird)를 배치
- 플레이어가 지정된 트리거 위치에 도달하면
- 핀치새가 대응되는 위치로 이동
맵 구조 설계
00_TutMove
├─ PinchBirdManager
│ ├─ PinchRoute
│ │ ├─ PinchRoutePoint_1
│ │ ├─ PinchRoutePoint_2 ...
│ ├─ PlayerTriggers
│ ├─ PlayerRoutePoint_1
│ ├─ PlayerRoutePoint_2 ...
│ └─ PinchBirdSpawnPoint
- PinchRoutePoint는 핀치새가 이동할 지점
- PlayerRoutePoint는 플레이어가 밟을 트리거
- 각 포인트는 같은 인덱스로 매칭
작동 방식
- 게임 시작 시 PinchBirdManager에서 핀치새를 소환
- 각 PlayerRoutePoint에 Trigger 콜라이더와 스크립트 연결
- 플레이어가 트리거에 닿으면
→ 해당 인덱스의 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
'GameDevelop > Unity팀프로젝트' 카테고리의 다른 글
Unity Master Audio로 맵별 배경음악 자동 변경하기 (6) | 2025.08.01 |
---|---|
유니티 말풍선 따라다니기 구현 (TextAnimator + SpeechBubble) (1) | 2025.07.31 |
Unity | 적 스폰 전 애니메이션 코드 구현 (2) | 2025.07.29 |
유니티 스폰 애니메이션 (2) | 2025.07.28 |
Unity 2D 게임에서 패럴랙스 배경 만들기 + 무한 반복 연결 (3) | 2025.07.25 |