목록Game Dev/Unity (레트로) (11)
KoreanFoodie's Study

캐릭터 애니메이션 클립 만들기 먼저, 애니메이션 창을 연다. Player 오브젝트를 클릭 후, Create 를 누른다. 그 후, 우리가 만드려는 애니메이션에 필요한 스프라이트들을 Animation 창으로 드래그&드랍한다. 그럼 다음과 같이 해당하는 키프레임 위에 스프라이트들이 올라가는데, Samples 값을 조절해 속도를 조절할 수 있다. Samples 의 값은 1초당 스프라이트가 얼마나 자주 교체되는지를 의미한다. 이제 Die 애니메이션 클립을 만들어 보자. Run 에서 Create New Clip... 을 누르고, Die.anim 으로 저장한다. 마찬가지로 Samples 값을 설정한다. Die 의 경우 딱 한 번만 재생될 것이므로 루프를 해제한다. 이제 다음으로는 FSM (유한 상태 머신) 을 이용해..

유니티에서 오디오 (소리) 재생하기 유니티에서 플레이어가 소리를 내도록 만들고 싶을 때는, 오디오 소스 컴포넌트를 붙이면 된다. 그 후, 스크립트에서 사용할 AudioClip 과 AudioSource 변수를 정의하고, 플레이어 스크립트의 AudioClip 변수에 적절한 오디오 소스 파일을 드래그&드랍해서 넣어준 다음, 실제 타이밍에 맞게 Play 나 PlayOneShot 등의 메소드를 활용하면 된다! 혹은 다음과 같이 구현해도 된다 : // 오디오 소스 컴포넌트에 내장된 클립을 변경 playerAudioPlayer.clip = deathClip; playerAudioPlayer.Play(); 오디오 소스 컴포넌트가 재생하는 소리는 오디오 리스너 컴포넌트가 듣는다. MainCamera 의 경우, Audio..

스프라이트 자르기 픽셀 아트 이미지를 이용해서, 간단한 스프라이트 애니메이션을 만들어 보자. 예를 들어, 다음과 같이 캐릭터가 죽는 스프라이트가 한꺼번에 한 파일로 들어왔다고 해 보자. Inspector 창에서 Sprite Mode 를 Multiple 로 바꾼 다음,Sprite Editor 를 열자. 스프라이트 에디터 왼족 상단에 Slice 에서 Grid By Cell Size 를 클릭한다. 그 후 적절한 사이즈로 스프라이트를 자르면 다음과 같이 스프라이트가 잘린 것을 확인할 수 있다! 오른쪽 상단의 Apply 를 누른 후 종료하자.

지역 공간과 전역 공간 위의 큐브는 y 축을 기준으로 회전을 가해졌다. 현재 트랜스폼의 좌표계는 지역공간으로 나와 있는데, 이를 전역 공간 (게임 월드를 기준) 으로 바꿔서 옮겨볼 수도 있다. 지역 공간은 부모 오브젝트를 기준으로 하며, 오브젝트 공간은 자기 자신을 기준으로 한다. 지역 공간이 부모 오브젝트를 기준으로 하기 때문에, 큐브 A 의 자식 큐브 B 를 설정한 후 큐브 A 를 회전하면, 큐브 B 의 공간도 회전된 상태로 트랜스폼이 이동과 회전이 이루어질 것이다. 인스펙터 창에 표시되는 위치, 회전, 스케일은 지역 공간 기준으로 측정된 값이다. 평행이동과 회전 예제 // 기본적으로 지역 공간을 기준으로 평행이동 transform.Translate(new Vector3(0, 1, 0) * Time...

벡터 벡터는 방향과 크기를 가진다. 벡터 (1, 0, 2)이 있을때, 해당 벡터의 크기는 sqrt(1^2 + 2^2)이 된다. 유니티는 Vector2, Vector3, Vector4 타입을 지원한다. 새로운 벡터를 만들 때는 생성자를 호출하면 된다. // Vector는 클래스가 아니라 구조체이다! public struct Vector3 { public float x; public float y; public float z; // Vector3 내부 코드 } Vector3 a = new Vector3(0, 0, 0); Vector3 b = a; b.x = 100; 벡터의 연산 내적과 외적의 의미를 이해하는 것이 중요하다. 백터의 내적은 Dot Product라고하는데, a · b 라고 하면, 벡터 b를 a의..

바닥 회전 Rotate( ) 메서드를 이용해서 물체를 회전시킬 수 있다. public class Rotator : MonoBehaviour { public float rotationSpeed = 60f; // Update is called once per frame void Update() { transform.Rotate(0f, rotationSpeed * Time.deltaTime, 0f); } } 위에서 rotationSpeed에 Time.deltaTime을 곱합으로써, 어떤 기기에서도 안정적으로 1초마다 rotationSpeed만큼의 각도의 회전을 줄 수 있다. Update( ) 는 1프레임마다 실행되며, Time.deltaTime은 ( 1 / 초당 프레임 수)이므로, 프레임이 60이든 120이든..

프리팹 게임 오브텍트는 프리팹으로 만들어 재활용할 수 있다. 마치, 칼을 찍어내는 주물이라고 생각하면 된다! 사용법은 간단하다. Hierarchy에 있는 오브젝트를 프로젝트 창에 드래그&드랍 해주기만 하면 된다! Use Gravity 리지드 바디 컴포넌트의 Use Gravity 필드를 해제하면 중력의 영향을 받지 않는다. transform 변수 transform은 스크립트에서 자신의 트랜스폼 컴포넌트로 바로 접근하는 지름길이다! Destroy( ) void Start() { // 이동에 사용할 리지드바디 컴포넌트 할당 bulletRigidbody = GetComponent(); // 리지드바디의 속도 = 앞쪽 방향 * 이동 속력 bulletRigidbody.velocity = transform.forwa..

머티리얼 게임 오브젝트의 컬러는 머티리얼(Material)이 결정한다. 머티리얼은 셰이더와 텍스쳐가 합쳐진 에셋으로, 오브젝트의 픽셀 컬러를 결정한다 셰이더는 주어진 입력에 따라 픽셀의 최종 컬러를 결정하는 코드이다. 셰이더는 질감과 빛에 의한 반사와 굴절 등의 효과를 만든다. 텍스처는 표면에 입히는 이미지 파일이다. 셰이더는 물감으로, 텍스처는 스케치나 밑그림으로 이해하면 된다. 밑그림이 같아도 물감의 종류에 따라 화풍이 달라진다! 이 중 알베도(Albedo)는 반사율이라는 뜻으로, 물체가 어떤 색을 반사할지를 결정한다! C# 스크립트 이제 기초적인 코드들을 살펴보자. void FixedUpdate() { if (Input.GetKey(KeyCode.UpArrow) == true) { playerRig..

목표 : 씬에 큐브를 하나 만들고, 코드로 해당 큐브가 점프하게 만들어 보자! 1. Hierarchy 탭에서 3D Object 큐브를 하나 생성하기 2. 변수로 리지드 바디 컴포넌트 사용하기 (Inspector -> Add Component) 3. 프로젝트 창에서 Create > C# Script 클릭, 이름을 Jumper로 변경한 후 열기! C#에서는 초기 파일 이름과 동일한 클래스가 생성되므로, 이름을 잘 맞추어 주어야 한다. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Jumper : MonoBehaviour { public Rigidbody myRigidbody; // Start..

상속? 객체 지향언어에서 상속을 사용하면 기존에 만들어놓은 템플릿을 확장/수정함으로써 비슷한 템플릿을 만들 수 있다. (상속에 대해 잘 모른다면 여기를) 그런데 예를 들어, "HUMAN"이라는 클래스를 만들었다고 하자. 만약 이 클래스를 확장시켜 플레이어, NPC, 심지어 몬스터까지 만든다면 어떨까? 각각의 오브젝트는 성격이 매우 다르기 때문에 오히려 상속을 통한 작업이 효율을 떨어뜨릴 수 있다. 따라서, 컴포넌트 패턴을 알아야 한다. 컴포넌트 패턴 기획자는 게임에 등장할 모든 동물을 사전에 기획할 수 없다. 즉, 부품마다 대표 기능을 부여하고, 여러 부품을 게임 오브젝트에 조합하는 방식이 효율적이다! 1. 컴포넌트를 미리 여러 개 만들기 2. 빈 게임 오브젝트 생성하기 3. 코뿔소 게임 오브젝트 완성하..