Home > Mobile >  rayHit.point Instantiates at 0 0 0 Unity
rayHit.point Instantiates at 0 0 0 Unity

Time:05-07

I made a Gun Script (using YT videos) and a Bullethole GameObject should Instantiate at the Position the RayCast hits an Object. But it is always at 0 0 0. I tried many thing but non work.

GameObject bulletHoleClone = Instantiate(bulletHole, rayHit.point, Quaternion.Euler(0, 180, 0));

Destroy(bulletHoleClone, bulletHoleTime);

Whole Code:

using TMPro;
using UnityEngine;

public class GunScript : MonoBehaviour
{
    //Gun Stats
    public int damage;
    public float timeBetweenShooting, spread, range, reloadTime, timeBetweenShots;
    public int magazineSize, bulletsPerTap;
    public bool allowHoldButton;
    int bulletsLeft, bulletsShot;
    private float normalSpread;

    //bools
    bool shooting, readyToShoot, reloading;

    //Graphics
    public CameraShake camShake;
    public float camShakeStrengh, camShakeDuration;
    public GameObject muzzleFlash, bulletHole;
    public TextMeshProUGUI text;
    public float muzzleFlashTime = 0.1f; //Will be deleted after there is an actual Effect and not a Box
    public float bulletHoleTime = 3f;

    //Refrences
    public Camera fpsCam;
    public Transform attackPoint;
    private RaycastHit rayHit;
    public LayerMask dafuqIsEnemey;
    private Rigidbody rb;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
        bulletsLeft = magazineSize;
        readyToShoot = true;
        normalSpread = spread;
    }

    private void Update()
    {
        MyInput();

        //Set Text to BulletAmount
        text.SetText(bulletsLeft   " / "   magazineSize);
    }

    private void MyInput()
    {
        if (allowHoldButton) shooting = Input.GetKey(KeyCode.Mouse0);
        else shooting = Input.GetKeyDown(KeyCode.Mouse0);

        if (Input.GetKeyDown(KeyCode.R) && bulletsLeft < magazineSize && !reloading) Reload();

        //PewPew
        if (readyToShoot && shooting && !reloading && bulletsLeft > 0)
        {
            bulletsShot = bulletsPerTap;
            Shoot();
        }

        if (rb.velocity.magnitude > 0)
            spread = normalSpread * 1.5f;
        else spread = normalSpread;

        if (Input.GetKey(KeyCode.LeftControl))
            spread = normalSpread * 2f;
        else spread = normalSpread;
        
    }

    private void Shoot()
    {
        readyToShoot = false;

        //Bullets go BRRRRRRRRRR
        float x = Random.Range(-spread, spread);
        float y = Random.Range(-spread, spread);

        //Calculate Direction with Spread
        Vector3 direction = fpsCam.transform.forward   new Vector3(x, y, 0);


        //Maybe Add that the Ray Isnt coming out of your Head. Instead make it apear on the GunTip
        if (Physics.Raycast(fpsCam.transform.position, direction, out rayHit, range, dafuqIsEnemey))
        {
            Debug.Log(rayHit.collider.name);

            if (rayHit.collider.CompareTag("Enemy"))
            {
                Debug.Log("Hit An Enemy");
                //rayHit.collider.GetComponent<ShootingAi>().TakeDamage(damage);
            }
        }

        //Shake Camera
        camShake.Shake(camShakeDuration, camShakeStrengh);

        //Graphics
        GameObject bulletHoleClone = Instantiate(bulletHole, rayHit.point, Quaternion.Euler(0, 180, 0));
        GameObject muzzleClone = Instantiate(muzzleFlash, attackPoint.position, Quaternion.identity);
        Destroy(muzzleClone, muzzleFlashTime);
        Destroy(bulletHoleClone, bulletHoleTime);

        Debug.Log(rayHit.point);

        bulletsLeft--;
        bulletsShot--;

        Invoke("ResetShot", timeBetweenShooting);

        if (bulletsShot > 0 && bulletsLeft > 0)
            Invoke("Shoot", timeBetweenShooting);
    }

    private void ResetShot()
    {
        readyToShoot = true;
    }

    private void Reload()
    {
        reloading = true;
        Invoke("ReloadFinished", reloadTime);
    }

    private void ReloadFinished()
    {
        bulletsLeft = magazineSize;
        reloading = false;
    }
}

CodePudding user response:

You're not hitting anything. You check to see if you hit something, and then spawn a bullet hole even if you didn't hit anything.

If you didn't hit anything, there isn't anywhere to put a bullet hole.

The problem is that you're using the raycast hit as a local variable, which allows you to use it outside of the scope where it's actually valid.

Delete rayHit from your class and define it in the raycast instead, like

out RaycastHit rayHit

then it should only be scoped for the if statement and you'll get a compiler error anywhere it's not valid.

This brings up a larger question about what do you do if it misses an enemy, or which layers you should be raycasting against. Personally I think you'd want to raycast against everything, then you can try to determine what you hit and what that means later. Only other really good alternative would be to raycast against enemies, then repeat that against objects if that misses, but it's a lot of overhead to keep spinning up the raycasting engine. You'd be better off firing against multiple layers and getting the layer off the collider.

PS too your spread is probably way, way too big. For values of spread, 0.01 is half a degree, 0.1 is five degrees, 1 is 45 degrees.

CodePudding user response:

Basically you need to Transform Direction e.g camTrans.TransformDirection. You can try this way

public class Raytest : MonoBehaviour
{
    public Camera fpsCam;
    public float maxDistance = 200f;
    public bool update;
    public GameObject objectToSpawn;
    private void Update()
    {
        if(!update) return;
        var camTrans = fpsCam.transform;
        if (Physics.Raycast(camTrans.position, camTrans.TransformDirection(Vector3.forward), out var hit, maxDistance))
        {
            Debug.DrawRay(camTrans.position, camTrans.TransformDirection(Vector3.forward) * hit.distance, Color.red);
            Debug.Log("Did Hit");
            var clone = Instantiate(objectToSpawn, hit.point, Quaternion.Euler(0, 180, 0));
            update = false;
        }
        else
        {
            Debug.DrawRay(camTrans.position, camTrans.TransformDirection(Vector3.forward) * 1000, Color.white);
            Debug.Log("Did not Hit");
        }
    }
}

enter image description here

After hitting raycast

enter image description here

  • Related