Unity Ray를 통한 Object 크기 조정

이시율·2025년 7월 4일

Unity 에서 레이저를 발사하여 벽에 닿으면 크기가 줄어들게 끔 구현하기 위해 UniTask를 이용하도록 코드를 작성하였다.

public async UniTaskVoid Beam(CancellationToken token)
    {
        float timer = 0f;
        while (timer < duration)
        {
            Vector3 playerPos = PlayerSkillManager.Instance.transform.position;
            Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            mousePos.z = 0f;
            .
            .
            .
            RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.up, transform.localScale.y, LayerMask.GetMask("Obstacle")); // 벽에 닿을 경우 길이 조정
            if (hit.collider != null)
            {
                Vector3 scale = transform.localScale;
                scale.y = hit.distance;
                transform.localScale = scale;
            }
            else
            {
                Vector3 scale = transform.localScale;
                scale.y = tempScale.y;
                transform.localScale = scale;
            }

            timer += Time.deltaTime;
            await UniTask.Yield(token);
        }

위 코드는 ray의 길이를 object의 loaclScale.y에 맞도록 설정하며,
object의 scale y값을 ray의 hit distance 길이로 바꾸게 하였다.

해당 코드로 실행 시 오브젝트를 움직였을 때 작아졌다가 다시 원래의 크기로 돌아가는 문제가 발생한다.
처음에는 ray가 확인하는 프레임이 맞지 않아 발생하는 것으로 추측하여 Update로 변경해보았으나 결과는 똑같았다.

이후 ray의 길이가 같이 작아지면서 맞지 않는 문제로 추측되어 코드를 아래와 같이 변경하였다.

void FixedUpdate()
    {
        Beam();
    }

    void Beam()
    {
        if (isAttack)
        {

            if (timer >= duration - 0.5f) GetComponent<Animator>().SetInteger("Elemental", -1);

			.
            .
            .
            Debug.DrawRay(transform.position, transform.up * distance, Color.red);
            RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.up, distance, layerMask); // 벽에 닿을 경우 길이 조정
            if (hit.collider != null)
            {
                scale.y = hit.distance * 5;
            }
            transform.localScale = scale;

            timer += Time.deltaTime;

ray의 길이는 기존 오브젝트의 길이를 유지하고 ray가 맞았을 때 hit.distance 만큼 object의 localScale.y값을 키워주었다.

테스트를 통해 정상 작동을 확인하였다.

0개의 댓글