본문 바로가기
공부/Unity 기초

3D FPS - 3 / 무기 제작

by svcbn 2022. 5. 18.

 

Ray(시선)를 이용해서 닿은곳에 총을 쏘고싶다.

 // 만약 마우스 왼쪽버튼을 누르면
        if (Input.GetButtonDown("Fire1"))
        {

            // 시선을 만들고
            Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);

            // 그 시선을 이용해서 바라봤는데 만약 닿은곳이 있다면?
            RaycastHit hitinfo;
            if (Physics.Raycast(ray, out hitinfo))
            {
                // 닿은곳에 총알자국을 가져다놓고싶다.
                bulletImpact.transform.position = hitinfo.point;

              
            }

        }

 

Ray : 시선 생성

RaycastHit : Ray가 닿은 판정인 곳

 

 

 

 

 

 

Ray가 나오는 위치를 정확하게 하기 위해 UI에 crosshair 추가

 

https://www.flaticon.com/free-icon/crosshair_1545215?term=crosshair&page=1&position=1&page=1&position=1&related_id=1545215&origin=search

 

Crosshair free icons designed by Freepik

Download now this vector icon in SVG, PSD, PNG, EPS format or as webfonts. Flaticon, the largest database of free icons.

www.flaticon.com

 

 

 

 

 

Bullet VFX 사용

https://assetstore.unity.com/packages/vfx/particles/war-fx-5669

 

War FX | 시각 효과 파티클 | Unity Asset Store

Add depth to your next project with War FX from Jean Moreno. Find this & more 시각 효과 파티클 on the Unity Asset Store.

assetstore.unity.com

 

 

 

 

 

 

VFX가 닿은 모든 면에 수직으로 발생하게 수정

if (Physics.Raycast(ray, out hitinfo))
            {
                // 닿은곳에 총알자국을 가져다놓고싶다.
                bulletImpact.transform.position = hitinfo.point;

                // 총알자국 VFX를 재생하고싶다.
                bulletImpact.Stop();
                bulletImpact.Play();

                // 총알자국의 방향을 닿은곳의 Normal방향으로 회전하고싶다.
                // = 총알자국의 forward방향과 닿은곳의 Normal방향을 일치시키고 싶다.
                bulletImpact.transform.forward = hitinfo.normal;

            }

 

 

 

Gun 전문

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// Ray를 이용해서 바라보고 닿은곳에 총을 쏘고싶다. (총알자국을 남기고싶다.)
public class Gun : MonoBehaviour
{
    // 총알자국
    public ParticleSystem bulletImpact;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // 만약 마우스 왼쪽버튼을 누르면
        if (Input.GetButtonDown("Fire1"))
        {

            // 시선을 만들고
            Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);

            // 그 시선을 이용해서 바라봤는데 만약 닿은곳이 있다면?
            RaycastHit hitinfo;
            if (Physics.Raycast(ray, out hitinfo))
            {
                // 닿은곳에 총알자국을 가져다놓고싶다.
                bulletImpact.transform.position = hitinfo.point;

                // 총알자국 VFX를 재생하고싶다.
                bulletImpact.Stop();
                bulletImpact.Play();

                // 총알자국의 방향을 닿은곳의 Normal방향으로 회전하고싶다.
                // = 총알자국의 forward방향과 닿은곳의 Normal방향을 일치시키고 싶다.
                bulletImpact.transform.forward = hitinfo.normal;

            }

        }

    }
}