-
유니티 2D 시네머신 사용기 - 씬 이동시 플레이어를 추적하는 카메라쾌락없는 책임 (공부)/Unity 2021. 3. 26. 22:37반응형
뭔가 말이 이상하긴 하나 조금 더 풀어쓴다면 플레이어가 없는 씬에서는 인스펙터에 플레이어항목을 끌어올 수 없으니 코드상으로 동적 할당을 해줘야 한다는 것입니다.
Cinemachine -Target Follow an Initialize Prefab
Since my player gets initialized in runtime, I am trying to add cinemachine's target and follow through code. What I tried below is not working:...
forum.unity.com
스크립트상에서 시네머신에 접근하는 방법을 몰라 한 2시간동안 헤메면서 머리 아팠는데 이걸 보시는 분들은 머리 잘 간수하시길 바랍니다.
소스코드
using UnityEngine; using Cinemachine; public class FollowPlayer : MonoBehaviour{ public GameObject tPlayer; public Transform tFollowTarget; private CinemachineVirtualCamera vcam; void Start(){ vcam = GetComponent<CinemachineVirtualCamera>(); tPlayer = null; } // 밑 업데이트가 아닌 start에서 한번만 실행해도 되는게 아닐까? void Update(){ if (tPlayer == null){ tPlayer = GameObject.FindWithTag("Player"); if (tPlayer != null){ tFollowTarget = tPlayer.transform; vcam.Follow = tFollowTarget; } } } }
시네머신을 물러오는 방법이 using Cinemachine로 생각보다 간단했습니다. 이후 플레이어 오브젝트, 팔로우 할 것, 카메라 변수 3개를 불러온 뒤 GameObject.Find를 사용하면 됩니다. Find가 효율이 좋지 않은걸로 아는데 위 경우 씬 이동시 플레이어를 불러오는 기능이 필요해 불가피했습니다.
+ 플레이어를 빠르게 찾을 수 있는 함수가 있다면 알려주세요...
무엇보다 위 코드의 핵심은
tPlayer = null;
Start함수의 이 부분인데 이걸 적용하지 않으면 한번 플레이어를 찾으면 그 오브젝트를 기억해버려 게임 재시작시 플레이어를 따라오지 않게 됩니다. 아래 정리를 해 보면
1. 테스트를 위해서 위 코드를 씬 B의 시네머신에 넣고 A > B로 씬을 이동하는 테스트 진행
2. B 씬의 시네머신에서는 1에서 실행했던 플레이어의 정보가 변수에 담겨있음
3. 다시 재시작을 하게 되면 2의 설명대로 1의 경우가 변수에 담겨있기 때문에 카메라는 1때의 플레이어를 찾지 못해 멈춰있음
때문에 스크립트에 null로 초기화하는 과정을 거쳐야 합니다. 추가적으로 생각하는건데 Update에 있는 함수를 Start에 끌어와도 같은 기능을 하지 않을까 합니다. 그러면 프레임단위로 호출되는 update를 쓰지 않아 메모리를 더 아낄 수 있겠죠.
반응형'쾌락없는 책임 (공부) > Unity' 카테고리의 다른 글
2D 횡스크롤에서 맵에 따른 카메라 전환 (0) 2021.04.06 유니티 텍스트 메쉬 프로 한글 적용하기 - Unity TextMeshPro korean (1) 2021.03.27 [유니티 2D 스터디] 애니메이션, 추가로 시네머신 살짝 공부 (0) 2021.03.16 유니티 인게임 메뉴 만들기 - 게임 일시정지, 재시작 등 (0) 2021.03.14 유니티 2D 시네머신 사용기 - 맵 이동시, 카메라 전환, confiner change (2) 2021.03.13