728x90

이글은 인프런 [따라하면서 배우는 고박사의 유니티 기초] 강의를 수강하고 정리한 글이다. 

 

[지금 무료] 따라하면서 배우는 고박사의 유니티 기초 | 고박사 - 인프런

고박사 | 유니티로 게임을 개발하고 싶은 초보자를 대상으로 하며, 유니티 설치부터 2D/3D 게임 개발에 필요한 기초 지식까지 자세하게 설명합니다. (강의에 사용되는 모든 리소스는 영상 상단의

www.inflearn.com


플레이어 오브젝트와 이미지 분할

플레이어 오브젝트를 생성하고 사용할 이미지를 넣어준 후, Sprite 모드를 Multiple로 설정한다.

 

Sprite Editor View에서 분할을 해주는데 , Column 3  raw 1으로 설정하면아래와 같이 3개로 분할된 것을 확인할 수 있다. 이후 3개의 이미지 중 Player_Idle_0번에 넣어준다.

 

 

애니메이션 재생 설정

플레이어 오브젝트에 Animator 컴포넌트를 추가한다.

프로젝트 뷰에서 animator controller asset을 추가하고 player animator이라고 설정하였다.

 

 

대기 애니메이션 등록

프로젝트 뷰에서 애니메이션 오브젝트를 생성한 뒤, loop type은 반복 재생을 할지에 대한 여부를 선택할 수 있어서 체크하여 반복재생하도록 설정한다, 

animater controller은  Animator 뷰에서 수정 작업을 할 수 있으며, Animator View, Animation View의 내용을 수정할 때에 Project View에 있는 Animator Controller, Animation 파일을 선택하는 것이 아닌 animator controller가 포함된 플레이어 오브젝트를 선택하고 편집해야한다. .

기존에 생성되어 있는 노드들을 배치를 해주고, 후에 생성한 애니메이션 PlayerIdle을 등록한다.

 

 

다음으로 애니메이션이 날개짓을 하게끔 편집하도록 한다. 애니메이션 뷰에서 편집을 진행하며 플레이어 오브젝트가 날개짓이 재생할 수 있도록 Player_Idle의 0,1,2,1,0 순으로  배치하였다. 그리고 show sample rate를 이용해서 재생 속도를 조절 할 수 있다. 

 

 

 

사망 애니메이션 등록

idle 이미지와 이미지를 같이 분할해준다. 이후, PlayerDie라고 animation asset을 생성하고, Animator 뷰로 가서 PlayerDie 즉, 사망 애니메이션을 추가할 수 있다. 

 

이후에 사망 애니메이션의 애니메이션 설정한다. 따라서 Player 오브젝트를 선택하여 기존에 진행한 PlyerIdle이 아닌 PlayerDie를 등록한다.

 

 

상태전이를 이용한 애니메이션 전환

애니메이션들을 코드를 이용해 연결시킬 수 있으며 전환 조건은 animation view에서 설정할 수 있다. 

마우스 오른쪽을 눌러 Make Transition이라는 옵션을 선택한다.

Transition은 애니메이션이 전환될 수 있는 길을 열어주는 것으로 이것이 설정되어 있으면 애니메이션 전환이 가능하다. 아래와 같이 설정되면 게임 실행시 전환이 잘 진행되는걸 확인할 수 있으며, 원하는 시점에서 전환도 가능하다. 

728x90

이글은 인프런 [따라하면서 배우는 고박사의 유니티 기초] 강의를 수강하고 정리한 글이다. 

 

[지금 무료] 따라하면서 배우는 고박사의 유니티 기초 | 고박사 - 인프런

고박사 | 유니티로 게임을 개발하고 싶은 초보자를 대상으로 하며, 유니티 설치부터 2D/3D 게임 개발에 필요한 기초 지식까지 자세하게 설명합니다. (강의에 사용되는 모든 리소스는 영상 상단의

www.inflearn.com


Draw Call & Batches

 

Draw Call

  • CPU가 GPU에게 어떤 그림을 그려 달라고 요청하는 것
  • Draw Call 값이 적을수록 게임이 가벼우며, 기기에 따라 특정 개수를 넘기면 프레임 저하 현상을 일으킬 수 있다
  • 모바일의 경우 100을 넘기지 않는 것을 권장한다

Batches

  • Draw Call을 포함하는 상위 개념으로 Unity 5.0부터 Draw Call 대신 Batches를 기준으로 "Stats"에 렌더링 정보를 표현한다
  • Batches는 Mesh, Material, Shader, Draw Call 등의 정보를 종합적으로 계산한다

 

Sprite Altlas

  • 여러 장의 Sprite 이미지를 한 장의 텍스처에 모아 두고 사용하는 것으로 Unity는 Sprite Packer(Legacy)와 Sprite Atlas를 제공한다
  • Sprite Atlas 를 사용해야 하는 이유?
    • 2D 게임에서 배경이나 캐릭터, 적 등을 표현하는데 사용되는 이미지 에셋은 매번 렌더링 할 때마다 각 이미지 에셋 별로 1의 Batches가 발생된다
    • 예를 들어 게임에 사용되는 캐릭터, 적, 아이템 등 모두 다른 이미를 사용하는 오브젝트가 100개 있고, 동시에 게임에 등장한다면 Batches 는 100이다
    • 하지만 동일한 이미지를 사용하는 오브젝트가 100개 일 경우에는 Batches가 1이다
    • Sprite Atlas를 사용해 서로 다른 이미지를 하나의 텍스처에 모아 두고 사용하면 서로 다른 Sprite의 오브젝트를 100개 만든다고 해도 Batches 가 1일 것이다.

 

처음 scence를 생성했을 때, 그림을 표현한 오브젝트가 없기 때문에 Batches의 값은 0인 것을 확인할 수 있다.

 

새로운 오브젝트가 화면상에 추가되면, Batches의 값이 1로 바뀐 것을 확인할 수 있다. 기존의 오브젝트를 복제하면 Batches의 값이 2가 된 것을 확인할 수 있다.

 

오브젝트들을 복제하여 확인하면, 게임 오브젝트의 개수는 늘어났지만, 사용된 이미지 파일이 2개이기 때문에 Batches는 여전히 2개로 설정되어 있는 것을 확인할 수 있다.

 

남은 이미지들을 모두 오브젝트를 추가해서 화면에 배치를 하, 총 14개를 추가하여  Batches의 값이 14임을 확인할 수 있다.

 

이 Batches 의 값을 Sprite Atlas를 이용하여 조절할 수 있다. 프로젝트 뷰에 + 버튼을 눌러 Sprite Atlas를 생성해준다.

최초 생성했을 때, 옵션을 바꿀 필요 없이 Object for Packing 리스트에 Atlas로 묶을 이미지들을 등록할 수 있다.

하나씩 등록하는 방법이 있고, 여러 개를 동시에 하고자 한다면, Inspector 뷰 우측 상단에 자물쇠 모양을 걸어둔 후 프로젝트 뷰에 있는 이미지들을 모두 선택하여 한번에 등록하는 방법이 있다.

 

 

모두 넣었다면 Pack Preview 버튼을 클릭하여 설정을 완료해줄 수 있고, 아래 하단의 이미지와 같이 하나의 Sprite Atlas에 이미지들이 묶여있는 것을 확인할 수 있다.

이후 게임을 실행해보면, Batches의 정보 값이 Atlas 기준으로 변경되는 것을 확인할 수 있다. Atlas는 코드에 의해 실행이 되기 때문에 게임을 실행하기 전에는 확인할 수 없다.

 

 

Texture Asset

Texture Asset은 Inspector View에 다양한 정보가 출력된다.

Texture Type : 텍스처를 어떤 용도로 사용할지에 따라 설정하는 것

  • Sprite (2D and UI) : 2D Sprite 오브젝트나 UI에 텍스처를 적용할 때 설정
  • default : 일반적인 3D 오브젝트의 material에 적용할 때 설정

Sprite Mode

  • Single : 단일 이미지 전체를 사용
  • Multi : 개발자가 원하는 형태로 이미지를 분할해서 사용 (원본도 사용 가능)
  • Polygon : 우리가 외부에서 가져온 이미지에 설정하지 않음

Pixels Per Unit : 몇 픽셀을 Unity Scale 1로 설정할 것인가를 뜻한다.

Pivot : 텍스쳐의 중심 축

 

 

Sprite Editor

  • Sprite Mode(Single, Multiple, Polygon)에 따라 옵션이 달라진다.
  • Sprite의 위치, 크기, 경계, 중심점 편집 가능
  • Sprite를 분할하거나 폴리곤 점 개수를 수정하는 등의 편집이 가능

 

Sprite 모드가 Multiple일 경우 이미지를 분할할 수 있으며, 분할 방법은 불규칙한 형태로 분할할 경우 빈 곳을 드래그해서 새로운 분할 영역을 생성할 수 있고, 일정한 규칙으로 분할할 경우, 슬라이스 메뉴를 활용할 수 있다.

 

분할 타입

  • - Automatic : 텍스쳐를 자동으로 분할
  • - Grid By Cell Size : 우리가 설정하는 셀의 크기만큼으로 분할
  • - Grid By Cell Count : 가로, 세로 개수를 설정할 경우 그 개수 만큼 자동분할

게임에서 사용되는 텍스쳐 제작시에 POT 규격으로 제작해야한다. 

Polygon Sprites

기본적인 도형 이미지는 유니티 내부에서 제작가능하다. 

도형 이미지 에셋 제작을 하기 위해서 Project View에서 플러스 버튼을 눌러 스프라이트를 추가한다. Sprite Mode가 Polygon인지 확인한다.

Sprite Editor 메뉴로 들어가보면 Change Shape 메뉴에 Sides 변수 값에 따라 도형의 모양이 바뀌게 된다.

 

Sprite Animation

역동감있게 동작에 맞춰 이미지를 변화한다. 이를 Sprite Animation이라고 부르며, 이는 Sprite Renderer 컴포넌트에 이미지를 주기적으로 교체하는 것을 의미한다. 

2D Sprite Animation

 

Animation Asset

  • 하나의 애니메이션 동작을 저장하는 파일 ("걷기”, "뛰기“, "공격" 등)
  • 파일 생성 방법 : Project View - “+” - Animation

 

Animation View

  • Animation Asset에 하나의 애니메이션으로 구성되는 텍스처를 등록하는 View

 

Animator Controller Asset

  • 하나의 오브젝트가 가질 수 있는 애니메이션을 묶어서 관리하는 파일
  • 파일 생성 방법 : Project View - “+” - Animator Controller

 

Animator View

  • Animator Controller Asset에 애니메이션을 등록하는 View

 

Animator Component

  • 게임 오브젝트의 애니메이션 재생, 교체 등을 제어하는 역할을 수행한다.

 

728x90

이글은 인프런 [따라하면서 배우는 고박사의 유니티 기초] 강의를 수강하고 정리한 글이다. 

 

[지금 무료] 따라하면서 배우는 고박사의 유니티 기초 | 고박사 - 인프런

고박사 | 유니티로 게임을 개발하고 싶은 초보자를 대상으로 하며, 유니티 설치부터 2D/3D 게임 개발에 필요한 기초 지식까지 자세하게 설명합니다. (강의에 사용되는 모든 리소스는 영상 상단의

www.inflearn.com


강의를 시작하기에 앞서서 플레이어의 이동, 점프등 구현을 위해 2D 오브젝트를 생성하여 원하는 위치에 배치한다. 

  • 유니티 패키지 파일: 원하는 파일들을 하나로 묶어 다른 프로젝트로 전달할 때 사용
  • 패키지 파일 생성하기 : Project View에서 원하는 파일들을 선택한 후 마우스 오른쪽을 클릭 → Export Package로 저장
  • 패키지 파일 사용하기 : 파일을 적용하고 싶은 프로젝트의 Project View로 패키지 파일을 드래그앤 드롭으로 가져온다.

player 오브젝트는 중력을 받을 수 있도록 rigidbody2d들을 적용시키고 freeze rotation z를 선택하게 되면 이동할 때 z축으로 회전하지 않게 된다. 그리고 충돌 처리를 위해 Capsule Collider 2D를 추가한다.

Rigidbody2D 컴포넌트의 Constraints

  • Freeze Position: 물리에 의한 이동 중지
  • Freeze Rotation: 물리에 의한 회전 중지

 

 

 

플레이어 오브젝트 이동(Rigidbody2D)

플레이어 이동을 구현해보도록 movement2D 스크립트를 작성한다. 

using UnityEngine;

public class Movement2D : MonoBehaviour
{
    [SerializeField]
    private float speed = 5.0f; //이동 속도
    private Rigidbody2D rigid2D;


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


    public void Move(float x)
    {
        //x축 이동은 x*speed로, y축 이동은 기존의 속력 값(현재는 중력)
        rigid2D.velocity = new Vector2(x * speed, rigid2D.velocity.y);
    }
}

velocity 변수를 설정한다. 

 

그리고 PlayerController 스크립트를 작성하여 플레이어 좌우 방향키값을 입력하게 되면 movement2D에 함수의 키값을 적용에 오브젝트가 이동한다.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Movement2D movement2D;

    private void Awake()
    {
        movement2D = GetComponent<Movement2D>();
    }

    private void Update()
    {
        //left or a = -1 / right or d = 1
        float x = Input.GetAxisRaw("Horizontal");
        //좌우 이동 방향 제어
        movement2D.Move(x);
    }
}


플레이어 오브젝트 점프

플레이어 이동을 위한 Move 함수와 마찬가지로 Jump 함수를 추가한다.

Jump함수가 호출되면 y축 +방향으로 속력이 설정된다. 이때 점프의 정도는 jumpforce 변가 결정한다.

Jump함수는 PlayerController안에서 스페이스 바를 눌렀을 때 실행되도록 한다. 

using UnityEngine;

public class Movement2D : MonoBehaviour
{
    [SerializeField]
    private float speed = 5.0f; //이동 속도
    [SerializeField]
    private float jumpForce = 8.0f; //점프 힘(클수록 높게 점프)
    private Rigidbody2D rigid2D;


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


    public void Move(float x)
    {
        //x축 이동은 x*speed로, y축 이동은 기존의 속력 값(현재는 중력)
        rigid2D.velocity = new Vector2(x * speed, rigid2D.velocity.y);
    }
    public void Jump()
    {
        //jumpForce의 크기만큼 윗쪽 방향으로 속력 설정
        rigid2D.velocity = Vector2.up * jumpForce;
    }
}

위에 코드에서는 아무런 제약없이 무한히 점프할 수 있다.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Movement2D movement2D;

    private void Awake()
    {
        movement2D = GetComponent<Movement2D>();
    }

    private void Update()
    {
        //left or a = -1 / right or d = 1
        float x = Input.GetAxisRaw("Horizontal");
        //좌우 이동 방향 제어
        movement2D.Move(x);

        //플레이어 점프(스페이스 키를 누르면 점프)
        if (Input.GetKeyDown(KeyCode.Space))
        {
            movement2D.Jump();
        }
    }
}

 

 

낮은 점프, 높은 점프

 

using UnityEngine;

public class Movement2D : MonoBehaviour
{
    [SerializeField]
    private float speed = 5.0f; //이동 속도
    [SerializeField]
    private float jumpForce = 8.0f; //점프 힘(클수록 높게 점프)
    private Rigidbody2D rigid2D;
    [SerializeField]
    public bool isLongJump = false; // 낮은/높은 점프 체크


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

    private void FixedUpdate()
    {
        //낮은 점프, 높은 점프 구현 위한 중력 계수 조절 Jump Up일 때만 적용)
        //중력 계수가 낮은 if문은 높은 점프가 되고, 중력 계수가 높은 else문은 낮은 점프가 됨.
        if (isLongJump && rigid2D.velocity.y > 0)
        {
            rigid2D.gravityScale = 1.0f;
        }
        else
        {
            rigid2D.gravityScale = 2.5f;
        }
    }


    public void Move(float x)
    {
        //x축 이동은 x*speed로, y축 이동은 기존의 속력 값(현재는 중력)
        rigid2D.velocity = new Vector2(x * speed, rigid2D.velocity.y);
    }
    public void Jump()
    {
        //jumpForce의 크기만큼 윗쪽 방향으로 속력 설정
        rigid2D.velocity = Vector2.up * jumpForce;
    }
}

 

jump키를 눌렀는지 판단하는 isLongJump변수가 PlayerController에서 GetKey로 설정된다.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Movement2D movement2D;

    private void Awake()
    {
        movement2D = GetComponent<Movement2D>();
    }

    private void Update()
    {
        //left or a = -1 / right or d = 1
        float x = Input.GetAxisRaw("Horizontal");
        //좌우 이동 방향 제어
        movement2D.Move(x);

        //플레이어 점프(스페이스 키를 누르면 점프)
        if (Input.GetKeyDown(KeyCode.Space))
        {
            movement2D.Jump();
        }
        //스페이스 키를 누르고 있으면 isLongJump=true
        if(Input.GetKeyUp(KeyCode.Space))
        {
            movement2D.isLongJump = true;
        }
        //스페이스 키를 떼면 isLongJump=false
        else if (Input.GetKeyUp(KeyCode.Space))
        {
            movement2D.isLongJump = false;
        }
    }
}

스페이스바를 길게 누르냐 짧게 누르냐에 따라 점프의 높이가 달라진다. 길게 눌렀을 때랑 크게 다른 점은 없지만 이중점프가 가능했다..

 

 

 

바닥 판정 및 점프 제어

바닥에 닿아 있을 때만 플레이어가 뛸 수 있도록 설정하는 코드를 작성해보겠다. 

플레이어의 발 위치를 알아야 하며, 코드에서 내가 설정한 collider과 맞게 설정해주어야한다. 

 

충돌이 일어나면 isGrounded 변수가 참이 된다.

using System;
using UnityEngine;

public class Movement2D : MonoBehaviour
{
    [SerializeField]
    private float speed = 5.0f; //이동 속도
    [SerializeField]
    private float jumpForce = 8.0f; //점프 힘(클수록 높게 점프)
    private Rigidbody2D rigid2D;
    [SerializeField]
    public bool isLongJump = false; // 낮은/높은 점프 체크

    [SerializeField]
    private LayerMask groundLayer; //바닥 체크를 위한 충돌 레이어
    private CapsuleCollider2D capsuleCollider2D; //오브젝트의 충돌 범위 컴포넌트
    private bool isGrounded; //바닥 체크 (바닥에 닿아있을 때 true)
    private Vector3 footPosition; //발의 위치


    private void Awake()
    {
        rigid2D = GetComponent<Rigidbody2D>();
        capsuleCollider2D = GetComponent<CapsuleCollider2D>();
    }

    private void FixedUpdate()
    {
        //플레이어 오브젝트의 Collider2D min, center, max 위치 정보
        Bounds bounds = capsuleCollider2D.bounds;
        //플레이어의 발 위치 설정
        footPosition = new Vector2(bounds.center.x, bounds.min.y);
        //플레이어의 발 위치에 원을 생성하고, 원이 바닥과 닿아있으면 isGrounded = true
        isGrounded = Physics2D.OverlapCircle(footPosition, 0.1f, groundLayer);

        //낮은 점프, 높은 점프 구현 위한 중력 계수 조절 Jump Up일 때만 적용)
        //중력 계수가 낮은 if문은 높은 점프가 되고, 중력 계수가 높은 else문은 낮은 점프가 됨.
        if (isLongJump && rigid2D.velocity.y > 0)
        {
            rigid2D.gravityScale = 1.0f;
        }
        else
        {
            rigid2D.gravityScale = 2.5f;
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.blue;
        Gizmos.DrawSphere(footPosition, 0.1f);
    }


    public void Move(float x)
    {
        //x축 이동은 x*speed로, y축 이동은 기존의 속력 값(현재는 중력)
        rigid2D.velocity = new Vector2(x * speed, rigid2D.velocity.y);
    }

    public void Jump()
    {
        if(isGrounded == true)
        {
            //jumpForce의 크기만큼 윗쪽 방향으로 속력 설정
            rigid2D.velocity = Vector2.up * jumpForce;
        }
    }
}

땅으로 사용되는 모든 오브젝트의 layer 값을 Ground로 바꿔주고, 플레이어 오브젝트에도 Ground Layer 변수를 Ground로 설정한다.  Movement2D에  게임을 실행하면, 땅에 닿아야지 점프가 되는 것을 확인할 수 있다.

 

최대 점프 횟수 설정

점프하는 횟수 조절을 할 수 있도록 하여 2단,3단 점프가 가능하게끔 코드를 짠다. 

using UnityEngine;

public class Movement2D : MonoBehaviour
{
    [SerializeField]
    private float   speed = 5.0f; //이동 속도
    [SerializeField]
    private float   jumpForce = 8.0f; //점프 힘(클수록 높게 점프)
    private         Rigidbody2D rigid2D;
    [SerializeField]
    public bool     isLongJump = false; // 낮은/높은 점프 체크

    [SerializeField]
    private LayerMask           groundLayer; //바닥 체크를 위한 충돌 레이어
    private CapsuleCollider2D   capsuleCollider2D; //오브젝트의 충돌 범위 컴포넌트
    private bool                isGrounded; //바닥 체크 (바닥에 닿아있을 때 true)
    private Vector3             footPosition; //발의 위치

    [SerializeField]
    private int       maxJumpCount = 2; //땅을 밟기 전까지 할 수 있는 최대 점프 횟수
    private int       currentJumpCount = 0; //현재 가능한 점프 횟수


    private void Awake()
    {
        rigid2D =           GetComponent<Rigidbody2D>();
        capsuleCollider2D = GetComponent<CapsuleCollider2D>();
    }

    private void FixedUpdate()
    {
        //플레이어 오브젝트의 Collider2D min, center, max 위치 정보
        Bounds bounds = capsuleCollider2D.bounds;
        //플레이어의 발 위치 설정
        footPosition = new Vector2(bounds.center.x, bounds.min.y);
        //플레이어의 발 위치에 원을 생성하고, 원이 바닥과 닿아있으면 isGrounded = true
        isGrounded = Physics2D.OverlapCircle(footPosition, 0.1f, groundLayer);


        //플레이어의 발이 땅에 닿아 있고, y축 속도가 0이하이면 점프 횟수 초기화
        //velocity.y <= 0을 추가하지 않으면 점프키를 누르는 순간에도 초기화가 되어
        //최대 점프 횟수를 2로 설정하면 3번까지 점프가 가능하게 된다.
        if(isGrounded == true && rigid2D.velocity.y <=0)
        {
            currentJumpCount = maxJumpCount;
        }

        //낮은 점프, 높은 점프 구현 위한 중력 계수 조절 Jump Up일 때만 적용)
        //중력 계수가 낮은 if문은 높은 점프가 되고, 중력 계수가 높은 else문은 낮은 점프가 됨.
        if (isLongJump && rigid2D.velocity.y > 0)
        {
            rigid2D.gravityScale = 1.0f;
        }
        else
        {
            rigid2D.gravityScale = 2.5f;
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.blue;
        Gizmos.DrawSphere(footPosition, 0.1f);
    }


    public void Move(float x)
    {
        //x축 이동은 x*speed로, y축 이동은 기존의 속력 값(현재는 중력)
        rigid2D.velocity = new Vector2(x * speed, rigid2D.velocity.y);
    }

    public void Jump()
    {
        //if(isGrounded == true)
        if (currentJumpCount > 0)
        {
            //jumpForce의 크기만큼 윗쪽 방향으로 속력 설정
            rigid2D.velocity = Vector2.up * jumpForce;
            //점프 횟수 1 감소
            currentJumpCount--;
        }
    }
}

위에 코드에서 maxJumpCount 변수의 값으로 2번이라 했기 때문에 최대 점프 값이 2번임을 알 수 있다.


오브젝트 마찰력 설정

위에 게임들을 실행하였을 때 마찰력에 의해 벽면에 플레이어가 붙어 버린다. 이것을 조작하려면 프로젝트 뷰에서 physics Meterial 2D를 설정하면 된다.

728x90

 

이글은 인프런 "솔리디티 깨부수기" 강의 내용을 정리한 글이다.

 

[지금 무료] 솔리디티 깨부수기 | D_One - 인프런

D_One | 이 강의를 통해서, 스마트 컨트랙 제작을 위한 솔리디티 언어를 배울수 있습니다., 코딩이 처음인 분들도 OK! 처음 배우는 솔리디티, 쉽게 시작해보세요. 강의 주제 📖 [사진] 이 강의에서

www.inflearn.com

 


Solidity 란?

솔리디티는 *스마트 컨트랙트를 구현하기 위한 컨트랙트 기반의 고급 프로그래밍 언어이다. 

더보기

스마트 컨트랙트(smart-contracts)

 

미리 정의된 조건이 충족되었다면 블록체인 안에 저장된 프로그램이 작동하는 것

예를 들어, 3의 배수 번째 사람에게 돈을 준다라고 조건에서 4명의 사람들이 각각 5천원씩 갖는다고 가정했을 때, 첫번째, 두번째 사람이 각각 오천원씩 넣었을 때, 스마트 컨트랙트에서는 3의 배수가 아니기 때문에, 스마트 컨트랙트가 돈을 가지게 된다.

세번재 사람이 5천원을 준다면 만 오천원이 되어서 3의 배수 조건이 충족되어서 세번째 사람에게 돈이 가게 된다. 조건이 충족이 됬을 때 이 스마트 컨트랙가 작동한다. 

 

솔리디티 언어를 접하기 위해서 리믹스(remix)를 사용할 예정이다. 

 

Remix - Ethereum IDE

 

remix.ethereum.org

remix

 

코드 작성할 때, 라이센스를 윗줄에 명시 > 0이 나지 않는다. 

이후에 컴파일 버전을 명시한다. 위의 이미지는 솔리디티 버번이 0.7에서 0.9 미만까지 사용하겠다고 명시한다.

이후에 컨트랙트를 "Hello" 라고 명시한 뒤에 "Hello Solidity" 출력하는 코드를 작성하였다. 코드 끝에 세미 콜론을 붙여야 에러가 나지 않는다. 

코드 컴파일을 위해 컴파일 버전을 선택해야한다. 컴파일 버전  중 제일 높은 버전인 0.8.25 버전을 사용하도록 하겠다. 이후 컴파일을 진행한다. 

Deploy를 누르면 hello라는 컨트랙트에 hi 변수에 "Hello solidity"가 출력되는 컨트랙트가 배포되는 것을 확인할 수 있다.

 

 


Data Type

솔리디티는 크게 3가지 데이터 타입, 레퍼런스 타입, 맵핑 타입으로 나뉜다. 이번 목차에서는 데이터 타입에 대해 다룰 예정이다. 데이터 타입에는 boolean, bytes, address, uint 4가지가 있다. 

 

boolean

boolean은 true와 false 두 값을 가지며, 데이터 타입을 먼저 선언하고, 접근 제한자와 변수명을 작성한다. boolean의 경우 다른 언와 마찬가지로 논리 연산자를 사용한다.

위의 코드를 컴파일해서 deploy 하면 다음과 같은 결과가 나오게 된다, 이때 ctrl + s 단축키로 컴파일이 가능하다.

 

bytes

byte는 1바이트부터 32바이트까지 저장할 수 있다. 바이트의 크기를 byte4 이런 식으로 명시할 수 있으며, 명시하지 않고 문자열을 넣어도 자동으로 바이트 크기가 정해진다.

 

 

address 

address는 고유 주소를 나타내며, 스마트 컨트랙트를 배포할 때마다 address를 얻게 된다. 주소의 크기는 20바이트로 총 길이는 40개이다. 배포할 때 마다 주소가 바뀌는 것을 확인할 수 있다. 

 

uint

uint와 int의 차이점은 음수의 값을 쓰는지 안쓰는 지에 나뉘게 된다. uint의 경우 unsigned integer 로 기호가 없는 integer이다. uint와 int의 범위는 해당 강의의 기술 블로그에 자세하게 나와있다. 

int : 기호있는 integer 
int8 : -2^7 ~ 2^7-1
int16: -2^15~2^15-1
int32: -2^31~2^31-1
int64: -2^63~2^63-1
int128 : -2^127~2^127-1
int256 (=int): -2^255~2^255-1

uint:  기호없는 integer 
uint8 : 0~2^8-1
uint16: -0~2^16-1
uint32: -0~2^32-1
uint64: -0~2^64-1
uint128 : -0~2^128-1
uint256 (=uint): 0~2^256-1

 

간단하게 숫자 연산자로 사용이 가능하며, 범위를 넘기지 않도록 주의해야한다.

728x90

이 글은 "따라하면서 배우는 고박사의 유니티 기초" 강의를 정리한 글이다. 

 

[지금 무료] 따라하면서 배우는 고박사의 유니티 기초 | 고박사 - 인프런

고박사 | 유니티로 게임을 개발하고 싶은 초보자를 대상으로 하며, 유니티 설치부터 2D/3D 게임 개발에 필요한 기초 지식까지 자세하게 설명합니다. (강의에 사용되는 모든 리소스는 영상 상단의

www.inflearn.com


Destroy(Component)

Destroy() 함수는 오브젝트를 삭제하는 함수로 입력되어 있는 오브젝트나 컴포넌트를 삭제한다. 

게임이 진행하는 도중 영구적으로 사라져야 하는 아이템 오브젝트와 같은 것을 Destroy 함수를 이용해 삭제하면 된다. 

빈 오브젝트를 생성해서 위의 DestroyScript 코드를 컴포넌트에 추가하고 Player Object 변수에 플레이어를 등록한다. 실행하면 플레이어 컴포넌트의 controller가 사라진 것을 확인할 수 있다. 


Destroy(GameObject)

Destroy 함수의 매개변수에 게임 오브젝트를 등록하게 되면 게임 오브젝트가 삭제되는 것을 확인할 수 있다. 


Destroy(GameObject, time)

이전 예제처럼 바로 삭제도 가능하지만 두 번째 매개변수에 설정한 시간만큼 흐른 뒤에 삭제도 가능하다. 

플레이어가 2초 뒤에 사라지는 것을 확인할 수 있다. 


특정 범위를 벗어났을 때 오브젝트 삭제

오브젝트가 특정 위치에 벗어났을 때 오브젝트가 삭제되는 예제를 진행할 것이다. 

위의 스크립트를 각각 box, circle, triangle 에 컴포넌트로 적용한다.이후 실행하면 화면 밖으로 벗어나면 사라지는 것을 확인할 수 있다. 


특정 오브젝트와 충돌했을 때 오브젝트 삭제

특정 오브젝트와 충돌했을 때, 오브젝트를 삭제하는 예제를 진행하겠다.

장애물로 사용할 벽 오브젝트를 새로 생성한다. 이 오브젝트는 충돌이 가능하기 때문에 Rigidbody 2D의 gravity scale을 0으로 설정하고, Box Collider 2D 추가해 is trigger을 설정해준다.

 

플레이어가 총알을 쏴서 맞출 것이기에 circle Prefab에도 Box Collider 2D를 추가한다. 

스크립트는 다음과 같이 작성하였고 wall 오브젝트에 추가한다.  총알을 맞으면 벽이 빨갛게 변한다.

+ Recent posts