- Home /
Why does my code works?
Yes, look at this:
float spreadX = Random.Range(-weaponSO.spread / 100, weaponSO.spread / 100);
float spreadY = Random.Range(-weaponSO.spread / 100, weaponSO.spread / 100);
Vector3 direction = originPoint.TransformDirection(spreadX, spreadY, 1);
if (Physics.Raycast(originPoint.transform.position, direction, out RaycastHit raycastHit, weaponSO.range))
{
direction = raycastHit.point - GameObject.Find("Muzzle").transform.position;
GameObject projectile = Instantiate(weaponSO.projectilePrefab, GameObject.Find("Muzzle").transform.position, Quaternion.identity);
projectile.transform.forward = direction;
projectile.GetComponent<Rigidbody>().AddForce(direction.normalized * weaponSO.projectileSpeed, ForceMode.Impulse);
projectile.GetComponent<Rigidbody>().AddForce(originPoint.transform.up * weaponSO.projectileUpwardSpeed, ForceMode.Impulse);
}
else
{
direction = GameObject.Find("Muzzle").transform.forward;
GameObject projectile = Instantiate(weaponSO.projectilePrefab, GameObject.Find("Muzzle").transform.position, Quaternion.identity);
projectile.transform.forward = direction;
projectile.GetComponent<Rigidbody>().AddForce(direction.normalized * weaponSO.projectileSpeed, ForceMode.Impulse);
projectile.GetComponent<Rigidbody>().AddForce(originPoint.transform.up * weaponSO.projectileUpwardSpeed, ForceMode.Impulse);
}
My question is, why does the spread still works once I define the new direction inside the raycast?
Thing is, i first pass the direction with the spread on
float spreadX = Random.Range(-weaponSO.spread / 100, weaponSO.spread / 100);
float spreadY = Random.Range(-weaponSO.spread / 100, weaponSO.spread / 100);
Vector3 direction = originPoint.TransformDirection(spreadX, spreadY, 1);
then, because I can shoot the sky, i define the new direction if I hit a collider here
if (Physics.Raycast(originPoint.transform.position, direction, out RaycastHit raycastHit, weaponSO.range))
{
direction = raycastHit.point - GameObject.Find("Muzzle").transform.position;
GameObject projectile = Instantiate(weaponSO.projectilePrefab, GameObject.Find("Muzzle").transform.position, Quaternion.identity);
projectile.transform.forward = direction;
projectile.GetComponent<Rigidbody>().AddForce(direction.normalized * weaponSO.projectileSpeed, ForceMode.Impulse);
projectile.GetComponent<Rigidbody>().AddForce(originPoint.transform.up * weaponSO.projectileUpwardSpeed, ForceMode.Impulse);
}
But the spread still works??????
The next lines are just to spawn the projectile on the muzzlelocation;
else
{
direction = GameObject.Find("Muzzle").transform.forward;
GameObject projectile = Instantiate(weaponSO.projectilePrefab, GameObject.Find("Muzzle").transform.position, Quaternion.identity);
projectile.transform.forward = direction;
projectile.GetComponent<Rigidbody>().AddForce(direction.normalized * weaponSO.projectileSpeed, ForceMode.Impulse);
projectile.GetComponent<Rigidbody>().AddForce(originPoint.transform.up * weaponSO.projectileUpwardSpeed, ForceMode.Impulse);
But I don't understand why if I shot a wall, the projectile will go exactly where my aim is but still respect the spread defined outside the raycast???
I did this sort of on a whim, because for some reason my spread was only working on one axis if I looked in a certain direction, but perfectly well if I looked in the positive or negative Z axis, so the "originPoint.TransformDirection" was the only thing that worked.
I want to understand my code.
Your answer
Follow this Question
Related Questions
Why does this script I got from the Unity Document site does not work? 1 Answer
Hit distance Change light range 1 Answer
how would i add bullet spread? 0 Answers
Click Once to play an entire animation 2 Answers
Make my gun model fire bullets 1 Answer