문제 상황
게임에서 생성된 카드 인스턴스에 붙은 CardOpen
메소드가 작동하지 않는 문제가 발생했습니다.
진행한 과정과 결과
Raycast로 현재 찍고 있는 것이 무엇인지 파악
- 결과: 레이가 출력되지 않았습니다.
DrawRay로 확인
- 결과: Scene View에서 레이가 출력되지 않았습니다.
Sorting Layout 및 Order in Layer 순서 조정
- 결과: 문제 해결에 도움이 되지 않았습니다.
해결
문제 원인
2D 게임이기 때문에 Physics2D.Raycast
를 사용해야 하는데,
3D용 Physics.Raycast
를 사용해서 문제가 발생했습니다.
해결 방법
Physics.Raycast
를 Physics2D.Raycast
로 변경했습니다.
RaycastHit = Physics.Raycast(rayPos, Vector2.zero, 0f);
=> RaycastHit2D hit = Physics2D.Raycast(rayPos, Vector2.zero, 0f);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
public class Card : MonoBehaviour
{
public Animator anim;
void Update()
{
if (Input.GetMouseButtonDown(0)) // left mouse button
{
Vector2 rayPos =
Camera.main.ScreenToWorldPoint(Input.mousePosition);
// RaycastHit = Physics.Raycast(rayPos, Vector2.zero, 0f);
RaycastHit2D hit = Physics2D.Raycast(rayPos, Vector2.zero, 0f);
if (hit.transform.gameObject == gameObject)
{
Debug.Log("You clicked on: " + hit.transform.name);
OpenCard();
}
}
}
public void OpenCard()
{
Debug.Log("Click");
anim.SetBool("CardOpen", true);
transform.Find("Front").gameObject.SetActive(true);
transform.Find("Back").gameObject.SetActive(false);
}
}
2D / 3D 에 있어서 Raycast의 차이점
RaycastHit2D
와 RaycastHit
, Physics2D.Raycast
와 Physics.Raycast
는 Unity의 2D와 3D 물리 엔진 각각에 사용됩니다.
다음은 둘의 주요 차이점입니다
사용되는 공간
-
Physics.Raycast
: 3D 공간에서 사용됩니다. -
Physics2D.Raycast
: 2D 공간에서 사용됩니다.
콜라이더
-
Physics.Raycast
: 3D 콜라이더 (Collider
,MeshCollider
등)에 반응합니다. -
Physics2D.Raycast
: 2D 콜라이더 (Collider2D
,BoxCollider2D
등)에 반응합니다.
반환 타입
-
Physics.Raycast
:RaycastHit
객체를 반환하여 충돌 정보를 제공합니다. -
Physics2D.Raycast
:RaycastHit2D
객체를 반환하여 충돌 정보를 제공합니다.
레이어 마스크
- 둘 다 레이어 마스킹을 지원하지만, 각각의 레이어 마스크 설정은 2D와 3D에 따라 다릅니다.
충돌 정보
-
RaycastHit
은 3D 공간의 좌표, 표면의 노멀 벡터, 충돌한 콜라이더 등의 정보를 포함합니다. -
RaycastHit2D
은 2D 공간의 좌표, 표면의 노멀 벡터, 충돌한 콜라이더 등의 정보를 포함합니다.
성능
-
Physics2D.Raycast
는 일반적으로 2D 연산에 최적화되어 있어서 같은 조건에서 더 빠를 수 있습니다.
스크립트 내 사용법
-
Physics.Raycast
는 일반적으로 3D 게임 오브젝트와 상호작용할 때 사용됩니다. -
Physics2D.Raycast
는 2D 게임 오브젝트와 상호작용할 때 사용됩니다.
이러한 차이점들은 각각의 물리 엔진이 다르게 동작하도록 설계되었기 때문에 나타납니다.
따라서, 개발하고 있는 게임이 2D인지 3D인지에 따라 적절한 함수를 선택해야 합니다.