목록Game Dev/Unity : Tutorial (15)
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...
Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-4 : tag 사용하기 유니티는 tag 를 이용해 게임 오브젝트를 쉽게 식별할 수 있다. 예를 들어, 플레이어가 충돌하면 점수를 올리는 코드를 짠다고 가정해 보자. private void OnCollisionEnter(Collision other) { if (other.gameObject.tag == "Player") { GetComponent().material.color = Color.red; gameObject.tag = "Hit"; } } 위 코드는 플레이어와 해당 오브젝트가 충돌을 하면 색깔을 빨간색으로 바꾸고, 현 게임 오브젝트의 태그를 Hit 으로 변경한다. 이때, 충돌한 오브젝트가 플레이어인지 아닌지 판단을 하기 위해..
Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-3 : Time.time 사용하기 Time.time 을 사용하면, 게임에서 얼마만큼의 시간이 흘렀는지를 체크할 수 있다. 다음 코드를 보자. public class Dropper : MonoBehaviour { [SerializeField] float DropTime = 3.0f; MeshRenderer meshRenderer; Rigidbody DropperRigidBody; void Start() { DropperRigidBody = GetComponent(); DropperRigidBody.useGravity = false; meshRenderer = GetComponent(); meshRenderer.enabled = fal..
Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-2 : CineMachine 사용하기 일반적인 게임들은 플레이어의 움직임에 카메라 시점이 연동되서 같이 움직인다. CineMachine 을 사용하면 해당 기능을 간단하게 구현할 수 있다. 먼저, Window -> Package Manager 로 들어가서, Packages 설정을 Unity Registry 로 바꾼다. 그 후, Cinemachine 을 검색해 설치한다. Cinemachine 에서 Virtual Camera 를 생성하고, MainCamera 에 CinemachineBrain 이라는 컴포넌트를 추가한다. 위 사진에서는 Live Camera 로 Virtual Follow Camera 가 들어가 있는데, 아까 전에 만든 Vi..
Udemy 강좌를 들으며 내용 복습을 위해 기록하는 글입니다 유니티 #1-1 : SerializeField 사용하기기 변수를 선언할 때, 다음과 같이 앞에 [SerializeField] 를 붙여주면, 에디터 내에서도 실시간으로 해당 값을 조정할 수 있다. public class Mover : MonoBehaviour { [SerializeField] float moveSpeed = 10.0f; void Update() { MovePlayer(); } void MovePlayer() { float xValue = Input.GetAxis("Horizontal"); float zValue = Input.GetAxis("Vertical"); transform.Translate(xValue * moveSpeed..
벡터 벡터는 방향과 크기를 가진다. 벡터 (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이든..