Window -> 2D -> Tile Palette : 타일을 사용하기 위해 모아둔 프리펩

 

Create New Palette로 pallete를 생성

Sprite에서 지형 sprite를 모두 선택해서 Tile Pallete에 드래그한다.

그리고 Edit을 누르고 화살표 모양을 누르면 타일을 선택할 수 있다.

그리고 그림들을 움직여서 다음처럼 정렬해줬다.

 

정렬된 tile map

이 pallete를 이용해서 brush로 맵을 쉽게 만들수 있다.

 

tile에 사용된 sprite의 sprite editor를 이용해서 Custom Physical Shape에서 물리 모양을 조절할 수 있다.

이 때 타일팔레트에서 삭제하고 물리 모양 편집을 하는 것이 안전하다. 편집된 sprite의 물리모양이 tile pallete에 적용이 안될 수 있기 때문.

 

이번 강의는 타일을 사용해서 맵을 구성하는 방법에 대한 내용이었다.

코딩을 하거나 딱히 어려운 것들은 아니었기 때문에 딱히 추가할 내용은 없을 것 같다.

'Unity' 카테고리의 다른 글

[Unity] 점프 구현하기  (0) 2022.08.08
[Unity] 플레이어 이동 구현하기  (0) 2022.08.06
[Unity] 프로젝트 생성과 github을 이용한 버전 관리  (0) 2022.08.02
Unity의 시작  (0) 2022.08.02

점프 설정하는 방법은 

 

Update 함수에 아래 코드를 추가해 주면 된다.

        //Jump
        if (Input.GetButton("Jump"))
        {
            rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
        }

그럼 Player Move 스크립트 inpector에서 Jump Power를 설정할 수 있는 칸이 생긴다.

 

이 때 내려오는 속도가 너무 느리다면 Rigidbody 2D에서 Gravity 값을 조절해도 되고

Edit -> Project setting 에서 gravity Y값을 변경해도 된다.

 

애니메이션은 동일하게 만들고 다만 점프는 반복하면 안되기 때문에 loop time 옵션은 체크 해제해준다.

 

RayCast : 오브젝트 검색을 위해 Ray를 쏘는 방식

Debug.DrawRay() : 오브젝트에서 Ray를 쏘는 함수

RayCastHit : Ray에 닿은 오브젝트

RayCastHit의 콜라이더 변수로 검색 확인 가능

 

Layer Mask : 물리 효과를 구분하는 정수

 

레이캐스트 부분 복습 필요..

영상과 좀 다른 부분도 있고 이해안가는 부분도 있다.

 

        //Landing Platform
        if(rigid.velocity.y < 0) // y축 속도가 음수인 경우 = 점프하고 내려오는 순간
        {
            Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0)); //레이를 그린다.
            //현재 포지션에서 LayerMask Platform을 검색한다.
            RaycastHit2D rayHit = Physics2D.Raycast(rigid.position,
                                                    Vector3.down, 1,
                                                    LayerMask.GetMask("Platform"));
            //rayHit에 충돌이 있는 경우
            if (rayHit.collider != null)
            {
                //충돌한 오브젝트와의 거리가 0.5 이하인 경우
                if (rayHit.distance < 0.5f)
                {
                    //Debug.Log(rayHit.collider.name);
                    //isJumping을 false로 setting
                    anim.SetBool("isJumping", false);
                }
            }
        }

 

이동하다가 점프를 한 상태에서 이동키를 떼지 않는 경우 점프 state에서 idle로 넘어가지 않는다.

아직 원인은 모르겠다. 추후 확인해서 업데이트해봐야겠다.

https://www.youtube.com/watch?v=Z4iULRbiSTg&list=PLO-mt5Iu5TeZGR_y6mHmTWyo0RyGgO0N_&index=3&t=51s 

 

위 영상을 보고 따라가는 중이다.

 

Assets 폴더에 Scripts 폴더를 만들어주고

PlayerMove 스크립트 파일을 생성한다.

그 파일을 Player sprite에 드래그 해주면 Inspector에 스크립트 창이 생긴다.

스크립트 이름을 더블클릭해주면 VS에서 소스를 수정할 수 있다.

 

코드를 짜다가 문제가 하나 있었는데

영상에서 보면 Rigidbody2D라던가

GetComponent같은 것들은 이미 유니티에서 구현이 된 클래스나 기능들인 것 같은데

나는 자동완성이 되지 않았다.

그래서 알고봤더니 아래 블로그와 같은 문제였다!

https://blog.naver.com/PostView.nhn?blogId=whatsuppapa&logNo=222326681454&categoryNo=24&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView 

 

유니티, 비주얼스튜디오 자동완성(인텔리센스)가 안될때 해결 방법.

안녕하세요. 주투리아입니다. 어저께 컴퓨터가 먹통이 되면서 윈도우를 초기화했더니 설치되었던 프로그램...

blog.naver.com

영상에서 추가한 이동 로직은 다음과 같다.

최대한 영상에 나오는 설명들을 주석에 추가했다..

일단 C#도 공부를 좀 해야할 필요가 있고 유니티에서 제공하는 기능들도 더 알아봐야할 것 같다.

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

public class PlayerMove : MonoBehaviour
{
    //public 변수로 설정하면 Inspector에서 실행 중에도 값 변경 가능
    public float maxSpeed;
    Rigidbody2D rigid;

    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        
    }


    void FixedUpdate()
    {
        //FixedUpdate는 보통 1초에 약 50회 돈다.
        //1초 동안 방향키를 누르고 있으면 AddForce가 50번 입력된다.
        //Move By Key Control
        float h = Input.GetAxisRaw("Horizontal");
        rigid.AddForce(Vector2.right * h, ForceMode2D.Impulse);
        //Vector2의 첫번째 파라미터는 x축 속도, 두번째 파라미터는 y축 속도?
        if (rigid.velocity.x > maxSpeed) // Right Max Speed
            rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);
        else if (rigid.velocity.x < maxSpeed*(-1)) // Left Max Speed
            // 왼쪽은 마이너스 속도기 때문에 맥스 스피드에 -1 곱
            rigid.velocity = new Vector2(maxSpeed*(-1), rigid.velocity.y);
    }
}

 

그리고 Assets 폴더에서 우클릭해서

Create -> 2D -> Physics Material 2D를 생성해서 Friction(마찰력)을 0으로 설정하고

모든 floor를 선택하고 Box Collider 2D에서 Material에 새로 만든 Physics Material을 드래그해서 적용해준다.

그럼 플레이어가 방향키를 한번만 눌러도 미끄러진다. 마찰력이 없기 때문에

이렇게 해주는 이유는 다음 강의에서 경사로를 올라가기 위해서라고 한다.

이 부분은 실제로 이 방법 밖에 없는건지 한번 찾아봐야겠다.

 

다음은 마찰력이 없는 것을 보완하기 위해 공기저항을 추가하는 것이다.

플레이어를 선택하면 Rigidbody 2D에 Linear Drag가 있다. 말그대로 해석하면 선형저항 같은데

이게 2D 게임에서는 공기저항같은 것으로 표현되나 보다.

공기저항이기 때문에 점프하고 공중에서 내려올 때도 천천히 내려오게 만들기 때문에 너무 큰 값을 주면 안된다.

 

Rigidbody 2D에서 Freeze Rotation에서 z축을 체크를 꼭해야 플레이어가 넘어지지 않는다.

처음에 키 입력을 하고 나서 좌우로 막 움직이니 플레이어가 넘어지고 날라가고 그랬는데 이 옵션을 줘야지 그런 현상을 막을 수 있나보다.

 

다음은 애니메이션 적용하기

방향키를 입력받을 때 Run 애니메이션 적용하는 방법이다.

Parameter 탭에서  +를 누르면 타입이 나오는데 이것이 애니메이션 state를 바꿀 때 필요한 변수의 타입이라고 한다.

여기서 변수를 하나 추가해주고 transition을 누르면 inspector에서 Conditions에서 +를 누르면 추가했던 파라미터를 설정할 수 있다.

그리고 아래 코드에서 보면 업데이트 부분에서 anim.setBool함수로 이용하고 있다.

 

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

public class PlayerMove : MonoBehaviour
{
    //public 변수로 설정하면 Inspector에서 실행 중에도 값 변경 가능
    public float maxSpeed;
    Rigidbody2D rigid;
    SpriteRenderer spriteRenderer;
    Animator anim;

    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>();
        anim = GetComponent<Animator>();

    }

    //단발적인 키 입력은 Update에서 하는 것이 좋다
    void Update()
    {
        //Stop speed
        if(Input.GetButtonUp("Horizontal"))
        {
            //normalized : 벡터 크기를 1로 만든 상태(단위벡터) GetAxisRaw랑 비슷하다?
            //normalized에 곱해주는 값이 크면 버튼을 떼도 미끄러진다.
            rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.001f, rigid.velocity.y);
        }

        //Direction Sprite
        //flipX는 bool값으로 default는 false
        if (Input.GetButton("Horizontal"))
        {
            spriteRenderer.flipX = Input.GetAxisRaw("Horizontal") == -1;
        }

        //Run animation 적용
        if (Mathf.Abs(rigid.velocity.x) < 0.3)
        {
            anim.SetBool("isRunning", false);
        }
        else
        {
            anim.SetBool("isRunning", true);
        }
    }

    //지속적인 키 입력은 FixedUpdate에서 하는 것
    void FixedUpdate()
    {
        //FixedUpdate는 보통 1초에 약 50회 돈다.
        //1초 동안 방향키를 누르고 있으면 AddForce가 50번 입력된다.
        //Move Speed
        float h = Input.GetAxisRaw("Horizontal");
        rigid.AddForce(Vector2.right * h, ForceMode2D.Impulse);
        //Vector2의 첫번째 파라미터는 x축 속도, 두번째 파라미터는 y축 속도?
        //Max Speed
        if (rigid.velocity.x > maxSpeed) // Right Max Speed
            rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);
        else if (rigid.velocity.x < maxSpeed*(-1)) // Left Max Speed
            // 왼쪽은 마이너스 속도기 때문에 맥스 스피드에 -1 곱
            rigid.velocity = new Vector2(maxSpeed*(-1), rigid.velocity.y);
    }
}

'Unity' 카테고리의 다른 글

[Unity] 타일맵으로 플랫폼 만들기  (0) 2022.08.09
[Unity] 점프 구현하기  (0) 2022.08.08
[Unity] 프로젝트 생성과 github을 이용한 버전 관리  (0) 2022.08.02
Unity의 시작  (0) 2022.08.02

일단 유니티 개발을 위한 툴은 유니티 페이지에서 다운 받을 수 있다.

https://unity.com/kr/developer-tools

 

개발자 툴

여러분과 여러분의 프로젝트를 지원하기 위한 툴(기술 자료, Knowledge Base, 이슈 트래커 등)이 마련되어 있습니다.

unity.com

 

개발자 툴 메뉴로 가서 유니티 허브를 설치하면 된다.

 

설치 후 실행하면

왼쪽 탭에서 프로젝트를 볼 수 있고, 새 프로젝트를 눌러 프로젝트를 만들면 된다.

물론 프로젝트에 대해서 버전 관리를 하고 싶다면 당연히 github에서 관리하는 repo에 만들어야 한다.

그리고 github에서 제공하는 .gitinore 템플릿이 있다. 옵션들에서 unity옵션을 선택하면 unity 프로젝트 버전관리에 필요없는 것들을 git에서 보여지지 않도록 할 수 있다.

처음에 이 옵션을 모르고 commit 했다가 100메가가 넘는 파일을 commit할 수 없다는 것 때문에 한참 씨름했다..

 

아무튼 이렇게 프로젝트를 만들고 유니티가 실행되면

 

이런 화면이 나온다!

나는 2D 용 프로젝트를 생성했기 때문에 3D 프로젝트를 생성하면 아마 Scene 윈도우가 3D로 보이지 않을까 싶다.

 

이제 그럼 게임 개발 시작이다!

'Unity' 카테고리의 다른 글

[Unity] 타일맵으로 플랫폼 만들기  (0) 2022.08.09
[Unity] 점프 구현하기  (0) 2022.08.08
[Unity] 플레이어 이동 구현하기  (0) 2022.08.06
Unity의 시작  (0) 2022.08.02

한 동안 앞으로의 커리어에 대해 고민을 좀 했다.

현재 나는 C++을 사용하여 통신 장비 호처리 SW를 개발하고 있다.

하지만 최근 이 일에 대해 약간 매너리즘이 생기기도 했고

워낙 게임을 좋아하기 하고 지금까지 개발한 C++ 경력을 사용할 수도 있는 게임 개발로 진로를 잡아야겠다 생각했다.

 

그래서 적어도 간단한 게임 하나 정도는 만들어봐야하지 않을까 해서 Unity 카테고리를 만들었다.

 

기왕 만드는거 스팀에도 등록해보고 플레이스토어도 올려볼 수 있는 단계까지 가능하면 좋겠다.

 

아무튼 게임은 언리얼과 유니티를 고민하다가 유니티로 만들기로 결정했다.

 

게임개발은 해본적도 본적도 전혀 없기 때문에 아주 기초적인 부분부터 정리할 생각이다.

 

+ Recent posts