예약: 이 페이지는 Feel을 빠르게 시작하는 방법을 설명합니다.
테이블 내용
|
소개
이 페이지에서는 매우 간단한 튜토리얼을 따라 일반적인 사용 사례를 살펴봅니다. 기존 게임에 주스를 추가하고 싶을 때입니다. 처음부터 시작하여 매우(매우) 작은 게임을 만들고, Feel과 다양한 도구를 사용하여 어떻게 이를 개선할 수 있는지 확인해보겠습니다.
기본 게임
우리는 플레이어가 스페이스바를 눌러 점프할 수 있는 미니 플랫폼 게임을 만들 것입니다. 이를 위해 Feel을 가져오고 적어도 Cinemachine과 Post Processing 패키지를 설치한 Unity 프로젝트에서 새 씬을 만듭니다.
- 큐브를 생성하고 스케일을 4,4,4로 설정합니다,Mesh Renderer에서 재질을 MMBPR_BlueDots로 설정합니다. Feel에는 이와 같은 프로젝트 친화적인 여러 재질이 포함되어 있습니다.
- 큐브의 위치를 (0,-2,0)로 설정하고 이름을 Ground로 변경합니다.
- 라이트 설정으로 이동합니다(Windows > Lighting), SkyboxMaterial을 FeelTacticalSkybox로 설정합니다
- 우리는 GameObject 메뉴 > Cinemachine > Virtual Camera를 통해 씬을 촬영할 Virtual Camera를 생성할 것입니다.
- 가상 카메라의 위치를 2.5, 2, -4로 설정하고 회전을 20, -30, 0으로 설정합니다.
- 이제 괜찮은 씬이 생겼으니 캐릭터를 추가해 봅시다. 새 큐브를 생성하고 위치를 0, 0.5, 0으로 설정하고, 재질을 MMBPR_DarkGreySquares로 설정합니다. 이름을 Hero로 변경합니다.
- Hero에 Rigidbody 컴포넌트를 추가하고 모든 축의 회전을 고정합니다.
- 더 쉽게 관리할 수 있도록 논리와 시각 요소를 분리할 것입니다. 이를 위해 Hero 객체를 복제하고 이름을 Model로 변경한 후, Hero 객체에 드래그 앤 드롭하여 자식으로 만듭니다.
- Hero 노드에서 Mesh Filter와 Mesh Renderer 객체를 제거합니다. Model 노드에서 BoxCollider와 Rigidbody를 제거합니다.
이 시점에서 씬은 다음과 같이 보일 것입니다:
기본 동작
물론 이 시점에서 재생 버튼을 누르면 별다른 일이 일어나지 않습니다. 이제 게임에 상호작용을 추가할 시간입니다. 이를 위해 새 C# 스크립트를 생성하고 이름을 GettingStartedTutorialHero로 지정한 후 다음 코드를 붙여넣습니다:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MoreMountains.Feedbacks;
using UnityEngine.Events;
/// <summary>
/// Feel의 Getting Started 튜토리얼에서 캐릭터가 점프하도록 하는 매우 간단한 클래스입니다.
/// </summary>
public class GettingStartedTutorialHero : MonoBehaviour
{
[Header("Hero Settings")]
/// 플레이어가 우리의 Hero를 점프시키기 위해 눌러야 하는 키
public KeyCode ActionKey = KeyCode.Space;
/// Hero의 리지드바디에 수직으로 적용할 힘, 점프하게 합니다.
public float JumpForce = 8f;
[Header("Feedbacks")]
/// Hero가 점프를 시작할 때 재생할 MMF_Player
public MMF_Player JumpFeedback;
/// 점프 후 착지할 때 재생할 MMF_Player
public MMF_Player LandingFeedback;
private const float _lowVelocity = 0.1f;
private Rigidbody _rigidbody;
private float _velocityLastFrame;
private bool _jumping = false;
/// <summary>
/// Awake 시 리지드바디를 저장하고, 점프의 느낌을 좋게 하기 위해 y축의 중력을 -30으로 설정합니다.
/// </summary>
private void Awake()
{
_rigidbody = this.gameObject.GetComponent<Rigidbody>();
Physics.gravity = Vector3.down * 30;
}
/// <summary>
/// 매 프레임마다 실행됩니다.
/// </summary>
private void Update()
{
// 플레이어가 액션 키를 눌렀는지 확인하고, 그 경우 점프를 트리거합니다.
if (Input.GetKeyDown(ActionKey) && !_jumping)
{
Jump();
}
// 점프 중이고, 이전 프레임에 하강 중이었으며, 현재 속도가 거의 0에 도달한 경우
if (_jumping && (_velocityLastFrame < 0) && (Mathf.Abs(_rigidbody.velocity.y) < _lowVelocity))
{
// 착지한 것이므로, 상태를 초기화합니다.
_jumping = false;
}
// 속도를 저장합니다.
_velocityLastFrame = _rigidbody.velocity.y;
}
/// <summary>
/// 우리의 히어로를 공중으로 점프하게 합니다.
/// </summary>
private void Jump()
{
_rigidbody.AddForce(Vector3.up * JumpForce, ForceMode.Impulse);
_jumping = true;
}
}
그런 다음 GettingStartedTutorialHero 컴포넌트를 Hero 게임 오브젝트에 추가합니다. 위의 코드를 읽어보면 알 수 있듯이, 이 클래스는 입력(Space 키, 기본값)을 확인하고, 플레이어가 Space 키를 누르면 Hero를 공중으로 밀어 올립니다. 또한 Update에서 이번 프레임에 착지했는지도 확인합니다.
이 시점에서 Unity 에디터에서 재생 버튼을 누르고, 런타임에 스페이스바를 누르면 Hero가 점프할 수 있습니다. 이것이 우리의 게임입니다! 씬을 저장하세요.
피드백 통합
그것이 우리의 게임이지만, 매우 흥미로운 게임은 아닙니다. 피드백을 추가하여 이를 개선해 봅시다. 피드백은 Feel에서 가장 유용한 도구 중 하나이며, 자주 사용하게 될 것입니다. 먼저 Hero 내부에 두 개의 새로운 빈 자식 객체를 만듭니다. 이를 위해 Hero를 선택하고 alt+shift+N을 누릅니다. 그런 다음 Hero를 다시 선택하고 alt+shift+N을 다시 누릅니다. 첫 번째 자식의 이름을 “JumpFeedback”으로, 두 번째 자식의 이름을 “LandingFeedback”으로 변경합니다. 둘 다 선택한 후, 인스펙터에서 AddComponent 버튼을 클릭하고 MMF_Player 컴포넌트를 추가합니다. MMF_Player(More Mountains Feedbacks Player)는 피드백 시퀀스를 재생하는 방법입니다.
JumpFeedback을 선택하고 첫 번째 피드백을 추가합니다. 점프할 때 Hero의 모델을 회전시키겠습니다. MMF_Player 인스펙터에서 Add New Feedback 드롭다운을 누르고 Transform > Rotation 피드백을 추가합니다. 인스펙터에서 Model 게임 오브젝트를 AnimateRotationTarget 슬롯에 드래그합니다. AnimateRotationDuration을 0.5로 설정하고, RemapCurveOne 값을 90으로 설정한 다음 AnimateY와 AnimateZ의 체크를 해제합니다(X 회전만 애니메이션화할 것입니다). AnimateRotationX 곡선을 열고, 0에서 1로 가는 기본 곡선 중 하나를 선택합니다. 나는 평평한 S 모양처럼 보이는 ease in/out 곡선을 추천합니다.
Unity에서 재생 버튼을 누르고, JumpFeedback을 선택한 상태에서 MMF_Player 인스펙터 하단의 녹색 Play 버튼을 누릅니다. 모델이 회전하는 것을 확인할 수 있습니다. 이제 실제로 점프할 때 그 피드백이 재생되면 좋겠죠. 이는 간단하게 할 수 있습니다! 이전에 만든 GettingStartedTutorialHero 클래스를 엽니다. 상단에 이미 두 개의 public MMF_Player를 선언한 것을 볼 수 있습니다. 이제 점프할 때와 착지할 때 이들이 재생되도록 지시해야 합니다. 이를 위해 Jump 메서드의 끝에 다음 줄을 추가합니다:
JumpFeedback?.PlayFeedbacks();
그리고 Update() 메서드에서 “_jumping = false;” 다음에 다음 줄을 추가합니다:
LandingFeedback?.PlayFeedbacks();
이제 Unity로 돌아가서 Hero 게임 오브젝트를 선택하고, JumpFeedback을 Hero 인스펙터의 첫 번째 피드백 슬롯에 드래그하고, LandingFeedback을 두 번째 슬롯에 드래그합니다. 재생 버튼을 누르고, 스페이스바를 눌러 점프하면 이제 큐브가 점프할 때 회전합니다. 첫 번째 MMF_Player를 추가했고 이제 재생되고 있습니다.
더 많은 피드백 추가
좋은 기본 베이스가 마련되었습니다. 이제 재미있는 부분이 시작되며, 더 많은 피드백을 추가할 수 있습니다. 이 씬에 100개 이상의 모든 피드백을 추가하는 것은 어렵기 때문에, 대부분의 피드백을 대표하는 몇 가지 피드백만 추가하겠습니다. 나중에 다른 피드백도 자유롭게 탐색하고 실험해 보세요!
- JumpFeedback을 선택하고, 새 Audio > Sound 피드백을 추가합니다. PlayMethod를 Cached로 설정하고, Sfx를 Hat1으로 설정합니다. 재생 모드 밖에서도 TestPlaySound 버튼을 눌러 소리를 들을 수 있습니다.
- LandingFeedback을 선택하고, 새 Audio > Sound 피드백을 추가합니다. PlayMethod를 Cached로 설정하고, Sfx를 Bass1으로 설정합니다.
- LandingFeedback을 선택하고, Camera > Cinemachine Impulse 피드백을 추가합니다. RawSignal 필드 옆의 작은 톱니바퀴 아이콘을 클릭하고, Presets > 6D Shake를 선택합니다. 하단에서 Velocity를 1,1,1로 설정합니다. 이제 가상 카메라가 이러한 임펄스를 들을 수 있도록 설정해야 합니다. 가상 카메라(CM vcam1)를 선택하고, CinemachineVirtualCamera 인스펙터 하단의 Add Extension 드롭다운을 클릭하고, CinemachineImpulseListener를 선택합니다.
재생 버튼을 누르면 이제 점프할 때와 착지할 때 소리를 들을 수 있으며, 착지할 때 카메라가 흔들릴 것입니다.
포스트 프로세싱 및 셰이커
그 씬은 더 나아질 수 있습니다!
- 포인트 라이트를 생성하고, 위치를 (1.2, 0.75, -1)로 설정합니다.
- 새 빈 오브젝트를 생성하고, 이름을 PostProcessingVolume으로 설정한 다음 PostProcess Volume 컴포넌트를 추가합니다. New 버튼을 눌러 새로운 프로필을 생성합니다. IsGlobal 체크박스를 선택합니다. 그런 다음 Main Camera를 선택하고, PostProcess Layer 컴포넌트를 추가합니다. Layer를 Default로 설정합니다.
- 다시 PostProcessingVolume 오브젝트로 돌아가서 원하는 모든 포스트 프로세스를 추가합니다. 예를 들어 비네트와 앰비언트 오클루전을 추가할 수 있습니다. 이는 런타임에 수정하지 않으며, 단지 씬을 더 좋게 보이게 하기 위함입니다.
- 렌즈 왜곡(Lens Distortion) 포스트 프로세싱과 색수차(Chromatic Aberration)를 추가합니다. 값은 기본값으로 둡니다.
- 같은 볼륨 오브젝트에 새로운 컴포넌트를 추가합니다: MMLensDistortionShaker와 MMChromaticAberrationShaker. 값은 기본값으로 둡니다.
- 다시 LandingFeedback으로 돌아가서 PostProcess > Chromatic Aberration 피드백과 PostProcess > Lens Distortion 피드백을 추가하고, RemapIntensityOne 값을 50으로 설정합니다.
재생 버튼을 누르면 착지할 때 매우 울퉁불퉁한 효과를 얻게 됩니다.
MMTools의 추가 기능 추가
궤도를 도는 구 추가:
- 구체를 추가하고, 재질을 SequencerTiles12로 설정하고, 위치를 2, 0.5, 0으로 설정하며, 크기를 0.5, 0.5, 0.5로 설정합니다.
- MMAutoRotate 컴포넌트를 추가하고, RotationSpeed를 0, 50, 0으로 설정합니다. Orbiting 체크박스를 선택하고, Hero의 모델을 OrbitCenterTransform에 드래그합니다.
- 궤도 평면을 보여주는 자동 기즈모를 확인할 수 있습니다.
- UpdateMode를 FixedUpdate로 설정하고, OrbitRotationSpeed를 1000으로 설정합니다.
큰 큐브를 따르는 작은 큐브 추가:
- 새 큐브를 추가하고 위치를 -0.75, 0.1, -1.25로 설정하고, 크기를 0.2, 0.2, 0.2로 설정합니다.
- MMFollowTarget 컴포넌트를 추가하고, FollowPositionX, FollowPositionZ, FollowScale의 체크를 해제합니다. Hero의 Model을 Target으로 설정합니다. AddInitialDistanceYToYOffset을 체크합니다.
- 그 큐브를 복제하여 큰 큐브 주변에 몇 개 배치합니다.
FPS 카운터 추가:
- 새 캔버스 생성 (GameObject > UI > Canvas)
- 새 텍스트 객체 추가 (GameObject > UI > Text), 이름을 FPSCounter로 설정하고 앵커 모드를 BottomLeft로 설정합니다.
- PosX를 100, PosY를 20으로 설정합니다. MMFFPSCounter 컴포넌트를 추가합니다.
- MMFPSUnlock 컴포넌트를 추가하고, TargetFPS를 300, VSyncCount를 2로 설정합니다.
MMTools에는 다양한 경우에 사용할 수 있는 스크립트와 헬퍼가 가득하니, 자유롭게 탐색해 보세요!
UnityEvents를 사용하는 것이 더 좋다면?
마지막으로 시도해 볼 것은 코드 대신 UnityEvents를 사용하여 피드백을 사용하는 방법입니다. 이는 이미 많은 UnityEvents를 노출하는 코드베이스와 작업할 때, Playmaker나 Bolt와 함께 작업할 때 또는 단순히 선호하는 워크플로일 때 유용할 수 있습니다.
이를 테스트하기 위해 GettingStartedTutorialHero 스크립트를 수정하겠습니다.
먼저 새로운 UnityEvent를 선언하겠습니다:
public UnityEvent OnJump;
그리고 Jump 메서드에서 “JumpFeedback?.PlayFeedbacks();” 줄을 다음 줄로 교체하겠습니다:
if (OnJump != null)
{
OnJump.Invoke();
}
이제 재생 버튼을 누르면 위의 PlayFeedbacks() 호출을 제거했기 때문에 점프 피드백이 더 이상 재생되지 않는 것을 알 수 있습니다. 이를 수정하기 위해 우리가 생성한 UnityEvent에 피드백을 바인딩할 수 있습니다. Hero의 인스펙터에서 OnJump 이벤트에 새로운 바인딩을 추가하려면 작은 "+" 버튼을 누릅니다. 그런 다음 JumpFeedback 오브젝트를 타겟 슬롯에 드래그하고 PlayFeedbacks 메서드를 선택합니다.
결론
이제 새로운 피드백을 생성하고, 코드나 이벤트를 통해 호출하는 방법을 알게 되었습니다. 또한 Feel에 포함된 모든 추가 기능을 사용하여 재미를 느끼기 시작했습니다. 이제 그 씬이나 자신의 게임에 더 많은 피드백을 추가하고 나머지 문서를 살펴볼 수 있습니다. 즐기세요!
'유니티 에셋 > Feel' 카테고리의 다른 글
The MMF_Player component (0) | 2024.07.09 |
---|---|
Core concepts(핵심 개념) (0) | 2024.07.08 |
Demos (0) | 2024.07.06 |
에셋의 내용물 (0) | 2024.07.06 |
URP, HDRP 및 렌더 파이프라인 (0) | 2024.07.06 |