같은편
홍익대 게임소프트웨어전공의 프로그래밍 단련 공간
같은편
깃허브 주소
https://github.com/madongchan
GitHub 아이콘
  • 분류 전체보기 (85)
    • 게임 프로그래밍 패턴 (2)
    • C# 프로그래밍 (26)
    • C++ 프로그래밍 (32)
      • 함수 (8)
      • 클래스 (22)
    • 알고리즘 공부 (2)
      • codingame 사이트 문제 (11)
    • 유니티엔진 - 게임 공부 (3)
    • 언리얼엔진 - 게임 공부 (4)
    • 쓸모 있을 수 있는 팁 (2)
    • 일상이야기 (3)

최근 댓글

태그

  • 탐욕 알고리즘
  • 언리얼
  • task
  • 언리얼엔진
  • 예외 처리
  • queue
  • C#
  • 람다식
  • 문제 풀이
  • 스레드
  • 클래스
  • 언리얼엔진4
  • 최단 경로
  • 함수
  • DFS
  • 복사 생성자
  • 알고리즘
  • c++
  • 비동기
  • 객체

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
같은편

홍익대 게임소프트웨어전공의 프로그래밍 단련 공간

레트로의 유니티 게임 프로그래밍 에센스 - 유니런 게임으로 새롭게 배운 점(at Trigger and Collision)
유니티엔진 - 게임 공부

레트로의 유니티 게임 프로그래밍 에센스 - 유니런 게임으로 새롭게 배운 점(at Trigger and Collision)

2022. 12. 8. 13:53

2D 플랫포머 게임 공부중인 화면

c++과 c# 책을 다 보고 난 후 유니티 게임 공부가 당겨서 다시 하는 중에 몰랐고 그래서 새롭게 알게 된 점을 작성해 보려 합니다.

제가 '이름표는 멈추지 않아!' 라는 2D 플랫포머 게임을 1년 이상 개발하고 구글 플레이 스토어에 런칭까지 하면서 2D 플랫포머 게임은 익숙해졌다고 생각했는데 개발하면서 알았으면 훨씬 좋았던 점을 책 보고 공부하면서 안 내용을 핵심만 작성해 보려고 합니다.


1. 트리거 

트리거는 두 (콜라이더 컴포넌트가 포함된)물체중 하나가 충돌할 때 하나 이상 Is Trigger가 체크돼있으면 발동되는 건 알 겁니다.

트리거는 콜리전과 달리 부딪힌 물체와 물리적인 상호작용이 아닌 닿았는지 아닌지만 판단합니다.

그러므로 콜라이더 안에 들어온 오브젝트에 대한 상대 게임오브젝트의 정보가 담겨있습니다.

저도 이걸 알고는 있었지만 그냥 이름 알아내거나 실제로 들어왔는지만 판단하고 응용할 생각은 못했는데

//총알 스크립트
public class Bullet : MonoBehaviour {
    public float speed = 8f; // 총알 이동 속력
    private Rigidbody bulletRigidbody; // 이동에 사용할 리지드바디 컴포넌트

    void Start() {
        // 게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 bulletRigidbody에 할당
        bulletRigidbody = GetComponent<Rigidbody>();
        // 리지드바디의 속도 = 앞쪽 방향 * 이동 속력
        bulletRigidbody.velocity = transform.forward * speed;

        // 3초 뒤에 자신의 게임 오브젝트 파괴
        Destroy(gameObject, 3f);
    }

    // 트리거 충돌 시 자동으로 실행되는 메서드
    void OnTriggerEnter(Collider other) {
        // 충돌한 상대방 게임 오브젝트가 Player 태그를 가진 경우
        if (other.tag == "Player")
        {
            // 상대방 게임 오브젝트에서 PlayerController 컴포넌트를 가져오기
            PlayerController playerController = other.GetComponent<PlayerController>();

            // 상대방으로부터 PlayerController 컴포넌트를 가져오는데 성공했다면
            if (playerController != null)
            {
                // 상대방 PlayerController 컴포넌트의 Die() 메서드 실행
                playerController.Die();
            }
        }
    }
}

위의 OnTriggerEnter 메소드 안에 있는 것처럼 Player가 가지고 있는 커스텀 컴포넌트(=스크립트, 유니티의 게임오브젝트는 컴포넌트로 이루어져 있고 스크립트도 다를바 없다)인 PlayerController를 가져와 멤버와 메소드를 쓸 수 있게 할 수 있다.

 

2.콜리전

콜리전은 나랑 물리적으로 부딪힌 오브젝트에 대한 정보가 담깁니다.

부딪힌 위치 위치, 상대와 나의 거리, 충격량, 상대의 정보 등등을 알려줍니다

OnCollision 계열의 이벤트 메서드는 여러 충돌 정보를 담는 Collision 타입의 데이터를 입력받습니다.

Collision 타입은 충돌 지점들의 정보를 담는 ContactPoint 타입의 데이터를 contacts라는 배열 변수로 제공하고

따라서 contacts 배열의 길이는 충돌 지점의 개수와 일치합니다.

사용 예시

1.

private void OnCollisionEnter2D(Collision2D collision)
    {
        // 첫번째 충돌 위치
        collision.contacts[0]
    }

 

2.

private void OnCollisionEnter2D(Collision2D collision)
    {
        // 플레이어가 첫번째 충돌지점인 바닥과 닿았는데
        // 충돌 표면의 방향(노말벡터)가 위쪽이며 경사가 너무 급하지 않은지 검사하는 코드
        if (collision.contacts[0].normal.y > 0.7f)
        {
            
        }
    }

아래 그림들은 충돌 표면의 방향에 따른 노말벡터 값입니다.

collision.contacts[0].normal.y = 1
collision.contacts[0].normal.x = 1

https://docs.unity3d.com/ScriptReference/Collision.html

 

 

Unity - Scripting API: Collision

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

구글에 유니티 Collision Type 속성에 대해서 검색해 보시면 더 다양한 내용이 나옵니다.

 

저작자표시 비영리 변경금지

'유니티엔진 - 게임 공부' 카테고리의 다른 글

유니티 프로젝트 추가시 .ignore가 적용되지 않는 이유  (0) 2024.03.26
Unity UnityAction  (0) 2023.04.05
    같은편
    같은편
    책을 통해 이때까지 블로그나 유튜브에서 얻었던 지식의 파편들을 정립하고 합쳐 단단한 발판으로 만들기 위한 블로그

    티스토리툴바