본문 바로가기

Development/[Game] New Super Mario

[Game] #2. New Super Mario 스크립트 작성

728x90
반응형

MarioController 스크립트 작성

Asset에 Scripts 폴더를 생성하고 MarioController C# 스크립트를 생성한다.

using UnityEngine;

public class MarioController : MonoBehaviour {
    public AudioClip deathClip; // 사망시 재생할 오디오 클립
    public float jumpForce = 700f; // 점프 힘

    private int jumpCount = 0; // 누적 점프 횟수
    private bool isGrounded = false; // 바닥에 닿았는지 나타냄
    private bool isRinning = false; // 바닥에 닿았는지 나타냄
    private bool isDead = false; // 사망 상태

    private Rigidbody2D playerRigidbody; // 사용할 리지드바디 컴포넌트
    private Animator animator; // 사용할 애니메이터 컴포넌트
    private AudioSource playerAudio; // 사용할 오디오 소스 컴포넌트

    private void Start() {
        // 게임 오브젝트로부터 사용할 컴포넌트들을 가져와 변수에 할당
        playerRigidbody = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
        playerAudio = GetComponent<AudioSource>();
    }

    private void Update() {
        if (isDead)return;
        if (Input.GetKeyDown(KeyCode.Space) && jumpCount < 1){
            Debug.Log("Input.GetKeyDown(KeyCode.Space)");
            jumpCount++;
            playerRigidbody.velocity = Vector2.zero;
            playerRigidbody.AddForce(new Vector2(0, jumpForce));
            playerAudio.Play();
        }
        else if (Input.GetKeyUp(KeyCode.Space) && playerRigidbody.velocity.y > 0){
            Debug.Log("Input.GetKeyUp(KeyCode.Space)");
            playerRigidbody.velocity = playerRigidbody.velocity /2f;
        }
        else if(Input.GetKey(KeyCode.RightArrow)){
            if(Input.GetKey(KeyCode.LeftShift)){
                Debug.Log("Running!");
                isRinning = true;
            }
            else if(Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightArrow)) isRinning = false;
        }
            
        

        // 애니메이터의 Grounded 파라미터를 isGrounded 값으로 갱신
        animator.SetBool("Grounded", isGrounded);
        animator.SetBool("Run", isRinning);
    }

    private void Die() {

        animator.SetTrigger("Die");
        playerAudio.clip = deathClip;

        playerAudio.Play();
        playerRigidbody.velocity = Vector2.zero;

        isDead = true;
    }

    private void OnTriggerEnter2D(Collider2D other) {
        if (other.tag == "Dead" && !isDead) Die();
        Debug.Log("OnTriggerEnter2D");
    }

    private void OnCollisionEnter2D(Collision2D collision) {
        Debug.Log("OnCollisionEnter2D");
        // 어떤 콜라이더와 닿았으며, 충돌 표면이 위쪽을 보고 있으면
        if (collision.contacts[0].normal.y > 0.7f)
        {
            isGrounded = true;
            jumpCount = 0;
        }
    }

    private void OnCollisionExit2D(Collision2D collision) {
        isGrounded = false;
    }
}

Update() 메서드

if (isDead)return;

만약 isDead 변수가 true(1)이면 반복을 종료한다.

if (Input.GetKeyDown(KeyCode.Space) && jumpCount < 1){
    Debug.Log("Input.GetKeyDown(KeyCode.Space)");
    jumpCount++;
    playerRigidbody.velocity = Vector2.zero;
    playerRigidbody.AddForce(new Vector2(0, jumpForce));
    playerAudio.Play();
}
조건: 스페이스 키가 눌러졌고 jumptCount 변수가 1 미만인 경우 (첫 번째 점프인 경우)

- Input.GetKeyDown(KeyCode.Space) 디버그 메시지 출력

- jumpCount 증가

- 플레이어의 리지바디를 참조하여 속력값을 (0,0)으로 설정

- 플레이어의 리지바디를 참조하여 플레이이어에 (0, jumpForce)만큼의 힘을 부여

- 오디오 리소스를 실행

else if (Input.GetKeyUp(KeyCode.Space) && playerRigidbody.velocity.y > 0){
    Debug.Log("Input.GetKeyUp(KeyCode.Space)");
    playerRigidbody.velocity = playerRigidbody.velocity /2f;
}
조건: 스페이스 키에 손을 땠고  playerRigidbody.velocity.y가 0보다 큰 경우 (공중에 있는 경우)

1. Input.GetKeyUp(KeyCode.Space) 디버그 메시지 출력

2. 플레이어의 리지드 바디를 참조하여 플레이어의 속도를 1/2한다.

else if(Input.GetKey(KeyCode.RightArrow)){
    if(Input.GetKey(KeyCode.LeftShift)){
        Debug.Log("Running!");
        isRinning = true;
    }
    else if(Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightArrow)) isRinning = false;
}
조건(1): 오른쪽 화살표를 클릭한 경우

조건(2): 왼쪽 시프트를 누른 상태인 경우
1. Running 메시지 출력
2. isRinning의 값을 true로 변경

조건(3): 왼쪽 시프트에서 손을 때거나 오른쪽 화살표에서 손을 땐 경우
- isRinning의 값을 false로 변경
// 애니메이터의 Grounded 파라미터를 isGrounded 값으로 갱신
animator.SetBool("Grounded", isGrounded);
animator.SetBool("Run", isRinning);
  • Grounded 파라미터를 isGrounded 값으로 변경
  • Run 파라미터를 isRunning 값으로 변경

게임 BGM 첨부

bgm.mp3
0.36MB

Main Camera에 Audio Source 컴포넌트를 추가하고 다음 BGM을 추가한다.

이때 Play on Awake와 Loop를 체크한다. 이는 게임 시작과 함께 오디오 소스를 실행하고 오디오 소스가 종료되도 계속 반복되게 만들어준다. 이후 게임을 실행하면 자동으로 BGM이 재생된다.

inspector 창

게임 플레이 테스트 영상

728x90
반응형
댓글