TIL(2024,05,10) Unity 기본 컴포넌트 이해

김보근·2024년 5월 10일

Unity

목록 보기
3/113

Unity 기본 컴포넌트 이해하기

SpriteRenderer

SpriteRenderer는 2D 이미지를 표현하는 컴포넌트입니다. 어떤 이미지를 표현할 것인지(Sprite), 이미지의 색상(Color), 이미지의 상하(FlipY)좌우(FlipX) 반전, 그리는 우선순위(Sorting, Order in Layer) 등을 설정할 수 있다.

Rigidbody2D


Rigidbody2D는 2D 게임에서 유니티 내부의 물리엔진을 기반으로 움직임을 시뮬레이션하는 용도로 쓰인다. 만약 우리가 직접 중력을 적용하는 것을 코드로 구현한다면, 물리 구현에 많은 시간을 빼앗기고, 정상적으로 구현하기 어렵다. 유니티에서 제공하는 Rigidbody 컴포넌트의 다양한 값들을 변경하여 우리가 원하는 형태를 시뮬레이션 할 수 있다.

XXXCollider2D


충돌이 일어나거나 특정 범위에 있는지 판단을 하는 데 활용하는 컴포넌트 이다. 물리 시뮬레이션과 같이 활용되어, 화살이 캐릭터에 맞았는지, 캐릭터가 포탈 위에 있는지와 같은 판단을 하기 위해 활용됩니다. Collider2D계열 컴포넌트가 달려있으면 충돌이 일어났을때 OnCollisonXXX2D 계열의 이벤트가 발생한다.

이를 통해, 충돌이 일어났는지, 충돌이 진행 중인지, 충돌이 끝났는 지 등을 이벤트로 알려주게된다.

XXX는 충돌체의 모양을 말함. 주로 Box, Circle, Capsule 콜라이더를 사용하고, Mesh나 Composite같은 복잡한 콜라이더 형태도 있다.

이제 간단한 게임을 만들어 볼것이다.

기본 컴포넌트를 활용한 간단한 게임 만들기

Ball 스크립트

public class Ball : MonoBehaviour
{
    // 공의 속도를 나타내는 변수
    public float speed;

    // Rigidbody2D 컴포넌트를 저장할 변수
    public Rigidbody2D rigidbody;

    // 게임 오브젝트가 활성화될 때 실행되는 함수
    void Start()
    {
        // Rigidbody2D 컴포넌트를 가져옴
        rigidbody = GetComponent<Rigidbody2D>();
        // 공을 발사하는 함수 호출
        Launch();
    }

    // 공을 발사하는 함수
    private void Launch()
    {
        // x 방향과 y 방향의 속도를 랜덤하게 설정
        // Random.Range(시작 숫자 , 끝 숫자(포함안됨))
        float x = Random.Range(0, 2) == 0 ? -1 : 1;
        float y = Random.Range(0, 2) == 0 ? -1 : 1;

        // rigidbody의 속도를 설정하여 공을 발사
        rigidbody.velocity = new Vector2(x * speed, y * speed);
    }

    // 공을 초기화하는 함수
    public void Reset()
    {
        // rigidbody의 속도를 0으로 설정하여 멈춤
        rigidbody.velocity = Vector2.zero;
        // 공의 위치를 원래 위치로 설정
        transform.position = Vector2.zero;
        // 공을 다시 발사하는 함수 호출
        Launch();
    }
}

Goal 스크립트

public class Goal : MonoBehaviour
{
    // 플레이어 1 골인지 여부를 나타내는 변수
    public bool isPlayer1Goal;
    
    // 게임 매니저를 저장할 변수
    private GameManager gameManager;

    // 게임 오브젝트가 활성화될 때 실행되는 함수
    private void Start()
    {
        // 게임 매니저를 가져와서 gameManager 변수에 저장
        gameManager = GameObject.Find("GameManager").GetComponent<GameManager>();
    }

    // 충돌이 발생했을 때 호출되는 함수
    private void OnTriggerEnter2D(Collider2D collision)
    {
        // 충돌한 객체가 "Ball"인 경우
        if(collision.name.Equals("Ball"))
        {
            // 만약 플레이어 1의 골이면
            if(isPlayer1Goal)
            {
                // "Player 2 Scored"를 출력
                Debug.Log("Player 2 Scored");
                // 게임 매니저의 Player2Scored 함수 호출하여 플레이어 2의 점수를 업데이트
                gameManager.Player2Scored();
            }
            // 플레이어 1의 골이 아닌 경우
            else
            {
                // "Player 1 Scored"를 출력
                Debug.Log("Player 1 Scored");
                // 게임 매니저의 Player1Scored 함수 호출하여 플레이어 1의 점수를 업데이트
                gameManager.Player1Scored();
            }
        }
    }
}

GameManager 스크립트

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    // 공을 나타내는 Ball 스크립트를 참조하는 변수
    [Header("Ball")]
    public Ball ball;

    // 플레이어 1을 나타내는 Paddle 스크립트와 Goal 스크립트를 참조하는 변수
    [Header("Player 1")]
    public Paddle player1Paddle;
    public Goal player1Goal;

    // 플레이어 2를 나타내는 Paddle 스크립트와 Goal 스크립트를 참조하는 변수
    [Header("Player 2")]
    public Paddle player2Paddle;
    public Goal player2Goal;

    // UI 텍스트를 나타내는 변수
    [Header("UI")]
    public TextMeshProUGUI player1Text;
    public TextMeshProUGUI player2Text;

    // 플레이어 1의 점수를 저장하는 변수
    private int player1Score;
    // 플레이어 2의 점수를 저장하는 변수
    private int player2Score;

    // 플레이어 1이 골을 넣었을 때 호출되는 함수
    public void Player1Scored()
    {
        // 플레이어 1의 점수를 1 증가시킴
        player1Score++;
        // UI에 플레이어 1의 점수를 업데이트
        player1Text.text = player1Score.ToString();
        // 게임 요소들을 초기 위치로 재설정
        ResetPosition();
    }

    // 플레이어 2가 골을 넣었을 때 호출되는 함수
    public void Player2Scored()
    {
        // 플레이어 2의 점수를 1 증가시킴
        player2Score++;
        // UI에 플레이어 2의 점수를 업데이트
        player2Text.text = player2Score.ToString();
        // 게임 요소들을 초기 위치로 재설정
        ResetPosition();
    }

    // 공과 패들들을 초기 위치로 재설정하는 함수
    private void ResetPosition()
    {
        // 공을 초기 위치로 재설정
        ball.Reset();
        // 플레이어 1의 패들을 초기 위치로 재설정
        player1Paddle.Reset();
        // 플레이어 2의 패들을 초기 위치로 재설정
        player2Paddle.Reset();        
    }
}

Paddle 스크립트

using UnityEngine;

public class Paddle : MonoBehaviour
{
    // 플레이어 1인지 여부를 나타내는 변수
    public bool isPlayer1;
    
    // 패들의 이동 속도를 나타내는 변수
    public float speed;
    
    // Rigidbody2D 컴포넌트를 저장할 변수
    public Rigidbody2D rigidbody;

    // 패들을 위로 이동하는 키
    public KeyCode Up;
    
    // 패들을 아래로 이동하는 키
    public KeyCode Down;

    // 패들의 이동량을 나타내는 변수
    private float movement;
    
    // 패들의 초기 위치를 저장하는 변수
    private Vector3 startPosition;

    // 게임 오브젝트가 활성화될 때 실행되는 함수
    void Start()
    {
        // 패들의 초기 위치를 startPosition 변수에 저장
        startPosition = transform.position;
        // Rigidbody2D 컴포넌트를 가져와서 rigidbody 변수에 저장
        rigidbody = GetComponent<Rigidbody2D>();
    }

    // 매 프레임마다 호출되는 함수
    void Update()
    {
        // 이동량 초기화
        movement = 0f;
        // 위 화살표 키가 눌렸을 때 이동량을 증가시킴
        if(Input.GetKey(Up)) { movement += 1f; }
        // 아래 화살표 키가 눌렸을 때 이동량을 감소시킴
        if(Input.GetKey(Down)) { movement -= 1f; }
        // 패들을 이동량에 따라 이동
        rigidbody.velocity = new Vector2(0, movement * speed);    
    }

    // 패들을 초기 위치로 재설정하는 함수
    public void Reset()
    {
        // 패들의 속도를 0으로 설정하여 멈춤
        rigidbody.velocity = Vector3.zero;
        // 패들의 위치를 초기 위치로 설정
        transform.position = startPosition;
    }
}

이렇게 스크립트를 셋팅을 하고

Ball을 만들것이다. 2D Object Square 을 만들고


이렇게 셋팅을 해준다.

Player 1도 2D Object Square 을 만들고

이렇게 셋팅을 하고 Player 2도 x값만 바꿔서 똑같이 만들어 주면 된다.

Player 1 Goal도 2D Object Square 을 만들고

이렇게 셋팅을 하고나서 Player 2 Goal도 복사를 한후에 -값을 없애서 반대편에도 만들어 준다.

이제 위의 벽을 만들어 줄것이다.

똑같이 2D Object Square 을 만들고


이렇게 셋팅을 하고 밑에도 있어야 하기 때문에 y값을 -붙여주게 되면 밑에 생성이 되게 된다.

이제 플레이어 점수를 만들것이다.

UI 부분에 Canvas를 선택하고

UI 에 Text - TextmeshPro를 선택한 후에 임포트 후

이렇게 만들고 Player2Score도 필요하니 x값에 있는 -를 없애주면 반대편에 생성이 된다.

Create Empty 를 만들어서 GameManager를 만들어 준후


게임 매니저를 셋팅한다.

완성된 모습은 이렇게 된다.

profile
게임개발자꿈나무

0개의 댓글