본문 바로가기

Development/[Game] New Super Mario

[Game] #3. 게임 오류 발생

728x90
반응형

플레이어를 따라가는 카메라

게임을 진행하면 플레이어가 움직이고, 움직인 플레이어를 카메라가 따라가야한다. 이를 위해 메인 카메라에 다음 스크립트를 저장한다.

using UnityEngine;
public class CameraTarget : MonoBehaviour
{
    public Transform target;

    public float smoothSpeed = 3;
    public Vector2 offset;
    public float limitMinX, limitMaxX, limitMinY, limitMaxY;
    float cameraHalfWidth, cameraHalfHeight;

    private void Start()
    {
        cameraHalfWidth = Camera.main.aspect * Camera.main.orthographicSize;
        cameraHalfHeight = Camera.main.orthographicSize;
    }

    private void LateUpdate()
    {
        Vector3 desiredPosition = new Vector3(
            Mathf.Clamp(target.position.x + offset.x, limitMinX + cameraHalfWidth, limitMaxX - cameraHalfWidth),   // X
            Mathf.Clamp(target.position.y + offset.y, limitMinY + cameraHalfHeight, limitMaxY - cameraHalfHeight), // Y
            -10);                                                                                                  // Z
        transform.position = Vector3.Lerp(transform.position, desiredPosition, Time.deltaTime * smoothSpeed);
    }
}

게임 버그 발생

지난 2일간 틈틈이 마리오 애니메이션을 수정하였다.

애니메이터

하지만 MarioConroller 파일은 3개나 만들며 애니메이션을 수정했지만, 이동 중 점프 발생 시 낙하 속도가 일정하게 떨어지지 않고 느리게 떨어지는 버그가 발생했다.

 

위 영상에서 볼 수 있듯, 여러 애니메이션의 제작을 다 했지만 점프 속력이 일정하지 않는 문제점이 있다.

이를 고치기 위해 다음 블로그를 참조했었다. https://iagreebut.tistory.com/22

 

[Unity2D]플레이어 이동/점프

전 게시글에서 이어서 작성해서 스프라이트는 동일합니다. [유니티 기초 - B15] 2D플레이어 이동 구현하기 [유니티 기초 - B16] 2D플레이어 점프 구현하기 이동 구현하기 일단 이동을 구현하기위해

iagreebut.tistory.com

아래 파일은 마지막까지 수정한 스크립트이다.

using UnityEngine;

public class MarioControllerEdit3 : MonoBehaviour
{
    public AudioClip deathClip; // 사망시 재생할 오디오 클립

    /*마리오의 기본 상태 관리*/
    public float maxSpeed; //최대 속력 변수 
    public float jumpForce = 700f; // 점프 힘
    public float speed = 3f; // 이동 속력

    /*마리오의 파라미터*/
    private bool isGrounded = false; // 바닥에 닿았는지 나타냄
    private bool isDead = false; // 사망 상태
    private bool isWalk = false; // 걷기 상태
    private bool isRunning = false; // 걷기 상태

    /*마리오의 변수*/
    private int jumpCount = 0; // 점프 가능 상태

    private Rigidbody2D playerRigidbody; // 사용할 리지드바디 컴포넌트
    private Animator animator; // 사용할 애니메이터 컴포넌트
    private AudioSource playerAudio; // 사용할 오디오 소스 컴포넌트
    private Transform Payertransform;
    // private SpriteRenderer PlayerRenderer; //방향전환을 위한 변수 

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

    // Update is called once per frame
    void Update()
    {
        float xInput = Input.GetAxis("Horizontal");
        float xSpeed = xInput * speed; //3

        if (isDead)return;

        ///////////////점프
        if(Input.GetKeyDown(KeyCode.Space)&& jumpCount < 1){
            Debug.Log("Jump!");jumpCount++;
            playerAudio.Play(); //4
            playerRigidbody.AddForce(new Vector2(0,jumpForce));
            // playerRigidbody.AddForce(Vector2.up* jumpForce , ForceMode2D.Impulse);
        }
        if(Input.GetKeyUp(KeyCode.Space)){ // 버튼에서 손을 때는 경우 

            playerRigidbody.velocity = new Vector2(playerRigidbody.velocity.normalized.x , playerRigidbody.velocity.normalized.y* 0.5f);
        }
        ///////////////방향키
        if(Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.LeftArrow)){
            if(Input.GetKey(KeyCode.LeftArrow))transform.localScale = new Vector3(-5, 5, 1); // 왼쪽 바라보기
            else if(Input.GetKey(KeyCode.RightArrow))transform.localScale = new Vector3(5, 5, 1); // 왼쪽 바라보기

            playerRigidbody.velocity = new Vector2(xSpeed , playerRigidbody.velocity.normalized.y);
            isWalk = true; //2

            if(Input.GetKey(KeyCode.LeftShift)){
                isRunning = true;
                Debug.Log("Running!");
                // newVelocity = new Vector2(300f, 0f);
                playerRigidbody.velocity = new Vector2(xSpeed*3, playerRigidbody.velocity.normalized.y);
            }
            else if(Input.GetKeyUp(KeyCode.LeftShift)){
                isRunning = false;
            }
        }
        else if(Input.GetKeyUp(KeyCode.RightArrow) || Input.GetKeyUp(KeyCode.LeftArrow)){
            playerRigidbody.velocity = Vector2.zero;
            isWalk = false;
            isRunning = false;
        }
        animator.SetBool("Grounded", isGrounded);
        animator.SetBool("Run", isRunning);
        animator.SetBool("Walk", isWalk);
        
    }

    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) {
        
        // void OnCollisionEnter(Collision collision) { Vector3 pos = collision.contacts[0].point; }
        Vector2 pos = collision.contacts[0].point; 
        Debug.Log("충돌 위치[x]: "+pos.x);
        Debug.Log("충돌 위치[y]: "+pos.y);
        // 어떤 콜라이더와 닿았으며, 충돌 표면이 위쪽을 보고 있으면
        if (collision.contacts[0].normal.y > -6.45f)
        {
            Debug.Log("Collision!");
            isGrounded = true;
            jumpCount = 0;
        }
    }

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

해당 점프 오류를 고치기 위해 새로운 유니티 프로젝트를 생성하고 추가적으로 공부하는 방향으로 가야 될 듯하다.

728x90
반응형
댓글