이전에 작성한 게시글의 에셋 추출 및 적용 과정을 먼저 진행하였습니다.
클라이언트 추출, 만들어진 스파인 애니메이션 사용
https://arca.live/b/bluearchive/40797379 유니티로 메모리얼 로비 구현하는 법 - 블루 아카이브 채널준비물:Unity 2019+ (다운로드): 블루 아카이브 만드는 데 쓰인 게임 엔진임. 최신 버전 다운로드하면 된다
ybbro.tistory.com
1) 하이어라키에서 기존의 플레이어를 복제
2) 카메라가 복제한 플레이어를 따라가도록 변경
3) 복제한 오브젝트의 스프라이트 랜더러를 제거(랜더러는 중복으로 존재할 수 없음)
4) SkeletonAnimation 컴포넌트를 추가 > 스켈레톤 데이터 에셋을 바꾸려는 캐릭터로 변경 > 기본으로 달리는 애니메이션 선택 > loop 체크 박스 true
5) 기존의 애니메이션 재생이 들어간 PlayerController.cs 를 복제하여 이름, 클래스 명 변경
6) 기존의 애니메이터를 사용하기 위해 작성한 구문은 주석 처리
스파인 애니메이션을 사용할 수 있게 수정
using UnityEngine;
// 스파인 애니메이션을 사용하기 위해 네임스페이스를 스파인에서 쓰는 것과 동일하게
namespace Spine.Unity
{
// PlayerController는 플레이어 캐릭터로서 Player 게임 오브젝트를 제어한다.
public class PlayerController_rangrun : MonoBehaviour
{
public AudioClip deathClip; // 사망시 재생할 오디오 클립
public Vector2 jumpForce = new Vector2(0f, 700f); // 점프 힘
private int jumpCount = 0; // 누적 점프 횟수
const int jumpCountMax = 2;
//private bool isGrounded = false; // 바닥에 닿았는지 나타냄
private bool isDead = false; // 사망 상태
private Rigidbody2D playerRigidbody; // 사용할 리지드바디 컴포넌트
//private Animator animator; // 사용할 애니메이터 컴포넌트
SkeletonAnimation skeletonAnimation;
private AudioSource playerAudio; // 사용할 오디오 소스 컴포넌트
private void Start()
{
// 초기화
TryGetComponent(out playerRigidbody);
//TryGetComponent(out animator);
TryGetComponent(out skeletonAnimation);
TryGetComponent(out playerAudio);
}
private void Update()
{
if (isDead)
return;
// 점프(마우스 좌클릭 or 화면 터치) 버튼을 눌렀고, 점프 횟수가 최대에 도달하지 않았다면
if (Input.GetMouseButtonDown(0) && jumpCount < jumpCountMax)
{
// 점프 횟수 증가
jumpCount++;
// 점프 직전 순간적으로 속도를 0으로
// 빠르게 2번 입력하면 힘을 중첩해서 2번 빠르게 주기에 더 높은 점프가 가능
// 혹은 떨어지는 중 힘을 줘도 상쇄되어서 점프 높이가 낮아짐
// 따라서 초기화가 필요
playerRigidbody.velocity = Vector2.zero;
// 리지드바디에 위쪽으로 힘 주기
playerRigidbody.AddForce(jumpForce);
// 점프 사운드 재생
playerAudio.Play();
}
// 점프 버튼에서 손을 떼고, 위로 상승 중이었다면(낙하 도중에 속도가 낮춰진다는 건 이상하니까)
else if (Input.GetMouseButtonUp(0) && playerRigidbody.velocity.y > 0)
{
// 속도 절반? 왜?
// 점프 버튼을 꾹 누르고 있으면 더 높이 점프하는 것을 간략하게 구현
// 반대로 생각해서 점프 버튼에서 손을 떼는 순간 속도를 줄여 점프 높이를 줄이도록
playerRigidbody.velocity /= 2;
}
//animator.SetBool("Grounded", isGrounded);
}
private void Die()
{
// 사망 애니메이션 재생
//animator.SetTrigger("Die");
skeletonAnimation.loop = false;
skeletonAnimation.AnimationName = "death";
// 사망 사운드로 클립 교체하고 재생
playerAudio.clip = deathClip;
playerAudio.Play();
// 속도를 0으로
playerRigidbody.velocity = Vector2.zero;
// 사망 처리
isDead = true;
// 게임매니저의 게임오버 처리
GameManager.instance.OnPlayerDead();
}
// 트리거 콜라이더를 가진 장애물과의 충돌을 감지
private void OnTriggerEnter2D(Collider2D other)
{
// 부딪힌 트리거의 오브젝트 태그가 Dead이고, 살아있는 상태일 때
if (other.CompareTag("Dead") && !isDead)
{
Die();
}
}
// 바닥에 닿았음을 감지하는 처리
private void OnCollisionEnter2D(Collision2D collision)
{
// 어떤 콜라이더와 닿았고 충돌면이 위를 보고 있을 때
// 바닥 수직 위로 캐릭터가 안착 > y축 1.0f
if (collision.contacts[0].normal.y > 0.7f)
{
//isGrounded = true;
jumpCount = 0;
}
}
// 바닥에서 벗어났음을 감지하는 처리
//private void OnCollisionExit2D(Collision2D collision)
//{
// isGrounded = false;
//}
}
}
7) 가져올 캐릭터 사이즈가 기존과 다르므로 세부 조정
캐릭터 오브젝트 > 스케일, 콜라이더 크기, 위치 조정
카메라 오브젝트 > 카메라 y축 이동을 시작할 캐릭터 위치 기준을 인스펙터에서 수정
platform 프리팹 > 캐릭터가 좌우로 더 넓기 때문에 보이지 않는 콜라이더 x축 크기를 조금 더 늘려줘서 더 자연스러운 플레이가 가능하게끔
< 결과 >
'Unity 2D > 플랫포머 게임' 카테고리의 다른 글
플랫포머 - 5 : 개발 중단 (1) | 2024.11.12 |
---|---|
플랫포머 게임 - 4 : 추가할 컨텐츠 기획 정리 (0) | 2024.08.27 |
플랫포머 게임 - 3 : 장애물 변경 (1) | 2024.08.26 |
플랫포머 게임 - 1 : 카메라 이동, 버그 수정 (0) | 2024.08.22 |