본문 바로가기
2D 콘텐츠 제작 개발일지 (mario)

마리오 개발 1일차(이동 및 점프 및 애니메이션 구현)

by 노재두내 2023. 9. 14.

2D프로젝트 발표.pptx
3.68MB

 

 

발표 ppt 수정본

 

마리오 무조건 플레이 해보기 비슷한거라도 


1. 씬 구성하기

 

이런식으로 길게 씬을 구성하였다.

바닥과 블록은 boxcollider 2d 컴포넌트를 적용하였다.

 

마리오는 capsule collider 2d를 추가, rigidbody 2d컴포넌트도 추가하였다.

마리오 게임 플레이 영상을 보니 생각보다 다리가 빠르게 움직여서 애니메이션을 수정하지 않고 자동으로 만들어진걸 사용하기로 하였다. 


2. 마리오 스페이스바를 눌러 점프하기

마리오에는 rigidbody가 붙어 있으니 AddForce()를 사용하기로 했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MarioController : MonoBehaviour
{
    private Rigidbody2D rBody2D;
    private float jumpForce = 50f;
    // Start is called before the first frame update
    void Start()
    {
        this.rBody2D = this.GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            this.rBody2D.AddForce(Vector2.up * this.jumpForce);
        }
    }
}

문제점1.

결과 점프하는 힘(jumpForce)가 너무 약하다

=>jumpForce를 잠시 public 으로 바꿔서 적당한 값을 찾아냈다. 일단은 350으로 설정한 후 좌우 키보드 움직이기와 함께 동작하면 블록에 올라갈 수 있는지 테스트 해봐야 할 것 같음

 

문제점 2.

떨어지는 속도 너무 느리다

=> rigidbody에 gravity scale 조절하기

 

3. 좌우 키보드로 움직이기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MarioController : MonoBehaviour
{
    private Rigidbody2D rBody2D;
    public float jumpForce = 600f;
    public float moveForce = 50f;
    
    
    // Start is called before the first frame update
    void Start()
    {
        this.rBody2D = this.GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            this.rBody2D.AddForce(Vector2.up * this.jumpForce);
        }

        int dirX = 0;

        if (Input.GetKey(KeyCode.LeftArrow))
            dirX = -1;

        if (Input.GetKey(KeyCode.RightArrow))
            dirX = 1;

        float speedX = Mathf.Abs(this.rBody2D.velocity.x);//절대값(속도는 음수 나오면 안됨)

        if (speedX < 6f)
        {
            this.rBody2D.AddForce(new Vector2(dirX, 0) * this.moveForce);
        }
        
    }
}

문제점 . 움직이는게 마찰이 있는거처럼 힘겹고 끊어지는 느낌이 남 

=> speedX 가 가속도를 구하는것이었음 if(speedX<2f)를 6f로 변경하였다.

 

4.움직이는 방향 쳐다보기 

//움직이는 방향으로 쳐다보기 
        if (dirX != 0)
        {
            this.transform.localScale = new Vector3(dirX * 0.5f, 0.5f, 1);
        }

문제점 . 아무생각 없이 아래처럼 쳤다가 

        if (dirX != 0)
        {
            this.transform.localScale = new Vector3(dirX , 1, 1);
        }

마리오 기본 scale 이 0.5라서 1로 변경되어 크기가 커져버리는 문제가 발생하였다

=> dirX에다가 0.5를 곱하고 y값도 0.5로 바꿔서 적어주었다

 

 

5.애니메이션 적용(이동 속도에 따라 애니메이션 속도 조절) 미완 !!!!

private Animator anim;
  void Start()
    {
        this.anim = this.GetComponent<Animator>();
    }
  void Update()
    { 
    this.anim.speed = speedX / 2.0f;
    }

위 코드 추가

문제점 . 애니메이션이 너무 빨라짐

추가할 점 . 속도가 0일때는 idle 상태표현하기 , 점프할 때 점프 상태

많이 이상함 다시 생각해서 해야할듯

6. 이중점프 막기

if (Input.GetKeyDown(KeyCode.Space))
        {
            if (this.rBody2D.velocity.y == 0)
            {
                this.rBody2D.AddForce(Vector2.up * this.jumpForce);
                if (this.isJump == false)
                    this.isJump = true;
            }
        }

7. 블록에 붙는거 해결 

Platform Effector 2D 컴포넌트를 사용하면 측면의 마찰력만 조절한다고 한다.

https://hoil2.tistory.com/29

참고한 블로그

 

처음에 180로 설정되어있어서 캐릭터 몸을 반으로 나눈 기준으로 위쪽은 안붙지만 아래쪽은 붙음 

surface arc를 360도로  변경하니까 붙지 않음

6. 스페이스바 짧게 누르면 점프 낮게 길게 누르면 높게 점프 

중력값을 다르게 하면 된다. 

private bool isLongJump = false;

void Update()
{
if (Input.GetKey(KeyCode.Space))
        {
            isLongJump = true;
        }
        else if (Input.GetKeyUp(KeyCode.Space))
        {
            isLongJump = false;
        }
}

private void FixedUpdate()
    {
        if (isLongJump && this.rBody2D.velocity.y > 0)
        {
            this.rBody2D.gravityScale = 1.5f;
        }
        else
        {
            this.rBody2D.gravityScale = 2.5f;
        }
    }


미끄러지는건 좋지만 너무 미끄러져서 자꾸 떨어지는 현상

방향키에서 손을떼면 속도를 0으로 만드는 법도 있지만 그러면 아예 미끄러지는게 사라져버려서 다른 방법을 생각

=> physical material 2d의 마찰력(friction)을 10으로 증가시킴

덜 미끄러짐