다양한 기록

Parrying Sword #7 : [기획][프로그래밍] 벽 잡기 (등반) 구현 본문

유니티 엔진/Parrying Sowrd

Parrying Sword #7 : [기획][프로그래밍] 벽 잡기 (등반) 구현

라구넹 2023. 2. 17. 11:14

 

플레이어의 액션 중, 벽타기가 추가 되었습니다.

 

// 클라이밍 ****************************************
        if (Input.GetKey(KeyCode.UpArrow) && !climbJump && playerCtrl.actionActive)
        {
            if (playerCtrl.ActionClimb())
            {
                climbing = true;
            }
        }

        if (Input.GetKeyUp(KeyCode.UpArrow))
        {
            climbing = false;
            climbJump = false;
            playerCtrl.ActionUndoClimb();
        }

        if (Input.GetKeyDown(KeyCode.Space) && climbing)
        {
            climbing = false;
            climbJump = true;
            playerCtrl.ActionUndoClimb();
            playerCtrl.ActionMustJump();
        }
// ***********************************************

if (wire == 1 || climbing) return;

인풋 매니저의 역할을 하는 PlayerMain에서의 코드입니다.

 

키보드에서 위쪽 방향키를 누르는 동안 스페이스 바를 눌러 점프를 시도하거나 위 방향키를 놓을 때까지 지속해서 벽을 잡고 있는 형식으로 코드를 작성하였습니다. climbing과 climbJump 변수 두 가지를 사용해 캐릭터의 상태를 조절합니다.

 그리고 클라이밍 중에는 그 밖의 공격같은 행동은 못하도록 리턴합니다.

 

wire == 1 부분은 와이어 액션과 관련된 변수로, 와이어 액션 도중에도 클라이밍 할 때 처럼 공격 시도를 못하도록 막는 부분입니다.

와이어 액션에 대해서는 다음 게시물에서 다룰 예정입니다.

 

	if (!grounded && !climbing && !usingWire )
	{
		animator.SetTrigger("Jump");
	}
    // 성공 시 true 리턴
    public bool ActionClimb()
    {
        Collider2D[] colliders = Physics2D.OverlapPointAll(roadConnection.position);

        foreach( Collider2D col in colliders ){
            if( col.tag == "Road" )
            {
                climbing = true;
                animator.SetTrigger("Climb");
                rb.constraints = RigidbodyConstraints2D.FreezeAll;
                return true;
            }
        }

        return false;
    }

    public void ActionUndoClimb()
    {
        climbing = false;
        rb.constraints = RigidbodyConstraints2D.FreezeRotation;
    }

    public void ActionMustJump()
    {
        force_y = jumpAccel_y * rb.mass;
    }

플레이어의 행동을 구체적으로 정의한 PlayerController에서의 코드입니다.

 

벽과 닿아있다는 판정을 알기 위한 오브젝트를 하나 만들어 두었고, 닿아있다면 벽 잡기가 가능한 상태입니다.

벽 잡기를 할 경우, RigidBody2D 컴포넌트에서 x, y축 이동을 고정해서 움직이지 않는 것처럼 보이게 만듭니다.

그리고 벽 잡기를 해제할 경우 원래대로 되돌립니다.

 

벽을 잡은 상태에서 점프를 할 경우, 지면에 닿아있는 상태가 아니기에 지면 체크 없이 점프를 시키는 함수가 필요하여 작성하였습니다.