상세 컨텐츠

본문 제목

유니티 레이캐스트로 총 맞은 곳에 이펙트(파티클) 생성하기

유니티/기능

by MJ_119 2024. 9. 11. 01:40

본문

Instantiate(gunTargetHit, raycastHit.point, Quaternion.LookRotation(raycastHit.normal));


총알이 맞은 표면의 정확한 위치에 이펙트를 배치하고, 그 표면에 수직으로 이펙트를 회전시킵니다.

 

raycastHit.point: 이 필드는 레이캐스트가 충돌한 정확한 지점을 나타냅니다. 따라서 이프렉트가 실제 충돌 지점에 생성됩니다.

 

Quaternion.LookRotation(raycastHit.normal): 이 부분은 이펙트의 회전을 설정합니다. raycastHit.normal은 충돌한 표면의 법선 벡터(표면에 수직인 방향)를 나타내며, 이 법선 방향을 기준으로 이펙트가 회전됩니다.

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayCast : MonoBehaviour
{
    [SerializeField] Camera mainCam;
    [SerializeField] float range = 100f;
    [SerializeField] float gunDamage = 30f;
    [SerializeField] ParticleSystem gunFlash;
    [SerializeField] GameObject gunTargetHit;

    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            GunFlash();
            Shoot();
        }
    }

    void GunTargetHit(RaycastHit raycastHit)
    {
        // 총 맞은 부위에 이펙트 생성
        //GameObject hitEffect = Instantiate(gunTargetHit, raycastHit.transform);
        GameObject hitEffect = Instantiate(gunTargetHit, raycastHit.point, Quaternion.LookRotation(raycastHit.normal));

        // 1초뒤 파티클 삭제
        Destroy(hitEffect, 1f);
    }

    void GunFlash()
    {
        gunFlash.Play();
    }

    void Shoot()
    {
        RaycastHit hit;
        if(Physics.Raycast(mainCam.transform.position, mainCam.transform.forward, out hit, range))
        {
            print(" hit : " + hit.transform.name);

            // 총 맞은 곳에 파티클 생성
            GunTargetHit(hit);

            //Raycast로 충돌한 오브젝트에서 EnemyHealth라는 컴포넌트를 찾아서, 그 컴포넌트를 가져옴.
            EnemyHealth target = hit.transform.GetComponent<EnemyHealth>();

            if (target == null)
            {
                return;
            }

            target.TakeDamage(gunDamage);
            print(target.Hp);

            
        }
    }
}

관련글 더보기