총알의 기초 로직(3D)

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

public class Bullet : MonoBehaviour
{
    public LayerMask collisionMask; // 총알이 충돌할 수 있는 레이어 마스크
    public Color trailColor;        //총알 잔상 색

    float speed = 10;
    float damage = 1;

    float what_do_I_call_this_variable = 0.1f;  //적의 이동과 총알의 이동이 같은 프레임에서 일어나면 충돌이 안 되는 일을 보안 해주는 놈.

    private void Start()
    {
        Destroy(gameObject, 3f);

        // 총알이 생성된 위치에서 0.1f 반경 내에 충돌할 수 있는 물체가 있는지 확인
        Collider[] initialCollisions = Physics.OverlapSphere(transform.position, 0.1f, collisionMask);

        // 만약 생성 시점에 이미 충돌 물체와 겹쳐 있으면 OnHitObject 호출
        if (initialCollisions.Length > 0)   //총알이 생성 됐을 때 어떤 충돌체 오브젝트와 이미 겹친 상태일 때
            OnHitObject(initialCollisions[0], transform.position);

        GetComponent<TrailRenderer>().material.SetColor("_TintColor", trailColor);
    }

    void Update()
    {
        float moveDistance = speed * Time.deltaTime;          // 이동할 거리를 계산 (속도 * 프레임 시간)
        CheckCollisions(moveDistance);                        // 이동 경로에서 충돌 체크
        transform.Translate(Vector3.forward * moveDistance);  // 총알을 오른쪽으로 이동
    }

    /// <summary>
    /// 이동 거리 내에 충돌할 물체가 있는지 체크하는 함수
    /// </summary>
    void CheckCollisions(float moveDistance)
    {
        // 총알의 현재 위치에서 앞쪽으로 Raycast를 쏴서 충돌을 감지
        Ray ray = new Ray(transform.position, transform.forward);
        RaycastHit hit;

        // Ray가 충돌체를 감지하면 OnHitObject 호출
        if (Physics.Raycast(ray, out hit, moveDistance + what_do_I_call_this_variable, collisionMask, QueryTriggerInteraction.Collide))
            OnHitObject(hit.collider, hit.point);
    }

    /// <summary>
    /// 총알이 충돌한 물체에 대한 처리
    /// </summary>
    void OnHitObject(Collider c, Vector3 hitPoint)
    {
				//충돌 물체에 대한 처리(HP 감소 || 사망)
        Destroy(gameObject);   //총알 삭제
    }
}