Question by
coldfire1500 · Jan 17, 2021 at 04:39 PM ·
3dshootingweapon
weapon Spread
Hi, I've been trying to make this work but couldn't. What I'm aiming for is a bullet spread using raycasts but they change if your current action is moving, walking or not walking, as for it dreceases for each one. It works if I manually type the input axis in the weapon script, however, if I don't and use public bools from the character script like "isWalking" or "isRunning" it gives me a null error. So I'd like to know what are the solutions for this.
using UnityEngine;
public class PlayerScript : MonoBehaviour {
[Header("CHARACTER CONTROLLER")]
public CharacterController characterController;
[Header("MOVEMENT")]
public float walkSpeed = 12f;
public float sprintSpeed = 22f;
Vector3 velocity;
public bool isWalking;
public bool isSprinting;
void Start() {
characterController = GetComponent<CharacterController>();
}
void Update() {
Move();
}
void Move() {
//PlayerInput
float moveX = Input.GetAxisRaw("Horizontal");
float moveZ = Input.GetAxisRaw("Vertical");
bool sprint = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
isSprinting = sprint;
//Move
if(isWalking) {
Vector3 move = transform.right * moveX + transform.forward * moveZ;
characterController.Move(move * moveSpeed * Time.deltaTime);
}
//Sprint
if(isSprinting && isGrounded) {
moveSpeed = sprintSpeed;
} else {
moveSpeed = walkSpeed;
isWalking = true;
}
}
and the weapon Script where I mention this is
RaycastHit hit; //shoot and hit stuff
//Spread
Vector3 shootDirection = shootPoint.transform.forward;
if(player.isSprinting) {
shootDirection = shootDirection + shootPoint.TransformDirection(new Vector3(
Random.Range(-SprintspreadFactor, SprintspreadFactor),
Random.Range(-SprintspreadFactor, SprintspreadFactor)));
} else if(player.isWalking) {
shootDirection = shootDirection + shootPoint.TransformDirection(new Vector3(
Random.Range(-WalkingspreadFactor, WalkingspreadFactor),
Random.Range(-WalkingspreadFactor, WalkingspreadFactor)));
} else {
shootDirection = shootDirection + shootPoint.TransformDirection(new Vector3(
Random.Range(0, 0),
Random.Range(0, 0)));
}
//hitting Something
if(Physics.Raycast(shootPoint.position, shootDirection, out hit, range)) {
GameObject hitParticlesEffect = (GameObject)Instantiate(hitParticles, hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)); //Instantiate the wall hitParticles
GameObject bulletHole = (GameObject)Instantiate(bulletImpact, hit.point, Quaternion.FromToRotation(Vector3.forward, hit.normal)); //Instantiate the wall bulletHole
Destroy(bulletHole, 2f);
//DealDamage
if(hit.transform.GetComponent<HealthController>()) {
hit.transform.GetComponent<HealthController>().ApplyDamage(damage);
}
SpawnBulletTrail(hit.point);
}
Comment