[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 23회차 미션 시작합니다.

02. 디아블로 게임 - 41 챕터를 마무리하고,
03. Firebase 네트워크 - 01 챕터를 새롭게 시작합니다.





디아블로 게임의 마지막입니다. 문과 함정을 구현합니다.
스크립터블을 사용한 이벤트 오브젝트를 설명하기 위해 조금 복잡하더라도 이 구조를 선택하였습니다.

DoorTriggerArea는 문 근처 영역에 있을 때 트리거를 발생시킵니다.
DoorController는 문 애니메이션을 보여주는 GameObject입니다.



public class DoorController_New : MonoBehaviour
{
    public DoorEventObject_New doorEventObject;
    public int id = 0;
    public float openOffset = 4f; // 문이 열렸을 때 위로 올라가는 위치
    public float closeOffset = 1f;
    
    private void OnEnable() {
        doorEventObject.OnOpenDoor += OnOpenDoor;
        doorEventObject.OnCloseDoor += OnCloseDoor;
    }
    
    private void OnDisable() {
        doorEventObject.OnOpenDoor -= OnOpenDoor;
        doorEventObject.OnCloseDoor -= OnCloseDoor;
    }
    
    public void OnOpenDoor(int id) {
        if (id != this.id) return;
        StopAllCoroutines();
        StartCoroutine(OpenDoor());
    }
    
    public void OnOpenDoor(int id) {
        if (id != this.id) return;
        StopAllCoroutines();
        StartCoroutine(CloseDoor());
    }
    
    public IEnumerator OpenDoor() { // 애니메이션
        while (transform.position.y < openOffset) {
            Vector3 calcPosition = transform.position;
            calcPosition.y += 0.01;
            transform.position = calcPosition;
            yield return null;
        }
    }
    
    public IEnumerator CloseDoor() {
        while (transform.position.y < closeOffset) {
            Vector3 calcPosition = transform.position;
            calcPosition.y -= 0.01;
            transform.position = calcPosition;
            yield return null;
        }
    }
}




[CreateAssetMenu(fileName = "Event System", menuName = "Event System/Door Event Object_New")]
public class DoorEventObject_New : ScriptableObject
{
    [NonSerialized]
    public Action<int> OnOpenDoor;
    [NonSerialized]
    public Action<int> OnCloseDoor;
    
    public void OpenDoor(int id) {
        OnOpenDoor?.Invoke();
    }
    
    public void CloseDoor(int id) {
        OnCloseDoor?.Invoke();
    }
}




public class DoorTriggerArea_New : MonoBehaviour
{
    public DoorEventObject_New doorEventObject;
    public DoorController_New doorController;
    public bool autoClose = true;
    
    private void OnTriggerEnter(Collider other) {
        doorEventObject.OpenDoor(doorController.id);
    }
    
    private void OnTriggerExit(Collider other) {
        doorEventObject.CloseDoor(doorController.id);
    }
}





주황색 박스를 문이라고 설정한 상태입니다. 내부 Mesh Obstacle로 지정. DoorController_New를 추가.




유니티를 플레이하여 2개의 박스가 문처럼 잘 동작하는 것을 확인할 수 있으며,
AutoClose를 false로 하여 테스트하면 문이 열리고 다시 닫히지 않는 오브젝트로 잘 동작하는 것을 확인할 수 있습니다.



함정은 해당 GameObject가 Collider가 발생하였을 때 Character에 Damage를 발생시키는 간단한 로직입니다.


public class TrapController_New : MonoBehaviour
{
    public float damageInterval = 0.5f; // 몇초간격 반복 데미지 interval 시간
    public float damageDuration = 5f; // 몇초간 대기
    public int damage = 5;
    private float calcDuration = 0.0f;
    
    [SerializeField]
    private ParticleSystem effect;
    private IDamagable damagable;
    
    private void Update() {
        if (damagable != null) calcDuration -= Time.deltaTime;
    }
    
    private void OnTriggerEnter(Collider other) {
        damagable = other.GetComponent<IDamagable>();
        if (damagable != null) {
            calcDuration = damageDuration;
            effect.Play();
            StartCoroutine(ProcessDamage();
        }
    }
    
    private void OnTriggerExit(Collider other) {
        damagable = null;
        StopAllCoroutines();
        effect.Stop();
    }
    
    IEnumerator ProcessDamage() {
        while (calcDuration > 0 && damagable != null) {
            damagable.TakeDamage(damage, null);
            yield return new WaitForSeconds(damageInterval);
        }
        
        damagable = null;
        effect.Stop();
    }
}




함정에 대한 Unity 설정입니다.





플레이를 해봅니다. 초록색 박스 Collider에 진입하면 1초마다 데미지를 입게 됩니다. 5초후 꺼지고 다시 데미지를 발생합니다.


여기까지 RPG 액션 게임을 구현하는 방법에 대한 중요한 시스템에 대한 설명이 완료되었습니다.
강의를 위한 자료 특히 설명해야할 것이 많은 자료는 정리하여 준비하기가 정말 힘든데.. 잘 정리해 주셨네요.
자료 준비하느라 힘드셨을 듯합니다. 감사합니다.










이제 Firebase에 대한 강의를 시작합니다.
Firebase backend system과 NoSQL 등 실제 게임 제작시에 어떻게 구성하고 활용하는지 교육합니다.
김영민 강사님이 지속 알려주시네요 ^^~





+ Firebase 소개: Firebase에 대해 설명을 하고, 특히 게임 내에서 사용되는 부분을 집중하여 안내할 예정.
+ Firebase 설정
+ 사용자 인증 구현
+ 사용자 순위(leaderboard) 구현 - Real-time 게임 순위
+ 사용자 데이터 저장/불러오기



 

 


Firebase는 BaaS를 제공하는 스타트업 회사로 2014년도에 구글에 인수되었다고 합니다. 와우.. 대단합니다.
게다가 Twitter의 Febric이라는 BaaS 시스템도 구글에 인수되어 Firebase에 통합되고 있다고 합니다..

서버 개발이 필요없다니(???) 와우.. 이..럴..수..가..있..나..?
사용하는 방법을 진짜 봐야겠네요.. Firebase 설정만 하면 된다는 것 같은데 말이죠.. 획기적이네요.
C++ API도 제공된다고 합니다.

단점도 알아봐야겠지요? 유니티에서 게임을 개발하는 단계에서의 단점은..
Desktop 기반의 플랫폼을 지원하지 않습니다. 음.. 저에게는 아쉽네요. 현재 Desktop 기반에서 Unity를 활용하는 것에 초점을 맞추어 보려 하고 있는데 말입니다. Unity 게임 개발 중간에 SDK를 활용해서 테스트를 할 수는 있지만 Desktop이나 MacOS용 게임을 배포하려고 하면 지원이 되지 않는 것입니다.
이를 해결하기 위한 방법으로 중간 웹서비스에 대한 API를 거쳐서 활용하는 방법이 있다고 합니다. 추후 알아봐야겠습니다.

두번째 주의점으로는 유저가 기하급수적으로 늘어나는 경우 자체 구축 서버 시스템보다 유지보수 비용이 많이 증가할 수 있는 단점이 있습니다.

하지만 Firebase를 통해서 BaaS에 대한 기본 개념을 알아보기 쉽고, 중소기업이하 소규모 개발사에서는 기간, 비용 등이 단축될 수 있기 때문에 적극 추천하는 바입니다.




+ Authentication: 기본적으로 구글 연동 로그인 시스템 등을 지원합니다.
+ Database: Realtime과 Cloud 모두 NoSQL기반. Realtime Database는 JSON 구조 저장. Cloud는 데이터를 문서 컬렉션 단위로 저장.
  Cloud의 장점은 복잡한 계층적인 데이터나 추출 쿼리의 복잡성도 해결가능함.

  대신 단순 구조 시스템은 Realtime이 빠름.
+ Cloud Functions: Javascript, Typescript 등의 처리.
+ Hosting: 웹호스팅 서비스. 인앱결제 등. 턴-방식 게임에서도 사용 가능.

+ Google Analytics: 접속 정보 통계 분석. 인앱결제 통계. 특정 스테이지 분석 등.
+ Crashlytics: 앱의 Crash 지점 분석.
+ Cloud Messaging: Push 알림
+ Remote Config:

여기까지 Firebase의 많은 기능들중 게임 개발시 도움이 될만한 내용에 대한 정리입니다.






<위의 코드들은 제가 보면서 주요한 함수, 코드를 확인하기 위해 타이핑한 용도로, 전체 소스코드가 아님에 주의해 주세요. 전체 코드는 교육 수강을 하면 완벽하게 받으실 수가 있답니다 ^^>

패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0

 

유니티 게임 포트폴리오 완성 올인원 패키지 Online. | 패스트캠퍼스

게임 콘텐츠 프로그래머로 취업하고 싶다면, 포트폴리오 완성은 필수! '디아블로'와 '배틀그라운드' 게임을 따라 만들어 보며, 프로그래머 면접에 나오는 핵심 개념까지 모두 잡아 보세요!

www.fastcampus.co.kr

 

+ Recent posts