티스토리 뷰
728x90
반응형
게임 제작 흐름 : 프로젝트 작성 - Physics 사용 - 스크립트 이동 - 애니메이션 - 무대작성 - 카메라 이동 - 충돌판정 - 씬 전환
Physics? 오브젝트를 간단하게 물리 동작에 맞춰 움직일 수 있음 ~> 액션, 슈팅 게임에 이상적 | Rigidbody와 Collider 컴포넌트로 구성
- Rigidbody : 힘 계산(물체에 작용하는 중력, 마찰 등의 힘 계산)
- Collider : 물체의 충돌 판정 담당
- 오브젝트에 Physics 적용하기
- [Hierarchy]에서 오브젝트 선택 - [Insperctor] - [Add Component] - [Physics 2D] - [Rigidboby 2D]로 적용
- [Hierarchy]에서 오브젝트 선택 - [Insperctor] - [Add Component] - [Physics 2D] - [Circle Collider 2D]로 적용
- Circle Collider를 추가하고 나면, 요로코롬 충돌 판정용 원 콜라이더가 추가된다.
- Circle Collider : 원형 콜라이더
- Box Collider : 사각형 콜라이더
- Edge Collider : 선형 콜라이더 | 오브젝트 일부를 충돌 판정할 때 사용
- Polygob Collider : 다각형 콜라이더 | 오브젝트에 정확히 맞도록 충돌 판정할 때 사용
중력의 영향을 받지 않도록 설정
- [Rigidbody 2D] - [Body Type] - [Kinematic] 선택
작용하는 중력을 조절하기
- [Rigidbody 2D] - [Gravity Scale] - 숫자로 조절(보통은 1이 기본, 숫자를 높일수록 무거워짐)
콜라이더 모양 조정하기
- 지금 고양이의 콜라이더가 원형이라 너무 둔탁하다! 그러니 반 캡슐형 콜라이더를 사용해보자
- Circle Collider + Box Collider = Semi-capsule Collider
- 콜라이더 사이즈들을 아래와 같이 조정하면 오른쪽처럼 콜라이더가 생긴다.
- 반캡슐형 콜라이더는 발 밑이 원형이므로 외부 힘을 조금만 받아도 쉽게 넘어지기 때문에, 넘어지지 않도록 Freeze Rotation을 설정
- Freeze Rotation : 지정한 축의 회전을 방지
- [Inspector] - [Rigidbody 2D] - [Constraints] - [Freeze Rotation] - [ㅁZ] 체크하기
여러가지 Find 메서드
- Find(오브젝트이름) : 씬 중, 일치하는 게임 오브젝트를 한개 찾아 반환
- FindWithTag(태그이름) : 태그 이름과 일치하는 게임 오브젝트를 한 개 찾아 반환
- FindGameObjectsWithTag(태그이름) : 태그이름과 일치하는 게임 오브젝트를 여러 개 찾아 반환 | 반환 값은 GameObject 배열
- FindObjectOfType(타입이름) : 타입 이름과 일치하는 게임 오브젝트를 한 개 찾아 반환
- FindObjectsOfType(타입이름) : 타입 이름과 일치하는 게임 오브젝트를 여러 개 찾아 반환 | 반환 값은 Object 배열
Physics를 사용하면 오브젝트 좌표를 직접 변경하지 않아도 오브젝트에 힘을 가해 이동할 수 있다!
- 한번 플레이어에 힘을 가하면 이후 움직임은 Physics가 자동으로 계산함
- Rigidbody 2D가 가진 AddForce 메서드를 사용해 구현
움직이는 방향에 따라 플레이어 이미지 반전
- → 를 누르면 X축 방향으로 1배, ←를 누르면 X축으로 -1배한다는 의미
if (key != 0)
{
transform.localScale = new Vector3(key, 1, 1);
}
애니메이션 만들기
- 스프라이트 애니메이션 : 움직임을 조금씩 변경한 스프라이트를 준비해 일정 간격으로 바꿔주는 방식 → 유니티에선 메카님 구조 사용
- 메카님 : 유니티 에디터에서 일관되게 조작할 수 있는 기능 | 게임 설계시 스프라이트 애니메이션을 작성해 각 애니메이션의 교체 시기 지정 가능 → 게임 플레이시 메카님이 오브젝트 상태를 판단하고 자동으로 애니메이션을 바꿔 재생할 수 있다!
- 애니메이션 클립 : 스프라이트 애니메이션을 사용할 수 있도록 스프라이트를 정리한 파일... 재생할 스프라이트 정보, 재생속도, 재생시간 등 정보 설정
- 애니메이터 컨트롤러 : 애니메이션 클립을 정리한 것 | 어니 시점에 어느 애니메이션 클립을 재생할지 지정
- 애니메이션 하려는 오브젝트에 있는 Animator 컴포넌트에 애니메이터 컨트롤러를 설정하면, 애니메이터 컨트롤러에서 정의한 애니메이션 재생 가능
- [Hierarchy]에서 오브젝트 선택 - 메뉴바에서 [Window] - [Animation] - [Animation] 선택
- 여기서 [Create] - 파일명 입력 후 [Save] 를 하면 플레이어에 Animator 컴포넌트가 적용이 됨
- 이제 걷기 애니메이션 만들기 ~.~
- [Animation] 창에서 [Add Property] - [Sprite Renderer] 옆에 펼쳐서 [Sprite] 추가(+)
- [Animation] 창에 이미지 추가 후 끝나는 타이밍 위치를 선택하고, [Add Keyframe] 클릭
- 이 상태에서 실행하면, 조작하지 않는 상황에도 애니메이션은 계속 돌아감... 그래서 코드 추가가 필요하다!
- 속도 0에서 정지, 이동 속도가 빨라질수록 애니메이션 속도도 빨라짐... 애니메이션 재생 속도를 바꾸려면 Animator 컴포넌트의 speed 변수를 바꾸면 됨!
// 플레이어 속도에 맞춰 애니메이션 속도를 바꾼다
this.animator.speed = speedx / 2.0f;
플레이어 이동에 맞춰 카메라 움직이기
- 이 코드는 Main Camera에 적용
- Vector2가 아닌 Vector3를 사용하는 이유? 2D 프로젝트여도 카메라 위치는 3D(Vector3)로 표현되기 때문이다!
// 카메라가 플레이어의 y좌표(세로 위치)를 따라다니도록 만드는 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
GameObject player;
void Start()
{
// 씬 안에 있는 "cat"이라는 이름의 오브젝트를 찾아서 player에 저장
this.player = GameObject.Find("cat");
}
void Update()
{
// 카메라의 x/z 위치는 그대로 두고, y 위치만 플레이어와 일치시킴
Vector3 playerPos = this.player.transform.position;
transform.position = new Vector3(transform.position.x, playerPos.y, transform.position.z);
}
}
Physics를 이용해 충돌 판정
- Collider 컴포넌트를 적용한 오브젝트들이 충돌했을 때, Physics가 자동으로 닿았는지 판정 가능
- Collision모드(충돌모드) : 충돌 판정은 물론 충돌했을 때 주변에 미치는 영향까지 포함해 충돌 반응 실행
- Trigger모드(통과모드) : 충돌 판정만 하고, 충돌 응답은 실행 X
- Physics의 충돌 판정 조건 : 판정할 모든 오브젝트에 Collider 컴포넌트가 적용되어 있어야 한다 && 충돌을 판정할 오브젝트 중 적어도 한쪽에는 Rigidbody 컴포넌트가 적용되어 있어야 한다
- 예제에선 깃발에 Collider 컴포넌트 적용함
- [Add Component] - [Box Collider 2D] - [Is Trigger] 체크
씬 전환하기
- [File] - [New Scene] - [Basic 2D(Built-in)] - [Create] - [Save As] - 이름 설정 후 [Save]
- LoadScene : 매개변수로 받은 씬 이름의 씬을 로드하는 메서드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; // LoadScene을 사용하는 데 필요하다
public class ClearDirector : MonoBehaviour
{
void Update()
{
if (Input.GetMouseButtonDown(0))
{
SceneManager.LoadScene("GameScene");
}
}
}
- 빈 오브젝트 생성 - 이름 변경 후 위 스크립트 적용
씬 등록하기
- 메뉴바 - [File] - [Build Settings] - ClearScene, GameScene을 Build Settings 창의 Scenes In Build 영역으로 드래그&드롭
- 이때 GameScene은 0, ClearScene은 1로 가게 수정
- 마지막으로 PlayerController에도 코드 추가
SceneManager.LoadScene("ClearScene");
728x90
반응형
'유니티(Unity)' 카테고리의 다른 글
프리팹 (0) | 2025.04.21 |
---|---|
룰렛 & 자동차 멈추기 게임 (0) | 2025.04.21 |
C# 기초 (0) | 2025.04.21 |