인디 게임 개발 게임톤을 참여하게 되어, 개발 일지를 업로드할 예정입니다.
우선, 저희 팀이 개발하기로 한 프로젝트는 every Hero - Ultimate Action 을 벤치마킹하여 제작하게 되었습니다.
가장 우선 적으로 해당 게임에서 구현해야 될 시스템은 카메라 였습니다.
기본적으로 카메라 시스템은 Player Charater의 뒤를 따라가는 백뷰로 진행 되며 기존 유니티로 백뷰 카메라를 구현하는
작업은 그렇게 어렵지 않았습니다.
다만 이번에 저희가 구현해야 될 백뷰 카메라는 조금 사정이 달랐습니다.
들어가야 될 시스템을 살펴보자면
1. 타겟팅 락온 시스템.
해당 시스템은 자동으로 적을 추적하며 Charater와 Camera의 Rotation을 Lock on 한 대상을 향해 회전 시켜줬어야 했습니다.
단순히 Rotation만 바꿔주면 되는 간단한 문제가 아니었나 라고 생각했지만, 쉬워보이는게 오히려 발목을 잡을 만큼
난이도가 어려웠고 하면 할 수록 더 어려워진 끝에 장장 4시간 이상의 삽질을 통해 겨우 구현하는데 성공했습니다.
지금부터 해당 삽질 내용과 결과 물을 올려드릴 예정입니다.
A. 기초 작업.
우선, 처음엔 설계와 효율성을 추구하며 작성하다가 시간 상 프로토 타입으로 빠르게 작업해야 되었기에
설계나 효율성 보단 기능적 구현이 가능한가를 확인하기 위해
앞으로 올릴 코드 내용은 기능 구현 위주로 작성됩니다.
1. 우선 Player 와 PlayerMove 스크립트를 추가했습니다.
Player는 Container 역할을 할 것이고 PlayerMove는 Move만을 담당해주는 객체로 분리하여
Container에서 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 합니다.
간단하게 Unity Event에 대한 개념을 설명 드리자면, 유니티 캔버스로 Button 을 한 번 만들어보셨으면
이해하기 쉬울 겁니다. 그거와 똑같은 기능입니다.
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로 받아옵니다. 어차피 Player와 PlayerMove 스크립트 모두 Player 객체 안에
추가 됩니다. 즉 따로 다른 스크립트내에서 transform에 대한 정보를 받아오지 않고 구현할 수 있습니다.
하여튼, 실질적으로 Invoke가 될 MoveMent 부분을 살펴보자면
가장 핵심이되는 기능은 RotateAround 입니다. 간단하게 해당 코드는 target.transform의 주변으로 공전하는
함수였습니다.
이제 스크립트 작성이 끝났으므로 하이락키와 인스펙터 창을 조절해줄 차례입니다.
Player는 Male Dummy가 될 것이고 Target은 FemaleDummy가 됩니다.
핵심은 MainCamera를 MaleDummy Player가 될 객체 안의 자식으로 넣어줬습니다.
이렇게 되면 따로 스크립트 필요없이 MainCamera는 부모객체를 따라 이동과 회전을 하게 됩니다.
아까 말한 Player객체안에서 Target객체와 Event를 PlayerMove의 MoveMent 함수로 잡아주고 실행합니다
이제 실행 결과 물입니다.
일단. 생각대로 구현은 되었으나 여기서 문제가 되는 건 부드럽게 카메라가 이동하지 못하고 딱딱 끊겨서 보인다는 겁니다.
그야 어쩔수없이 자식객체로 카메라가 있으니 그럴 수 밖에 없었고 여기서 부터 삽질이 시작됩니다.
'Unity' 카테고리의 다른 글
그래픽스 용어를 알아보자 (1) | 2024.04.24 |
---|---|
[LeetCode] Arrays 101 (0) | 2024.04.02 |
개발자가 되고 싶다면? (0) | 2023.09.13 |