profile image

L o a d i n g . . .

Published 2020. 9. 9. 23:52
반응형

LayerMask

Raycasting은 무거운 작업이기 때문에 신중하게 사용해야 한다.

Mesh Collider를 사용하게 되면 연산 부하가 어마어마해진다. 그래서 복잡한 모델링의 경우, 대략적으로 표현할 수 있는 충돌용 Collider를 만들어서 처리한다. 그러나 오브젝트 개수가 늘어나고, 충돌 체크해야 하는 Collider가 늘어나다 보면 Raycasting 자체도 연산이 무거워질 수밖에 없다.

Raycasting의 예제로 살펴봤던 카메라 처리 같은 경우에는 환경 오브젝트만 처리하면 되고, 캐릭터의 이동 및 공격 처리는 바닥을 누르거나 상대 몬스터를 클릭했는지만 처리하면 된다. => Layer Mask 사용!

 

Layer Mask는 Bit Flag를 이용한다. 

if (Input.GetMouseButtonDown(0))
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);

    // Monster인 경우에만 Raycast
    //int mask = ((1 << 8) | (1 << 9));

    RaycastHit hit;
    if (Physics.Raycast(ray, out hit, 100.0f, LayerMask.GetMask("Monster")))
    {
        Debug.Log($"Raycast Camera @ {hit.collider.gameObject.name}");
    }
}

 

tag는 부가적인 정보를 주고 싶을 때 사용한다. 예를 들어서 Camera.main은 tag가 MainCamera인 Object를 찾아서 반환해 주는 것이다.

 

 

Camera

카메라가 플레이어를 따라가게끔 구현할 때, Update()에 코드를 넣으면 어떤 Update()가 먼저 호출될지 아무도 모른다. 나의 경우에는 화면이 덜컹거렸다.

이런 경우에는 Unity Life Cycle에서 Update()보다 늦게 호출되는 LateUpdate()에 코드를 구현하면 된다.

void LateUpdate()
{
    if (_mode == Define.CameraMode.QuarterView)
    {
        transform.position = _player.transform.position + _delta;
        transform.LookAt(_player.transform);
    }
}

LookAt 함수는 특정 오브젝트를 향할 때 사용한다.

반응형
복사했습니다!