유니티 게임 개발(6)

Proffeine0327·2023년 5월 5일

Unity Basic Development

목록 보기
6/11

캐스트(Cast)

캐스트는 특정한 범위를 잡아서 특정한 오브젝트가 있는지 확인하는 코드이다. 3D의 경우 Physics, 2D는 Physics2D에서 사용할 수 있다.

저번 포스트에서 짠 코드는, 공중에서도 점프가 되는 문제가 있다. 땅에서만 점프를 할 수 있게 캐스트를 이용해서 코드를 수정해보자.

플레이어 밑쪽에 캐스트를 놓아서 땅을 감지하고,
만약 플레이어가 땅에 있다면 점프를 할 수 있게 할것이다.

먼저 땅을 감지하기 위해 땅 오브젝트에다가 Ground라는 레이어를 할당시키겠다.
땅을 클릭하고 Inspector창을 보면 오른쪽 위에 Layer라는 항목이 있다.

드롭다운을 클릭해보면 여러 레이어들이 있을텐데 Ground 레이어는 없으므로 Layer > Add Layer... 을 눌러 레이어 추가창을 열겠다.

레이어 슬롯중에 아무거나 Ground를 적고 저장을 하자.

다시 땅 오브젝트를 선택해서 Layer을 Ground로 설정하고, 코드를 수정하도록 하겠다.

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

public class Player : MonoBehaviour
{
    public float moveSpeed;
    public float jumpScale;
    
    //1)
    public Vector2 groundCastOffset;
    public Vector2 groundCastSize;

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        var h = Input.GetAxisRaw("Horizontal");
        var dir = new Vector2(h * moveSpeed, rb.velocity.y);

		//2
        if(Input.GetKeyDown(KeyCode.Space) && Physics2D.OverlapBox((Vector2)transform.position + groundCastOffset, groundCastSize, 0f, LayerMask.GetMask("Ground")))
            dir.y = jumpScale;

        rb.velocity = dir;
    }
}

1) 캐스트의 위치와 크기를 정할 Vector2 변수이다.

2) && 기호부터 보자. 포스트 (3)에서 조건문에 대하여 적었다. 만약 A와 B가 참일때, 또는 A또는 B가 참일때같은 연산을 할때는 논리곱 연산이라는 것을 해야한다.

&&(숫자7 + shift) 기호는 and라 불리며 A와 B가 둘다 참일때, ||(\ + shift) 기호는 or이라 불리며 A또는 B가 참일때의 연산을 한다. 코드에서는 and 연산이 있으므로 스페이스가 눌렸을때, 그리고 뒤의 코드가 참일때 if문으로 들어가는데 뒤의 코드를 알아보자.


Physics2D.OverlapBox((Vector2)transform.position + groundCastOffset, groundCastSize, 0f, LayerMask.GetMask("Ground"))

먼저 함수에 들어가는 변수가 눈에 띈다. 포스터 (3)에서의 함수항목에서 잠시 나왔었는데, 이를 파라미터(parameter) 또는 매개변수라 부른다. GetKeyDown에 들어간 KeyCode도 매개변수이다.

어쨋든 코드에서 보인 Physics2D.OverlapBox에는 총 4개의 매개변수가 보인다.

  1. 플레이어 오브젝트의 위치에 groundCastOffset이라는 변수를 더한 값을 넣었다.
    OverlapBox의 첫번째 매개변수는 네모모양의 캐스트의 중앙점을 넣는것으로, 박스 캐스트의 중앙점을 설정한 것이다. transform.position은 vector3라 vector2랑 연산을 시도하면 오류가 나므로 vector2로 변환해서 더해준다.

  2. groundCastSize 변수를 넣었다, 두번째 매개변수는 박스 캐스트의 중심점에서 좌우로 x만큼, 상하로 y만큼의 크기로 박스를 설정하였다.

  3. 0f를 넣었다. 박스를 돌리는 설정인데, 우리는 필요없으므로 0f를 넣었다.

  4. Ground 레이어만을 감지하기 위하여 LayerMask.GetMask 함수를 이용해서 레이어를 가져왔다.


박스 캐스트를 설정하였는데, 유니티에서는 박스캐스트를 볼 수 없다. 박스캐스트는 그저 감지만을 할 뿐이지, 직접적으로 표시를 하는 기능은 없다. 그래서 OnDrawGizmos라는 함수를 이용하여 캐스트를 보이게 할것이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float moveSpeed;
    public float jumpScale;
    public Vector2 groundCastOffset;
    public Vector2 groundCastSize;

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        var h = Input.GetAxisRaw("Horizontal");
        var dir = new Vector2(h * moveSpeed, rb.velocity.y);

        if(Input.GetKeyDown(KeyCode.Space) && Physics2D.OverlapBox((Vector2)transform.position + groundCastOffset, groundCastSize, 0f, LayerMask.GetMask("Ground")))
            dir.y = jumpScale;

        rb.velocity = dir;
    }

	//기즈모라고 부른다.
    private void OnDrawGizmos() 
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube((Vector2)transform.position + groundCastOffset, groundCastSize);    
    }
}

코드를 모두 짜고나면 Player 스크립트에 표시가 될것이다.
적당히 조정해서 플레이어 밑으로 캐스트가 위치하게 하면 된다.

profile
Programmer needs Caffeine / 공부하는 학생

0개의 댓글