해당 시스템은 자동으로 적을 추적하며 Charater와 Camera의 Rotation을 Lock On 한 대상을 향해 회전 시켜줬어야 했습니다.
단순히 Rotation만 바꿔주면 되는 간단한 문제가 아니었나라고 생각했지만, 쉬워보이는게
오히려 발목을 잡을 만큼 꽤 여러 시도 끝에 구현하게 되었습니다.
A.우선 Player 와 PlayerMove 스크립트를 추가했습니다.
Player는 Container 역할을 할 것이고 PlayerMove는 Move만을 담당해주는 객체로 분리하여
Event 기반으로 동작하게 스크립트를 분리할 생각이었습니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class Player : MonoBehaviour { [SerializeField] UnityEvent<Vector3,Transform> events; [SerializeField] GameObject target; // Update is called once per frame void Update() { if(Input.GetKeyDown(KeyCode.D)) movement(Vector3.down,target.transform); else if(Input.GetKeyDown(KeyCode.A)) movement(Vector3.up, target.transform); } public void movement(Vector3 dir,Transform target) { events?.Invoke(dir,target); } }
Player 스크립트는 아래와 같습니다.
D or A Key를 누르면 movement 함수를 호출할 겁니다.
해당 movement 함수에서는 인자를 2개 받아옵니다. LockOn이 될 Target Transfrom과 회전할 direction을 받아옵니다.
이후 위에 설명한 Unity Event를 Invoke 합니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMove : MonoBehaviour { Transform transform; public float speed = 2000.5f; private void Start() { transform = GetComponent<Transform>(); } public void MoveMent(Vector3 dir,Transform target) { transform.RotateAround(target.transform.position, dir, speed * Time.deltaTime); } }
이제 Event로 실행될 PlayerMove 스크립트 입니다.
먼저 transform은 getComponent로 받아옵니다.
실질적으로 Invoke가 될 MoveMent 부분을 살펴보자면
가장 핵심이 되는 기능은 RotateAround 입니다. 간단하게 해당 코드는 target.transform의 주변으로 공전하는 함수입니다.
이제 스크립트 작성이 끝났으므로 하이락키와 인스펙터 창을 조절해줄 차례입니다.
Player는 Male Dummy로 설정하였고 Target은 FemaleDummy로 하였습니다.
핵심은 MainCamera를 MaleDummy Player가 될 객체 안의 자식으로 넣어줬습니다.
이렇게 되면 따로 스크립트 필요 없이 MainCamera는 부모 객체를 따라 이동과 회전을 하게 됩니다.
일단. 생각대로 구현은 되었으나 여기서 문제가 되는 건 부드럽게 카메라가 이동하지 못하고 딱딱 끊겨서 보인다는 겁니다.
그야 어쩔수 없이 자식객체로 카메라가 있으니 그럴 수 밖에 없었고 여기서부터 여러 시행착오를 겪게 됩니다..
MOS-CAMERA-SYSTEM