tlov

[1] 크롬 다이노 게임 - 배경, 캐릭터 만들기 본문

게임개발

[1] 크롬 다이노 게임 - 배경, 캐릭터 만들기

nowitzki 2023. 7. 23. 18:38

일단 가장 먼저 생각나는게 배경, 캐릭터라서 얘네들을 만들어주기 위해서 먼저, 스프라이트를 찍어줬습니다. 크롬 T-Rex 게임에서 F12를 누르고 네트워크 단을 살펴보면 스프라이트를 찾을 수 있다고 하는데, 저는 못찾아서 pixilart 사이트에서 직접 찍었습니다 ㅠ

 

공룡은 달리기, 앉기, 죽음 3가지 상태가 있어서 이를 각각 찍어주고 배경은 구름이 있지만 지금 당장 중요한 기능이 아니라서 일단 대충 하늘색 사진 가져다 사용하기로 하고 바닥만 직접 찍어줬습니다. 그리고 찍는김에 선인장도 같이 찍어줬습니다. 원래 익룡도 찍어야 하는데, 기본적인 기능만 만드는 게 목표라서 익룡은 나중에 찍어주겠습니다.

 

아, 그리고 이거 찍으면서 크롬 T-Rex 게임에 앉기 기능이 있는 거 처음 알았습니다..

 

run dino.png
down dino.png

 

die run.png    die down.png

 

cactaceae.png

 

ground.png
Dino sprite.zip
0.01MB

 

이 스프라이트들을 이용해서 플레이어 게임 오브젝트를 만들고 충돌 구역을 설정하고 각 상태에 따른 애니메이션을 만들어 줬습니다.

 

 

IDEL 애니메이션 | JUMP 애니메이션

 

RUN 애니메이션

 

Crouch Run 애니메이션

 

서서 달리다 죽은 상태와 앉아서 달리다 죽은 상태 애니메이션

 

처음에 앉기 스프라이트의 높이와 서있는 상태의 스프라이트 높이를 다르게 잘라 애니메이션을 만들었더니 자꾸 발이 있는 위치가 서로 달라서 자연스러운 움직임이 나오지 않길래 앉기 애니메이션에 transform Property를 추가하여 해결하려고 했습니다만 이게 애니메이션에 적용한 transform Property는 공통으로 적용되더라고요? 그래서 높이를 똑같이 자른 스프라이트를 새로 만들어서 해결했습니다.

 

그리고 스크립트를 이용해서 점프, 앉기 기능도 구현해주었습니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    private Rigidbody2D rigid;
    private Animator animator;

    [SerializeField]
    private float jumpSpeed;
    private bool isGround = true;

    void Start() 
    {
        rigid = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }
    
    void Update()
    {
        Jump();
        Sit();
    }

    void Jump()
    {
        if (Input.GetKeyDown(KeyCode.UpArrow) && isGround)
        {
            rigid.AddForce(Vector3.up * jumpSpeed, ForceMode2D.Impulse);
            isGround = false;
            animator.SetBool("isJump", true);
        }
    }

    void Sit()
    {
        if (Input.GetKeyDown(KeyCode.DownArrow) && isGround)
        {
            animator.SetBool("isDown", true);
        } else if (Input.GetKeyUp(KeyCode.DownArrow) && isGround)
        {
            animator.SetBool("isDown", false);
        }
    }
    
    private void OnCollisionEnter2D(Collision2D other) 
    {
        if (other.gameObject.tag == "Foreground") {
            isGround = true;
            animator.SetBool("isJump", false);
        }
    }
}

 

바닥은 하나하나 게임오브젝트화하여 만드는 방법만 있나 싶었는데 찾아보니 타일맵 기능이란게 있더라고요? 그래서 이 기능을 활용해서 쉽게 바닥을 만들어주고 무한 스크롤링하여 무한대로 달리는 듯한 느낌을 주었습니다. 그리고 실제 T-Rex 게임도 바닥은 캐릭터보다 픽셀 크기가 작기 때문에 Scale로 크기를 좀 작게 만들었습니다. 또, 충돌 구역을 아래쪽에 주어 게임처럼 땅 위를 걷는듯한 느낌을 주었습니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Foreground : MonoBehaviour
{
    [SerializeField]
    private float moveSpeed = 7f;

    void Update()
    {
        transform.position += Vector3.left * moveSpeed * Time.deltaTime;

        if (transform.position.x <= -23.5f)
        {
            transform.position = new Vector3(13.25f, transform.position.y, 0);
        }
    }
}

충돌 구역을 아래에 줬습니다.

 

최종 결과는 다음처럼 보입니다.

그럴싸하지요