1
votes

Having a bit of trouble with unity. I have had two different builds for firing and movement systems, now I am porting them together although I encounter some issues when I do this. The 'bullet' prefab in the assets folder is asked to be spawned into the game scene but never is. But what is more intriguing is the other functions of the 'bullet' and script take place, so it is only the prefab not showing in the scene.

THe following is the code from the script which instaniates the prefab:

public bool isFiring; // Boolean to check if the player is firing
public bool isReloading = false; // Boolean to check if the player is reloading

public BulletController bullet; // Reference another script
public float bulletSpeed; // bullet speed - changed in bullet controller

public float timeBetweenShots; // time between shots can be fired
private float shotCounter; // Tempoary time holder - ensures no bullet spam

public Transform firePoint; // The fire point in the game attached to the gun

public static int ammoRemaining = 3; // Ammo left for the player to fire

public static int maxAmmo = 3;
public Text ammoText;

public Rigidbody cannonballInstance;
public BulletController projectile;

[Range(10f, 80f)]
public float angle = 45f;

// Use this for initialization
void Awake () {
    isReloading = false;
    timeBetweenShots = 0.3f;
    ammoRemaining = maxAmmo;
}

// Update is called once per frame
void Update () {

    if (ammoRemaining == 0 && isReloading == false)
    {
        StartCoroutine(Reload());

    }

    else if (isFiring == true && isReloading == false)
    {
        shotCounter -= Time.deltaTime;
        if(shotCounter <= 0 && ammoRemaining > 0 && isReloading == false)
        {
            shotCounter = timeBetweenShots;

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            RaycastHit hitInfo;
            if (Physics.Raycast(ray, out hitInfo))
            {
                FireCannonAtPoint(hitInfo.point);
            }

            ammoRemaining -= 1;
            ammoText.text = "Ammo:" + ammoRemaining;

        }


    }
    else if (Input.GetKey(KeyCode.R))
    {
        StartCoroutine(Reload());
    }

    else
    {
        shotCounter = 0;


    }

}

private void FireCannonAtPoint(Vector3 point)
{
    Vector3 randomAccuracy;

    randomAccuracy = new Vector3(Random.Range(-2.0f, 2f), 0, Random.Range(-2f, 2f));

    var velocity = BallisticVelocity(point + randomAccuracy, angle);
    Debug.Log("Firing at " + (point + randomAccuracy) + " velocity " + velocity);



    Rigidbody rg = Instantiate(cannonballInstance, transform.position, transform.rotation);
    Debug.Log("Firing at" + transform.position);
    Debug.Log(rg.transform);
    BulletController newProjectile = rg.GetComponent<BulletController>();

    newProjectile.speed = velocity;
    Debug.Log(newProjectile.speed);

    // cannonballInstance.transform.position = transform.position ;
    // cannonballInstance.velocity = velocity;
}

private Vector3 BallisticVelocity(Vector3 destination, float angle)
{
    Vector3 direction = destination - transform.position; // get Target Direction
    float height = direction.y; // get height difference
    direction.y = 0; // retain only the horizontal difference
    float distance = direction.magnitude; // get horizontal direction
    float AngleRadians = angle * Mathf.Deg2Rad; // Convert angle to radians
    direction.y = distance * Mathf.Tan(AngleRadians); // set direction to the elevation angle.
    distance += height / Mathf.Tan(AngleRadians); // Correction for small height differences

    // Calculate the velocity magnitude
    float velocity = Mathf.Sqrt(distance * Physics.gravity.magnitude / Mathf.Sin(2 * AngleRadians));
    Debug.Log(velocity);
    return velocity * direction.normalized; // Return a normalized vector.

}



public IEnumerator Reload()
{
    isReloading = true;
    ammoText.text = "REL...";

    yield return new WaitForSeconds(2);
    ammoRemaining = maxAmmo;
    isReloading = false;
    ammoText.text = "Ammo:" + ammoRemaining;

}
}

Everything is the same in the two seperate version but it just the spawning in of the prefab which doesn't work.

Any ideas/suggestions are much appreciated.

1

1 Answers

1
votes

From your code:

public Rigidbody cannonballInstance;

[...]

Rigidbody rg = Instantiate(cannonballInstance, transform.position, transform.rotation);

You are Instantiating a Rigidbody where I think you expect to instantiate a GameObject

try with:

Rigidbody rg = Instantiate(cannonballInstance.gameObject, transform.position, transform.rotation).GetComponent<Rigidbody>();