플랫포머 게임 - 2 : 캐릭터 변경

2024. 8. 26. 11:07·Unity 2D/플랫포머 게임

이전에 작성한 게시글의 에셋 추출 및 적용 과정을 먼저 진행하였습니다.

https://ybbro.tistory.com/52

 

클라이언트 추출, 만들어진 스파인 애니메이션 사용

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
'Unity 2D/플랫포머 게임' 카테고리의 다른 글
  • 플랫포머 - 5 : 개발 중단
  • 플랫포머 게임 - 4 : 추가할 컨텐츠 기획 정리
  • 플랫포머 게임 - 3 : 장애물 변경
  • 플랫포머 게임 - 1 : 카메라 이동, 버그 수정
ybbro
ybbro
대부분의 포스팅은 pc에서 작성되었습니다. 모바일에서 볼 때 설명이 잘리면 데스크탑 모드를 사용해보길 바랍니다.
  • ybbro
    어떻게든 굴리는 게임 공방
    ybbro
  • 전체
    오늘
    어제
    • 전체
      • 스파르타코딩클럽_Unity개발과정
      • Unity 2D
        • 카드게임
        • 플랫포머 게임
        • 뱀서라이크
      • Unity 3D
        • 닷지
        • 유니티 짱
        • 디펜스 게임
      • Unity 에러 노트
      • 기능 구현 방법 정리
      • 셰이더 그래프
        • 2D
        • 3D
      • 프로그래머스
      • 자료구조
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    다크모드
    unity
    유니티
    스파인
    마스크
    룰렛
    삭제
    UI
    앱이 휴대전화와 호환되지 않아 설치되지 않았습니다
    갤럭시 S24
    유니티 애니메이터 파라미터 초기화
    hello
    대시
    직렬화
    세이브
    잔상
    텍스트매시프로
    64비트
    sprite mask
    무료스킨
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ybbro
플랫포머 게임 - 2 : 캐릭터 변경
상단으로

티스토리툴바