유니티/실습

출시도전 - 러닝게임 - 2 - 점프

파란색까마귀 2022. 2. 14. 14:41

2016. 6. 17. 22:24

https://blog.naver.com/nagne2011/220739213021

 

-Unity : 출시도전 - 러닝게임 - 2 - 점프

(폴짝) 말하자면 이야기가 길다.. 2단 점프를 구현하기 위해서 여러가지를 시도해봤다 1. Rigidbody를 이...

blog.naver.com

 




(폴짝)

 

말하자면 이야기가 길다..

 

2단 점프를 구현하기 위해서 여러가지를 시도해봤다

 

 

1. Rigidbody를 이용해 gravity적용

 

낙하를 하거나 발판과 상호작용은 완벽했다!

 

...그런데 점프 구현하기가 정말 애매해졌다.

 

처음엔 AddForce()를 통해 vector3.up 방향으로 툭툭 올려줬는데

 

첫 점프는 그럭저럭 괜찮지만, 하강속도도 불안하고 

하강하고 있을때 다시 addforce를 하면 하강속도 > 점프파워 상태라서

점프가 아니라 살짝 공중을 부유하는 정도밖에 안됬다

 

결국 점프가 깔끔하지 않아서 각하.

 

사실, 예전에 만든 RPG러너는 addforce를 이용했다

물론 점프가 무척 불안하고 버그투성이였따...

 

2. 인터넷에서 긁어와서 제작!

 

서너시간을 점프로 씨름하다가 도저히 답이 안나와서..

갓구글에 검색해봤는데

 

의외로 2단 점프에 대한 코드나 설명이 없었다

영어로 안써서 그런가..

 

어쨋든 있긴 있어서 한쪽창에 띄워놓고 비슷하게 배껴보았..는데

 

코드가 뭔가 조-금 이상하고, 무엇보다 2단점프에 대한 제약도 없었다

게다가 평지를 걷다가- 점프 를 구현한거라

구멍에 빠진다던가 블럭 아래로 떨어져서 게임오버..라는건 불가능했다

 

그래서 블럭이 없으면 아래로 떨어지도록 코드를 수정했으나,

이번엔 블럭을 뚫는거나 아예 안떨어지거나 하는등 온갖 오류가 발생해서

결국 각하.

 

3. 직접! 제작.

 

작년 여름쯤, 코딩 학원에서 윈도우API를 할때 러닝게임을 만든적이 있었다

물론 아래로 떨어지는것 까지 구현했었다

 

그때의 기억을 살려서 (저장해두지 않았던게 아쉽다..)

다시 코딩을 시작했다

 

1
2
3
4
5
6
7
8
9
 
    public float jumpPower = 0.2f;
 //점프 파워
    public float y = 0.0f;
//초기위치
    public float gravity = -0.0005f;
//지속적으로 가해지는 중력
    public float jumpAccell = 0.01f;
 //중력 감소값
}
 
cs

 

대충 여러번의 시도 끝에 가장 이상적인 중력값이다

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
    // Update is called once per frame
    void Update () 
    {
        if (Input.GetKeyDown (KeyCode.A)) 
        {
            gravity = -0.0005f;
            jump ();    
        }
    
        gravity -= jumpAccell;
 
    
        this.gameObject.transform.Translate (0, gravity, 0);
    }
 
cs

 

중력은 항상 중력감소값에 맞춰 감소한다

 

그러니까 하강할땐 가속도가 붙어서 점점 더 빠르게 떨어진다

 

그리고 그 하강속도에 맞춰서 플레이어 오브젝트는 아래로 계속 떨어지려고 한다

 

1
2
3
4
5
6
7
8
 
    void jump()
    {
        gravity += jumpPower;
    }
 
}
 
cs

 

그리고 점프키를 누를때 마다, 하강속도는 점프파워만큼 상승하게 된다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
    void OnTriggerStay(Collider other)
    {
        if (other.gameObject.CompareTag ("Cube")) 
        {
            gravity = 0;
            jumpAccell = 0;
            Vector3 pos = this.gameObject.transform.position;
            pos.y = 1.0f;
            this.gameObject.transform.position = pos;
        }
    }
    void OnTriggerExit(Collider other)
    {
        jumpAccell = 0.01f;
    }
 
}
 
cs

 

이때, 

무언가 부딪혔을때, (그 부딪힌 물체가 Cube라는 태그값을 가질경우)

 

중력값(하강속도)는 0이되고 (0이 안될경우 블럭을 뚫고 내려간다)

중력감소값(가속도)도 0이된다 (위에서 예외처리를 하는대신, 이곳에서 잡아줬다)

 

그리고 현재 y값을 초기위치(블럭 바로위 위치)로 옮겨준다

이걸 옮겨주지 않으면, Update의 갱신속도 때문에 미세하게 블럭을 파고들어가버린다

 

만약 점프를 했을경우, OnTriggerExit때문에

블럭과의 충돌이 끝나버릴경우

중력감소값(가속도)는 초기값으로 되돌아간다

 

하지만 아직 멀었다

(아직이다..아직이야!! -라인하르트)

 

 

먼저

1.블럭 옆에서 부딪힐 경우는 어떡하나?

 

이른바 '벽에 부딪힌 경우'다

 

자연스러운 물리엔진을 표현하려면

벽에 부딪힐경우 블럭이 날아가는 방향에 맞춰 뒤로 밀려야 한다

 

하지만 그럴경우 ..

 

아, 글쓰다가 떠올랐다,

 

플레이어가 원래 x값 위치에 위치하지 않을경우(뒤로 밀렸을경우)

일정 속도로 초기 x값으로 돌아오는데,

이때 일정 거리 이상 밀려날 경우(아마도 화면 밖으로?)

게임오버!

 

메데타시 메데타시~

 

2. 블럭 아래에서 부딪힐 경우는 어떡하나?

 

역시 자연스러운 연출을 위해, 윗 벽에 막히는 모션을 취해야된다

부딪힐때마다 블럭의 y값과 플레이어의 y값을 비교해서

플레이어가 블럭보다 아래에 있다고 판단될 경우, 블럭 아래에 막히는듯한, 그러니까 블럭의 아래위치보다 아래에 강제로 이동되도록 해보면 될꺼같다

 

 

728x90