在Unity中实例化时传递参数

时间:2018-08-19 09:09:53

标签: c# unity3d

我在实例化参数时将参数传递给对象时遇到一些问题,让我对其进行更好的解释: 我统一制造了一个自动炮塔,它只是瞄准敌人并实例化一枚摧毁敌人的导弹。炮塔效果很好,我只在导弹方面有一些问题... 导弹是一个附带脚本的游戏对象,在此脚本中,我只有1个公共变量,类型为“ GameObject”,名称为“ target”,当(从炮塔脚本中)实例化导弹时,我设置了变量“目标”等于炮塔瞄准的敌人。 在启动功能(导弹脚本)中,我将导弹向“目标”旋转,并增加导弹的位置,可以击中敌人。

导弹脚本:

public GameObject target;
private Vector3 targetPosition;

// Use this for initialization
void Start () {
  transform.SetParent(GameObject.FindGameObjectWithTag("Canvas").transform);

    targetPosition = target.transform.position;

    //Rotation of the missile
    Vector3 difference = this.targetPosition - transform.position;
    float rotationZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
    transform.rotation = Quaternion.Euler(0.0f, 0.0f, rotationZ);
}

// Update is called once per frame
void Update () {
    // The step size is equal to speed times frame time.
    float step = 1.5f * Time.deltaTime;

    // Move our position a step closer to the target.
    transform.position += transform.right * step;
}

private void OnCollisionEnter2D(Collision2D collision)
{
    Destroy(collision.gameObject);
    Destroy(this.gameObject);
}

炮塔脚本

    public GameObject missile; //this is the missile prefab

    void OnTriggerEnter2D(Collider2D collision)
{
    if(collision.gameObject.tag == "enemy") //The turret is aiming an enemy
    {
        Target = collision.gameObject;
        StartCoroutine(openFire());
    }
}

    IEnumerator openFire()
{
        GameObject newMissile;

        newMissile = Instantiate(missile, this.transform.position, Quaternion.identity, GameObject.FindGameObjectWithTag("Canvas").transform);
        missile.GetComponent<missileScript>().target = Target;
        yield return new WaitForSeconds(1);

        if (Target != null)
            StartCoroutine(openFire());

}

一切正常,当我拥有多个炮塔时,就会出现问题:如果我有两个炮塔(炮塔A和炮塔B),并且同时两个炮塔都向两个不同的敌人射击,由于某些原因,这两种导弹都会有相同的目标。 因此,例如,如果炮塔“ A”向敌人“ 1”射击,而炮塔“ B”同时向敌人“ 2”射击,则两枚导弹都将朝同一敌人射击。

我希望我很清楚。对可能是什么问题有任何想法吗?

谢谢。

-----固定-----

我只是简单地将变量“ target”由public编辑为私有,然后将其设置为“ setter” public方法。 真诚的我不知道为什么它可以解决我的问题...

1 个答案:

答案 0 :(得分:2)

您要覆盖您的预制件:

missile = Instantiate(missile, ...)

您确实声明了GameObject newMissile,但您没有使用它。

第二:

if (Target != null)

如果目标不为空,您将重新启动OpenFire方法...但是您仍然实例化一颗导弹!您可能想要更改它。