본문 바로가기
  • 불확실한 내일을 위해
유니티 C#/C#

C#기초 - 스페이스바 점프 구현하기 (Getkey, Addforce함수)

by 그린초코 2024. 4. 30.

스페이스바를 눌렀을 때 오브젝트가 점프할 수 있도록 하는 방법은 어렵지 않다.

 

1. 오브젝트가 떨어지지 않게 땅 오브젝트 (Plane)을 추가해준다.

1. 플레이 할 플레이어 오브젝트에 Rigidbody 컴포넌트를 추가한다.

2. 플레이어 오브젝트의 스크립트에 Rigidbody 컴포넌트를 가져와서 저장한다.

3. If함수와 GetKey함수를 이용하여 스페이스바를 누르면 작동하도록 작성한다.

4. Rigidbody에 AddForce함수를 적용시켜 순간적인 물리적 힘이 작동하도록 한다.

5. AddForce함수에 인수를 입력하여 힘의 방향과 강도를 정한다. 

 

이를 정리한 스크립트는 아래와 같다. 

using System.Collections;
using System.Collections.Generic;
using UnityEditor.Rendering;
using UnityEngine;

public class Player : MonoBehaviour
{
    
    public float jumpPower; // 점프하는 힘
    Rigidbody rb; // rigid에 이름짓기
    void Start()
    {
        rb = GetComponent<Rigidbody>(); // 오브젝트의 rigid 가져와서 저장 
    }
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space)) // 만약 스페이스파를 누르면
        {
            rb.AddForce(Vector3.up*jumpPower,ForceMode.Impulse); // 위로 순간적인 힘이 발생
        }
    }
}

 

오브젝트에 이 스크립트를 적용한 오브젝트의 인스펙터를 살펴보면 아래처럼 JumpPower를 설정할 수 있다. 

 

기본적으로 0으로 되어있는데, 0으로 되어있으면 힘이 없어 점프하지 못하므로 숫자를 넣어주어야 한다. 

적용 후 플레이해보면 오브젝트는 스페이스바를 누를 때마다 제한 없이 점프를 한다.

 

이를 제한하기 위해서는 위의 스크립으 내용 중 if 함수에 조건을 추가해주면 된다. 

 

하지만 if 함수에 조건만 추가하면 제한만 둘 뿐이어서 해당 수만큼 점프하고 더이상 점프를 할 수 없게 된다.

그래서 점프 횟수 초기화를 시켜야 하는데, 이는 OnCollisionEnter 함수를 이용하면 된다.

플레이어 오브젝트는 땅에 닿을 때 통과하면 안되므로 isFrigger에 체크를 해제해두었다.

따라서 충돌할 때 호출하는 OnCollisionEnter함수를 이용하여 충돌하는 순간 점프수를 0으로 초기화하면 된다.

 

이제 스크립트에 적용하면 아래와 같다. 

(참고로 스크립트를 가볍게 하기 위해 땅인 Plane 오브젝트는 Ground를 tag로 하여 적용했다. ) 

using System.Collections;
using System.Collections.Generic;
using UnityEditor.Rendering;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float jumpPower; // 점프하는 힘
    int jumpCount; // 점프 횟수
    Rigidbody rb; // rigid에 이름짓기

	void Start()
    {
        rb = GetComponent<Rigidbody>(); // 오브젝트의 rigid 가져와서 저장 
    }
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space) && jumpCount<2) // 만약 스페이스파를 누르면 / 2번 미만일 때
        {
            rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse); // 위로 순간적인 힘이 발생
            jumpCount++; // 점프시 1씩 추가한다. 
        }
    }
    private void OnCollisionEnter(Collision collision) // 충돌 시작하면 호출
    {
        if (collision.gameObject.tag == "Ground") // 충돌한 물체의 tag가 Ground 일 때
        {
            jumpCount = 0; // 점프 횟수를 초기화한다. 
        }
    }
}

 

이를 플레이어 오브젝트에 적용하면 플레이어는 스페이스바로 한번에 2번 점프할 수 있고, 땅에 닿는 순간 다시 2번 점프할 수 있게 된다.

 

 

 

참고 : tag 방법 https://greenchoco.tistory.com/226

 

유니티 기초 - 오브젝트 Tag 하는 방법

유니티에서 오브젝트의 인스펙터를 살펴보면 항상 Tag 에 Untagged 라고 되어있는 것을 확인할 수 있다. 스크립트에서 오브젝트들을 일괄적으로 관리하거나 특정 오브젝트를 빠르게 호출할 때 사

greenchoco.tistory.com

 

참고 : OnCollisionEnter 함수 https://greenchoco.tistory.com/225

 

C#기초 - isTrigger에 따른 OnCollision함수와 OnTrigger함수

isTrigger은 오브젝트 컴포넌트 중 콜라이더에 있는 기능이다.선택하면 충돌 시 통과하지만 충돌은 감지할 수 있고, 선택하지 않으면 통과하지 않고 충돌이 일어난다.  isTrigger이 체크되어 있지

greenchoco.tistory.com

 

참고 : Rigidbody의 개념 https://greenchoco.tistory.com/166

 

유니티 기초 - 콜라이더(Collider)와 리지드바디(Rigidbody)란?

콜라이더(Collider)- 오브젝트 생성될 때 항상 같이 만들어지는 물체를 부딪치게 하는 개념으로 inspector창에서 설정할 수 있다.<p id="SE-40ab5159-dfb..

greenchoco.tistory.com

 

참고 : Addforce 인수 종류 https://greenchoco.tistory.com/224

 

C#기초 - Addforce함수와 ForceMode 종류

AddForce함수는 물리 작용을 이용해 힘을 발생시키는 함수다. 물리 작용을 사용하기 때문에 AddForce함수를 적용하기 위해서는 해당 오브젝트에 Rigidbody 컴포넌트가 추가되어있어야 한다. AddForce함

greenchoco.tistory.com

 

참고 : Getkey등 입력함수 정리 https://greenchoco.tistory.com/219

 

C#기초 - 이동 함수와 인수 종류 (키보드, 마우스, 모바일)

키보드 등의 입력 신호를 감지하기 위해서는 유니티에서 제공하는 input 클래스를 사용해야 한다.input 클래스에서 자주 사용하는 함수와 변수는 아래와 같다.  1. 마우스와 터치에 사용되는 함수

greenchoco.tistory.com

 

728x90

댓글