Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 유니티 Collision
- 유니티 ResourceManager
- Mathf.Clamp
- LayerMask
- 유니티 InputManager
- 유니티 오브젝트 풀링
- 유니티 시야 가림
- ML-Agents
- 유니티 리소스매니저
- 이진트리
- git-lfs
- c++
- Raycast
- 유니티 Vector3
- 오브젝트 풀링
- LFS
- eulerAngles
- unity
- 알고스팟
- 너비 우선 탐색
- InputManager
- LookRotation
- c++ 문자열 자르기
- 코드블럭 테마
- 유니티 머신러닝
- Quaternion.Euler
- 유니티 Rotate
- 깊이 우선 탐색
- 유니티
- 소스코드 줄번호
Archives
- Today
- Total
무민은귀여워
[유니티] 충돌 Collision / Trigger / Raycast / LayerMask 본문
반응형
1. 충돌 OnCollisionEnter
// 1) 나 혹은 상대한테 RigidBody 있어야 한다 (IsKinematic : off)
// 2) 나한테 Collider가 있어야 한다 (IsTrigger : off)
// 3) 상대한테 Collider가 있어야 한다 (IsTrigger : off)
private void OnCollisionEnter(Collision collision)
{
Debug.Log($"Collision @ {collision.gameObject.name} !");
}
2. 트리거 OnTriggerEnter
// 1) 둘 다 Collider가 있어야 한다
// 2) 둘 중 하나는 IsTrigger : on
// 3) 둘 중 하나는 RigidBody가 있어야 한다
private void OnTriggerEnter(Collider other)
{
Debug.Log($"trigger @ { other.gameObject.name} !");
}
주석외의 상황은 유니티 문서 참고
https://docs.unity3d.com/Manual/CollidersOverview.html
3. 투영 ( Local - World - Viewport - Screen )
Screen - 마우스 포인트에 해당하는 Screen 좌표 출력
* 화면에서 좌측하단이 (0, 0), 우측 상단으로 갈수록 값 증가
Debug.Log(Input.mousePosition); // Screen
ViewPort - 마우스 포인트에 해당하는 ViewPort좌표 출력
Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition)); // Viewport
월드공간은 아래 레이캐스트에서...
4. 레이캐스트 Raycast
카메라에서부터 좌클릭한 지점으로 레이캐스트를 이용해 부딪힌 오브젝트 출력
1. 첫번째 방법
Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane));
Vector3 dir = mousePos - Camera.main.transform.position;
dir = dir.normalized;
Debug.DrawRay(Camera.main.transform.position, dir * 100.0f, Color.red, 1.0f);
RaycastHit hit;
if (Physics.Raycast(Camera.main.transform.position, dir, out hit, 100.0f))
{
Debug.Log($"Raycast Camera @ {hit.collider.gameObject.name}");
}
2. 두번째 방법
// 2. 두번째 방법
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f))
{
Debug.Log($"Raycast Camera @ {hit.collider.gameObject.name}");
}
5. LayerMask
레이어를 지정해, 원하는 레이어에서만 레이캐스트 동작하게끔 한다
ex) Add Layer로 8번 "Monster" 9번 "Wall" 추가
// 1. 비트연산으로 mask 확인
int mask = (1 << 8) | (1 << 9);
// 2. 이름으로 mask 확인
LayerMask mask = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall");
// 2. 두번째 방법 (mask 추가)
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);
LayerMask mask = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall");
//int mask = (1 << 8) | (1 << 9);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
Debug.Log($"Raycast Camera @ {hit.collider.gameObject.name}");
}
* Tag 태그도 레이어마스크 비슷하게 지정해서 사용 가능
반응형
'IT > Unity' 카테고리의 다른 글
[유니티] 오브젝트 풀링 (0) | 2022.05.24 |
---|---|
[유니티] 시야를 가리는 물체 판별 및 카메라 이동 (0) | 2022.05.19 |
[유니티] ResourceManager (0) | 2022.05.17 |
[유니티] InputManager (0) | 2022.05.17 |
[유니티] 회전 rotation (0) | 2022.05.16 |
Comments