Unity Prefab不会实例化到游戏场景中

时间:2017-12-07 12:59:03

标签: c# inheritance unity3d instantiation

团结有点麻烦。我有两种不同的射击和移动系统构建,现在我将它们移植到一起,虽然我在做这个时遇到了一些问题。要求资产文件夹中的“子弹”预制件产生到游戏场景中,但从未出现过。但更有趣的是“子弹”和脚本的其他功能发生,所以只有预制才能在场景中显示。

以下是脚本中安装预制件的代码:

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;

}
}

两个单独的版本中的一切都是相同的,但它只是预制件的产生而不起作用。

非常感谢任何想法/建议。

1 个答案:

答案 0 :(得分:1)

从你的代码:

public Rigidbody cannonballInstance;

[...]

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

您正在实例化一个Rigidbody,我认为您希望实例化一个GameObject

尝试:

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