본문 바로가기

Unity

2025년1월1주(12/30~1/5) (김치런 Game)

https://www.youtube.com/watch?v=A58_FWqiekI

 

 

 

 

 

  • 최종결과물

 

 

 

에셋을 다운받는다.

 

  • 아래의 에셋을 다운받아서 유니티에 import 한다. 

https://kimchirun.xyz/assets.zip

 

 

 

 

배경을 만든다.

 

  • 위에서 다운받은 에셋에서 하늘,건물,길의 이미지를 가져온다.

 

  • 아래와 같이 각각의 이미지를 , 적당히 화면에 배치한다.

 

 

Scrolling Script

  • 아래의 스크립트를 작성하여, 하늘,건물,길 을 각각 0.1, 0.2, 0.8로 입력한다.
using UnityEngine;

public class BackgroundScroll : MonoBehaviour
{
    [Header("Settings")]
    [Tooltip("Scroll 속도가 얼마나 빨라야하는가?")]
    public float scrollSpeed;

    [Header("References")]
    public MeshRenderer meshRenderer;

    void Update()
    {
        meshRenderer.material.mainTextureOffset += new Vector2(scrollSpeed * Time.deltaTime , 0);
    }
}

 

 

 

 

 

Player :  Run, Jump

  • 아래와 같이 플레이어가 달리기,점프하기의 Sprite가 있다. 해당 Sprite를 사용하여 애니메이션을 완성하자

 

  • 아래의 Player_run Sprite를 모두 선택하여, Scene에 드래그한다. Animation이 생성되는데 Player-run으로 생성한다.

 

 

  • 해당 오브젝트의 이름을 Player로 변경하고 , Rigidbody 2d (Gravity Scale:2.5) , Box Collider 2D를 추가한다. 

 

 

  • Platform에 Box Collider 2D를 추가하고, 충돌할 바닥을 적당히 설정한다. 

 

 

  • 실행하면 아래와 같이 플레이어가 달리는 동작이 나온다.

 

 

 

 

  • Jump Animation을 위해서 점프하는 동작을 아래와 같이 2개로 나누어서, Player-jump , Player-land 이렇게 2가지 Animation을 생성한다. (Samples 는 12로 한다.)

 

 

 

 

  • Animatior창에서 각각의  Animation이 있는데, 일단 int형 변수 state를 생성한다. 

 

  • Make Transition을 사용하여 아래와 같이 연결한다. 

 

 

  • 각각의 트랜지션은 아래와 같이 설정한다. (state가 1이면 Jump, 2라면 Land)

 

 

  • Player Script는 아래와 같다.
    • JumpForce : 점프할때 파워이다. 값이 클수록 높이 점프한다.
    • PlayerRigidBody , PlayerAnimator : 해당 플레이어의 레퍼런스객체이다. 
    • isGrounded : 연속점프를 막기위해서 true라면 땅에 접해있는상태이다. false라면 점프중인상태라 점프할수없다.
    • 동작설명
      • Space키를 누르면 Update()에서 해당 키를 체크하여, AddForceY를 하여 위로 점프하고, 애니메이션을 위하여 state를 1로 변경한다.  
      • OnCollisionEnter2D()는 바닥과 충돌하면 호출되어 state를 2로 바꿔서 애니메이션을 달리기 상태로 변경하고, 다시 점프가 가능하도록 isGrounded를 true로 설정한다.
using UnityEngine;

public class Player : MonoBehaviour
{
    [Header("Settings")]
    public float JumpForce;

    [Header("Reference")]
    public Rigidbody2D PlayerRigidBody;
    public Animator PlayerAnimator;

    private bool isGrounded = true;

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            PlayerRigidBody.AddForceY(JumpForce, ForceMode2D.Impulse);
            isGrounded = false;
            PlayerAnimator.SetInteger("state", 1);
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if(collision.gameObject.name == "Platform")
        {
            if(!isGrounded)
            {
                PlayerAnimator.SetInteger("state", 2);
            }
            isGrounded = true;
        }
    }
}

 

 

 

 

 

건물을 만들자

  • 건물스프라이트가 5개가 있는데, 일단 아무거나 선택해서 Hierarchy에 드래그하여 오브젝트를 생성하자.

 

 

  • 아래의 스크립트를 만들자. 해당 스크립트는 건물을 이동시키는데, moveSpeed의 속도로 이동한다.
using UnityEngine;

public class Mover : MonoBehaviour
{
    [Header("Settings")]
    public float moveSpeed = 1f;

    // Update is called once per frame
    void Update()
    {
        transform.position += (Vector3.left * moveSpeed * Time.deltaTime);        
    }
}

 

  • 화면밖으로 나가면 더이상 필요없으므로 삭제를 하도록 하자.
using UnityEngine;

public class Destroyer : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        if(transform.position.x < -15)
        {
            Destroy(gameObject);
        }
    }
}

 

  • 아래와 같이 해당 스크립트를 건물에 적용하였다.

 

 

  • 실행하면 아래와 같이 건물이 오른쪽에서 왼쪽으로 이동하고(Mover Script), 화면을 넘어가면 삭제가된다.(Destroy Script)

 

 

  • 건물이 5개라서 아래와 같이 Prefab으로 생성한다.

 

 

  • Spawner클래스를 만들어서 아래와 같이 입력한다.
using UnityEngine;

public class Spawner : MonoBehaviour
{
    [Header("Settings")]
    public float minSpawnDelay;  // 최소 생성시간
    public float maxSpawnDelay;	 // 최대 생성시간

    [Header("References")]
    public GameObject[] gameObjects;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        Invoke("Spawn", Random.Range(minSpawnDelay,maxSpawnDelay));
    }


    void Spawn()
    {
        var randomObject = gameObjects[Random.Range(0, gameObjects.Length)];
        Instantiate(randomObject, transform.position, Quaternion.identity);
        Invoke("Spawn", Random.Range(minSpawnDelay, maxSpawnDelay));
    }
}

 

  • Create Empty를 사용하여 빈 오브젝트를 만들고, 이름을 Building Spawner로 한후에 위의 스크립트를 넣는다.
    • 해당 스크립트의 min,max 값을 2,4로 설정하고(2~4초마다 건물이 생성된다.)
    • gameObjects에 위에서 만든 건물 프리팹 5개를 넣는다.
    • 해당 스크립트를 실행하면 2-4초마다 Invoke가 실행되어 건물이 생성된다.

 

 

  • 실행하면 2-4초마다 건물이 생성되어, Mover스크립트에서 왼쪽으로 이동하고, Destroy스크립트에 의해서 화면밖으로 나가면 삭제된다.

 

 

 

 

 

 

 

 

 

 

'Unity' 카테고리의 다른 글

블랜더  (0) 2024.12.24
2025년2월2주  (0) 2024.12.24
2025년2월1주(2/3~2/9) 무료 서버 구축하기  (0) 2024.12.24
2025년1월5주(1/27~2/2)  (0) 2024.12.24
2025년1월 2주  (0) 2024.12.24