개발일지/Unity

[Unity] Prefabs, RayCast

초코보 2026. 5. 26. 18:49

[Prefabs]

언제든 재사용할 수 있는, 미리 만들어진 게임 오브젝트 에셋.

게임 오브젝트 + 컴포넌트 + 설정 등 값을 설계도처럼 저장하고 필요할 때마다 동일한 형태로 재사용할 수 있게 한다.

프리펩으로 사용할 게임 오브젝트를 하이어라키 창에서 프로젝트 창으로 드래그 앤 드랍.

프리펩 설정 변경 후 Overrides 창

Revert All(모두 되돌림): 인스턴스에 적용한 모든 변경 사항을 취소, 원본 프리펩의 원래 상태로 되돌린다.

Apply All(모두 적용): 씬에 배치된 프리펩의 변경 사항을 원본에 덮어쓴다. (다른 모든 오브젝트도 적용)

 

[Prefabs 생성/파괴와 관련된 메서드]

 

[InvokeRepeating]

특정 메서드를 지연 생성 후, 시간마다 반복 생성.

InvokeRepeating(메서드, 지연 시간, 반복 간격)
//실행 시, SpawnCoin 이름의 클래스를 1초 뒤 호출, 이후 2초 간격 반복 호출
InvokeRepeating(nameof(SpawnCoin), 1.0f, 2.0f);

 

[Instantiate]

실행 중 오브젝트 생성.

Instantiate(복제 대상, 복제 위치, 복제 방향);
//(총알 Prefab을, 총구 위치에서, 총구 방향으로 생성);
Instantiate(bulletPrefab, firePoint.Position, firePoint.rotation);


[Quaternion.identity]
//Instantiate를 통해 오브젝트를 생성할 때, 별개의 회전값 없이 생성
//(코인 Prefab을, spawnPos 위치에서, 회전 없이 생성)

Instantiate(coinPrefab, spawnPos, Quaternion.identity)

 

[Destroy]

오브젝트 파괴 기능

Destroy(gameObject); //게임 오브젝트 파괴
Destroy(gameObject, 시간); //게임 오브젝트를, 시간 뒤 삭제

 


 

[RayCast]

특정 위치에서 특정 방향으로 가상의 광선(Ray)을 쏴서, 광선이 어떤 오브젝트에 닿은지 검사.

광선의 길이는 무한하나, 보통은 거리를 제한해서 사용한다.

ex) 충돌 사전 감지, 상호작용, 바닥 체크, 시야 체크, 히트 스캔, 장애물 감지 등 사전 확인 용도로 사용된다.

Physics.RayCast(위치, 방향, RayCastHit 정보, 거리);
Physics.RayCast(origin, direction, out RayCastHit hit, distance);

  - hit.collider : 맞은 오브젝트의 collider 정보
  - hit.point : Ray가 맞은 위치
  - hit.normal : Ray가 맞은 표면의 법선벡터
  - hit.distance : Ray가 맞은 위치까지의 거리

 

[RaycastAll]

RayCast는 처음 맞은 오브젝트만 검사한다면,

RayCastAll은 경로상 광선에 닿은 모든 정보를 배열로 반환한다.

 

[Ray가 맞지 않을 때 체크할 사항]

- 맞추려는 오브젝트에 콜라이더가 있는지

- Ray 방향(direction)이 올바른지

- 거리(distance)가 충분한지

- 레이어마스크(필터)가 올바르게 설정되어 있는지

using UnityEngine;

public class RayCastBasic : MonoBehaviour
{
    private float horizontal;
    private float vertical;

    [SerializeField] private float moveSpeed = 5.0f;
    [SerializeField] private float rayDistance = 5.0f;

    void Update()
    {
        Move();

        //[Raycast]
        RaycastHit hit;
        //Ray 그리기(오브젝트 위치에서, 오브젝트가 바라보는 앞방향으로, rayDistance만큼의 빨간 광선을 쏜다)
        Debug.DrawRay(transform.position, transform.forward * rayDistance, Color.red);

        //현재 오브젝트 위치에서 현재 오브젝트가 바라보는 앞방향으로 rayDistance만큼 Ray를 쏜다)
        if(Physics.Raycast(transform.position, transform.forward,out hit, rayDistance))
        {
            Debug.Log(hit.collider.gameObject.name); //로그출력
        }

        //[RaycastAll] - 배열화
        RaycastHit[] hits = Physics.RaycastAll(transform.position, transform.forward, rayDistance);

        foreach(RaycastHit hit in hits)
        {
            Debug.Log("맞은 오브젝트: " + hit.collider.name);
        }
        Debug.DrawRay(transform.position, transform.forward * rayDistance, Color.red);
    }
    private void Move()
    {
        horizontal = Input.GetAxisRaw("Horizontal");
        vertical = Input.GetAxisRaw("Vertical");

        transform.Translate(Vector3.forward * vertical * moveSpeed * Time.deltaTime);
        transform.Translate(Vector3.right * horizontal * moveSpeed * Time.deltaTime);
    }
}

 

 

[함께 보면 좋은 내용]

더보기

[Slerp, Lerp]

부드러운 무브는 동일하나, 직선 보관과 회전 보관의 차이가 있다.

 

Slerp: 현재 회전에서, 목표 회전까지, 보관값 만큼 부드럽게 회전

ex) Quaternion smoothRotation = Quaternion.Slerp(rb.rotation, targetRotation, rotateSpeed * Time.fixedDeltaTime);

 

Lerp: 현재 위치에서, 목표 이동까지, 보관값 만큼 부드럽게 이동

ex) transform.position = Vector3.Lerp(transform.position, targetPosition, followSpeed * Time.deltaTime);

 

[Random]

범위 내에서 랜덤 값을 출력하는 클래스

ex) float spawn = Random.Range(최솟값, 최댓값);

 

[nameof()]

메서드명을 문자열로 자동 반환. 오타가 날 시 컴파일러가 오류를 보여준다(오류 찾기 쉬움) 

 

[Transform 클래스]

대상을 따라다니는 기능을 가진 컴포넌트. 카메라가 캐릭터를 따라다니게 할 때 등에 사용된다.

public Transform target;

 

[ [SerializeField] ]

인스펙터 노출 + 외부 접근 불가(직렬화)

[SerializeField] private float moveSpeed = 5.0f;
[SerializeField] private float rayDistance = 5.0f;
시리얼라이즈필드를 붙이면, private를 붙여도 인스펙터에 노출된다.

'개발일지 > Unity' 카테고리의 다른 글

[Unity] Find, Coroutine  (0) 2026.05.28
[Unity]Ray복습, UI, OverLap, Check  (0) 2026.05.27
[Unity]Rigidbody, Collider  (0) 2026.05.26
[Unity]이동, 회전  (0) 2026.05.26
[Unity]컴포넌트, 라이프 사이클  (0) 2026.05.20