본문 바로가기

유니티/유니티 연습프로젝트

[유니티/연습 프로젝트] 캐릭터 이동

728x90
반응형

 소개

 

유니티 개발을 시작하기 앞서 공부를 위해 유니티 에셋스토어의 무료 에셋을 활용하였다.

 

 

 

 

 

 

 

 

 

 컴포넌트 적용

 

 

게임 캐릭터인 Player 오브젝트에는 Rigidbody 2D 와 Box Collider 2D 컴포넌트를 적용해주었고

 

바닥에 해당되는 Ground 오브젝트에는 Box Collider 2D 컴포넌트만을 적용하였다.

 

바닥에도 Rigidbody 2D 컴포넌트를 적용하면 물리엔진의 영향을 받아 중력으로 인해 바닥이 게임화면 밖으로 떨어진다.

 

 

 

 

 

 

 

 

 

 

 캐릭터 이동

 

캐릭터의 이동을 위해 좌, 우 화살표 키를 입력 받았을 때 transform.Translate 함수를 사용하여 오브젝트를 이동 시켰다.

 

        if (Input.GetKey(KeyCode.RightArrow))
            transform.Translate(0.002f, 0, 0);
        if (Input.GetKey(KeyCode.LeftArrow))
            transform.Translate(-0.002f, 0, 0);

 

 

 

 

 

 

 

 

 

캐릭터 점프

 

캐릭터의 점프를 구현하기 위해 Rigidbody2D 컴포넌트의 AddFroce 함수를 사용하였다.

 

이 때 캐릭터가 점프 후 떨어지는 속도가 너무 느려서 캐릭터의 질량을 3으로 조정하고

이에 맞춰 AddFroce 함수에 전달할 매개변수의 값도 500으로 조정하였다.

 

그리고 캐릭터가 반복해서 점프하는 것을 막기 위하여 캐릭터가 땅에 닿은 경우에만 다시 점프할 수 있게 설정하였다.

 

점프를 하면 GroundTag를 false 로 변경하고 다시 땅에 닿으면 GroundTag 가 True 로 변경된다.

이 GroundTag 값이 True 일 때만 점프를 허용하도록 설정하였다.

 

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

public class PlayerMove : MonoBehaviour
{
	Rigidbody2D MyRigidbody2D;
    bool GroundTag = false;
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.name == "Ground")
            GroundTag = true;
    }

    // Start is called before the first frame update
    void Start()
    {
        MyRigidbody2D = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.LeftAlt) && GroundTag)
        {
            GroundTag = false;
            MyRigidbody2D.AddForce(new Vector2(0, 500));
        }
    }
}

 

 

 

 

 

 

 

 

 

 최종 코드

 

이동속도와 점프력이 변경될 것을 고려하여 고정수치가 아닌 변수를 활용한 변동수치로 변경하였다.

 

 

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

public class PlayerMove : MonoBehaviour
{
	Rigidbody2D MyRigidbody2D;
    bool GroundTag = false;
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.name == "Ground")
            GroundTag = true;
    }
    public int speed = 2;
    public int jumpforce = 5;

    // Start is called before the first frame update
    void Start()
    {
        MyRigidbody2D = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow))
            transform.Translate(0.001f*speed, 0, 0);
        if (Input.GetKey(KeyCode.LeftArrow))
            transform.Translate(-0.001f*speed, 0, 0);
        if (Input.GetKeyDown(KeyCode.LeftAlt) && GroundTag)
        {
            GroundTag = false;
            MyRigidbody2D.AddForce(new Vector2(0, 100*jumpforce));
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 결과물

 

 

 

 

 

 

 

 

 

 

 

 

 

앞으로 해야할 것

 

캐릭터가 좌측으로 움직일 때 캐릭터의 이미지 반전

 

걸어다니거나 가만히 있을 때의 모션 추가

 

 

 

 

728x90
반응형